FVPROC.CPP
//THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF  
//ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO  
//THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A  
// PARTICULAR PURPOSE. 
// 
// Copyright 1994 - 1998 Microsoft Corporation.  All Rights Reserved. 
// 
//PROGRAM:FVPROC.CPP 
// 
//PURPOSE:  Window procedures for main window and About box of the 
// sample FileViewer for text files. 
// 
//PLATFORMS:Windows 95 
// 
//SPECIAL INSTRUCTIONS: N/A 
// 
//Always include the master FileViewer source include file here. 
#include "fileview.h" 
 
// 
//   FUNCTION:  FileViewerFrameProc 
// 
//   PURPOSE:  Standard window procedure for the text file viewer frame window. 
//  Processes menu commands, acclerators, and handles resizing of 
//  the window   
// 
long WINAPI FileViewerFrameProc(HWND hWnd, UINT iMsg, WPARAM wParam 
    , LPARAM lParam) 
    { 
    LONG            lRet; 
    PCFileViewer    pObj; 
    LPTOOLTIPTEXT   pTTT; 
 
    //This is invalid until WM_NCCREATE is called. 
    pObj=(PCFileViewer)GetWindowLong(hWnd, FVWL_OBJECTPOINTER); 
 
    switch (iMsg) 
        { 
        case WM_NCCREATE: 
            //Save the the CFileViewer object pointer we're passed 
            lRet=(LONG)((LPCREATESTRUCT)lParam)->lpCreateParams; 
            SetWindowLong(hWnd, FVWL_OBJECTPOINTER, lRet); 
            return DefWindowProc(hWnd, iMsg, wParam, lParam); 
 
        case WM_COMMAND: 
            pObj->OnCommand(LOWORD(wParam), HIWORD(wParam), (HWND)lParam); 
            break; 
 
        case WM_NOTIFY: 
             // The toolbar, created with TBSTYLE_TOOLTIPS, will 
             // send notifications for each button.  lParam will 
             // be an LPTOOLTIPTEXT in such a case, but even when 
             // the structure is something different it will always 
             // have a hdr field of type NMHDR as the first field 
             // which we use to see if it comes from the toolbar. 
             // The notification we want is TTN_NEEDTEXT. 
            pTTT=(LPTOOLTIPTEXT)lParam; 
 
            if (NULL==pTTT) 
                return 0L; 
 
            if (TTN_NEEDTEXT==pTTT->hdr.code) 
                pTTT->lpszText=pObj->PszToolTip(pTTT->hdr.idFrom); 
 
            return 0L; 
 
 
        case WM_CLOSE: 
            DestroyWindow(hWnd); 
            break; 
 
    case WM_DESTROY: 
            if (NULL != pObj) 
            { 
                ODSu("FileViewerFrameProc Quit? ", pObj->m_fPostQuitMsg); 
                if (pObj->m_fPostQuitMsg) 
                    PostQuitMessage(0); 
                pObj->m_fPostQuitMsg = TRUE;    // One shot that it did not... 
 
                if (pObj->m_hWnd == hWnd) 
                    pObj->m_hWnd = NULL;        // Don't try to destory this again... 
            } 
            break; 
 
        case WM_SIZE: 
            //Resize frame tools and viewport 
            pObj->ChildrenResize(); 
            break; 
 
        case WM_MENUSELECT: 
            //Win32 Parameters are wItem, wFlags, and hMenu 
            pObj->m_pSH->MenuSelect(LOWORD(wParam) 
                , HIWORD(wParam), (HMENU)lParam); 
            break; 
 
        case WM_DROPFILES: 
            // We have a new file dropped on us so we need to pass this 
            // information back to the caller of the viewer... 
            pObj->DropFiles((HDROP)wParam); 
            break; 
 
        default: 
            return DefWindowProc(hWnd, iMsg, wParam, lParam); 
        } 
 
    return 0L; 
    } 
// 
//   FUNCTION:  ViewportWndProc 
// 
//   PURPOSE: Window procedure for the viewport window.  The viewport in 
//  this example just does draws the text into itself using an 
//  edit control.   
// 
//   COMMENTS: 
//   This will need to be modified for your file viewer. 
// 
long WINAPI ViewportWndProc(HWND hWnd, UINT iMsg, WPARAM wParam 
    , LPARAM lParam) 
    { 
    LONG            lRet; 
    PCFileViewer    pObj; 
    PAINTSTRUCT     ps; 
 
    //This is invalid until WM_NCCREATE is called. 
    pObj=(PCFileViewer)GetWindowLong(hWnd, VPWL_OBJECTPOINTER); 
 
    switch (iMsg) 
        { 
        case WM_NCCREATE: 
            //Save the the CFileViewer object pointer we're passed 
            lRet=(LONG)((LPCREATESTRUCT)lParam)->lpCreateParams; 
            SetWindowLong(hWnd, VPWL_OBJECTPOINTER, lRet); 
            return DefWindowProc(hWnd, iMsg, wParam, lParam); 
 
        case WM_PAINT: 
            BeginPaint(hWnd, &ps); 
 
            if (NULL!=pObj->m_hMemText) 
                { 
                LPSTR       psz; 
                RECT        rc; 
                HFONT       hFont; 
 
                GetClientRect(hWnd, &rc); 
 
                SetTextColor(ps.hdc, GetSysColor(COLOR_WINDOWTEXT)); 
                SetBkColor(ps.hdc, GetSysColor(COLOR_WINDOW)); 
                hFont=(HFONT)SelectObject(ps.hdc, pObj->m_hFont); 
 
                psz=(LPSTR)GlobalLock(pObj->m_hMemText); 
 
                 // We can use the client area rectangle here for 
                 // drawing since we also use DT_NOCLIP, so we'll 
                 // always draw all over the client area. 
                OffsetRect(&rc, -pObj->m_xPos, -pObj->m_yPos); 
                DrawText(ps.hdc, psz, -1, &rc, DT_LEFT 
                    | DT_NOCLIP| DT_EXPANDTABS); 
 
                GlobalUnlock(pObj->m_hMemText); 
                SelectObject(ps.hdc, hFont); 
                } 
            EndPaint(hWnd, &ps); 
            break; 
 
        case WM_MOUSEMOVE: 
             // If this message is already displayed, CStatusHelper 
             // will just ignore this call and return very fast. 
            pObj->m_pSH->MessageDisplay(ID_MSGCHOOSEOPEN); 
            break; 
 
        case WM_RBUTTONDOWN: 
            { 
            HMENU           hMenu, hMenuRes; 
            POINT           pt; 
            UINT            i, cItems; 
 
            //Load our context menu. 
            hMenuRes=LoadMenu(pObj->m_hInst 
                , MAKEINTRESOURCE(IDR_MENUVIEWPORT)); 
 
            if (NULL==hMenuRes) 
                break; 
 
             // Make a copy popup menu because you cannot 
             // use a resource-loaded menu with TrackPopupMenu. 
            cItems=GetMenuItemCount(hMenuRes); 
            hMenu=CreatePopupMenu(); 
 
            for (i=0; i < cItems; i++) 
                { 
                char    szItem[80]; 
                int     id, uFlags; 
 
                GetMenuString(hMenuRes, i, szItem, sizeof(szItem) 
                    , MF_BYPOSITION); 
                id=GetMenuItemID(hMenuRes, i); 
 
                uFlags=(0==id) ? MF_SEPARATOR : MF_STRING | MF_ENABLED; 
                AppendMenu(hMenu, uFlags, id, szItem); 
                } 
 
            DestroyMenu(hMenuRes); 
 
            pt.x=LOWORD(lParam); 
            pt.y=HIWORD(lParam); 
            ClientToScreen(hWnd, &pt); 
 
            //Messages sent to frame window from this menu. 
            TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON 
                , pt.x, pt.y, 0, pObj->m_hWnd, NULL); 
 
            DestroyMenu(hMenu); 
            } 
            break; 
 
        case WM_HSCROLL: 
        case WM_VSCROLL: 
            { 
            int             iTmp; 
            UINT            idScroll; 
            SCROLLINFO      si; 
 
            idScroll=(WM_HSCROLL==iMsg) ? SB_HORZ : SB_VERT; 
 
            si.cbSize = sizeof(SCROLLINFO); 
            si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; 
            GetScrollInfo(hWnd, idScroll, &si); 
 
            iTmp=si.nPos; 
 
            switch (LOWORD(wParam)) 
                { 
                case SB_LINEUP:     si.nPos -= 20;  break; 
                case SB_PAGEUP:     si.nPos -=si.nPage;  break; 
                case SB_LINEDOWN:   si.nPos += 20;  break; 
                case SB_PAGEDOWN:   si.nPos +=si.nPage;  break; 
 
                case SB_THUMBPOSITION: 
                case SB_THUMBTRACK: 
                    si.nPos=HIWORD(wParam); 
                    break; 
                } 
 
            si.nPos=max(si.nMin, min(si.nPos, si.nMax)); 
 
            if (si.nPos!=iTmp) 
                { 
                //Set the new position and scroll the window 
                SetScrollPos(hWnd, idScroll, si.nPos, TRUE); 
 
                if (SB_HORZ==idScroll) 
                    { 
                    pObj->m_xPos=si.nPos; 
                    ScrollWindow(hWnd, iTmp-si.nPos, 0, NULL, NULL); 
                    } 
                else 
                    { 
                    pObj->m_yPos=si.nPos; 
                    ScrollWindow(hWnd, 0, iTmp-si.nPos, NULL, NULL); 
                    } 
 
                UpdateWindow(hWnd); 
                } 
            } 
            break; 
 
        default: 
            return DefWindowProc(hWnd, iMsg, wParam, lParam); 
        } 
 
    return 0L; 
    } 
// 
//   FUNCTION: AboutProc 
// 
//   PURPOSE:  Dialog procedure for the omnipresent About box.  
// 
BOOL APIENTRY AboutProc(HWND hDlg, UINT iMsg, WPARAM wParam 
    , LPARAM lParam) 
    { 
    switch (iMsg) 
        { 
        case WM_INITDIALOG: 
            return TRUE; 
 
        case WM_COMMAND: 
            switch (LOWORD(wParam)) 
                { 
                case IDOK: 
                    EndDialog(hDlg, TRUE); 
                    break; 
                } 
            break; 
 
        case WM_CLOSE: 
            EndDialog(hDlg, FALSE); 
            break; 
        } 
    return FALSE; 
    }