MAIN.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:17k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //************************************************************************
  2. //**
  3. //**  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  4. //**  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
  5. //**  TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR
  6. //**  A PARTICULAR PURPOSE.
  7. //**
  8. //**  Copyright (C) 1993 - 1997 Microsoft Corporation. All Rights Reserved.
  9. //**
  10. //**  main.c
  11. //**
  12. //**  DESCRIPTION:
  13. //**     Performs window class registration, creations and message 
  14. //**     polling.
  15. //**
  16. //************************************************************************
  17. #include <windows.h>
  18. #include <windowsx.h>
  19. #include <mmsystem.h>
  20. #include <stdlib.h>
  21. #include <stdio.h>
  22. #define DECLARE_VARS
  23. #include "idfedit.h"
  24. /*+ ErrorBox ()
  25.  *
  26.  *  bring up a message box with a string from the stringtable
  27.  *
  28.  *-=================================================================*/
  29. #include <stdarg.h>
  30. int WINAPI ErrorBox (UINT wStringID, UINT wType, ...)
  31. {
  32.    char  szFormat[512];
  33.    char  szErr[512];
  34.    int   cbSize;
  35.    va_list va;
  36.    va_start (va, wType);
  37.    cbSize = LoadString (hInst, wStringID, szFormat, NUMELMS(szFormat));
  38.    if (!cbSize)
  39.       wsprintf (szErr, "Error %d", wStringID);
  40.    else
  41.       wvsprintf (szErr, szFormat, va);
  42.    va_end (va);
  43.    return MessageBox (hWndMain, szErr, szApp, wType);
  44. }
  45. /*+ GetWindowPosFromIni
  46.  *
  47.  * retrieve the window position information from IDFEDIT.ini
  48.  *
  49.  *-=================================================================*/
  50. static TCHAR cszProfile[] = TEXT ("MsIdfEd.ini");
  51. static TCHAR cszSection[] = TEXT ("General");
  52. static TCHAR cszWindow[]  = TEXT ("Window");
  53. static TCHAR cszWindowDef[] = TEXT ("");
  54. static TCHAR cszWindowFmt[] = TEXT ("%d,%d,%d,%d");
  55. BOOL WINAPI GetWindowPosFromIni (
  56.    LPRECT lprc)
  57.    {
  58.    TCHAR sz[100];
  59.    RECT  rcScreen;
  60.    RECT  rc;
  61.    GetPrivateProfileString (cszSection, cszWindow, cszWindowDef,
  62.                             sz, NUMELMS (sz), cszProfile);
  63.    if ( ! SystemParametersInfo (SPI_GETWORKAREA, 0, &rcScreen, FALSE))
  64.       {
  65.       rcScreen.top = rcScreen.left = 0;
  66.       rcScreen.right = 640;
  67.       rcScreen.bottom = 480;
  68.       }
  69.    sscanf (sz, cszWindowFmt,
  70.            &lprc->left, &lprc->top,
  71.            &lprc->right, &lprc->bottom);
  72.    if ( ! IntersectRect (&rc, &rcScreen, lprc))
  73.       *lprc = rcScreen;
  74.    return ! IsRectEmpty (lprc);
  75.    }
  76. /*+ SaveWindowPosToIni
  77.  *
  78.  * store the window position information in dragn.ini
  79.  *
  80.  *-=================================================================*/
  81. BOOL WINAPI SaveWindowPosToIni (
  82.    LPRECT lprc)
  83.    {
  84.    TCHAR sz[100];
  85.    wsprintf (sz, cszWindowFmt,
  86.             lprc->left,
  87.             lprc->top,
  88.             lprc->right - lprc->left,
  89.             lprc->bottom - lprc->top);
  90.    WritePrivateProfileString (cszSection, cszWindow, sz, cszProfile);
  91.    return TRUE;
  92.    }
  93. /*+ AboutDlgProc()
  94.  *
  95.  *  callback function for the about dialog
  96.  *
  97.  *-=================================================================*/
  98. BOOL CALLBACK AboutDlgProc (
  99.    HWND   hWnd,
  100.    UINT   wMsgID,
  101.    WPARAM wParam,
  102.    LPARAM lParam)
  103.    {
  104.    BOOL bRet = FALSE;
  105.                          
  106.    switch (wMsgID)
  107.    {                    
  108.       case WM_COMMAND:
  109.       {
  110.          UINT  uID     = GET_WM_COMMAND_ID(wParam, lParam);
  111.          //UINT Notify   = GET_WM_COMMAND_CMD(wParam, lParam);
  112.          //HWND hWndCtl  = GET_WM_COMMAND_HWND(wParam, lParam);
  113.          if (uID == IDOK || uID == IDCANCEL)
  114.          {   
  115.             EndDialog(hWnd, uID);
  116.             bRet = TRUE;
  117.          }
  118.          break;
  119.       }
  120.    }
  121.       
  122.    return bRet;
  123.    }
  124. /*+ GetActiveData
  125.  *
  126.  * helper function, gets data space from the active MDI child
  127.  * window
  128.  *
  129.  *-=================================================================*/
  130. static LPVOID GetActiveData ()
  131.    {
  132.    if (gs.pIDF && gs.pIDF->szFile[0])
  133.       return gs.pIDF;
  134.    return NULL;
  135.    }
  136. /*+
  137.  *
  138.  *-======================================================================*/
  139. STATICFN VOID WINAPI SetStandardCaption (VOID)
  140.    {
  141.    TCHAR sz[MAX_PATH + 20];
  142.    LoadString (hInst, IDS_CAPTION_BAR, sz, NUMELMS (sz));
  143.    lstrcat (sz, TEXT(" - "));
  144.    if (gs.szDefFile[0])
  145.       lstrcat (sz, gs.szDefFile);
  146.    else
  147.       {
  148.       UINT cb = lstrlen(sz);
  149.       LoadString (hInst, IDS_DEF_FILE_NAME, sz + cb, NUMELMS(sz) - cb);
  150.       }
  151.    SetWindowText (hWndMain, sz);
  152.    }
  153. /*+ SaveAndCloseHeader
  154.  *
  155.  *-======================================================================*/
  156. STATICFN BOOL SaveAndCloseHeader (
  157.    HWND hWnd,
  158.    BOOL bSaveAs)
  159.    {
  160.    LPIDFHEAD pIDF = gs.pIDF;
  161.    BOOL      bRet;
  162.    if (!pIDF)
  163.       return TRUE;
  164.    if (!pIDF->szFile[0])
  165.       bSaveAs = TRUE;
  166.    if (pIDF->bReadOnly)
  167.    {
  168.       ErrorBox (IDS_ERR_READONLY, EB_INFO, gs.szDefFile);
  169.       bSaveAs = TRUE;
  170.    }
  171.    if (bSaveAs)
  172.       {  
  173.       if (! PromptForIDFName(hWnd, gs.szDefFile, NULL, TRUE))
  174.          return FALSE;
  175.       }
  176.    else
  177.       lstrcpy (gs.szDefFile, pIDF->szFile);
  178.    if (!(bRet = SaveIDFToFile (pIDF, gs.szDefFile)))
  179.       ErrorBox (IDS_ERR_SAVE, EB_ERROR, gs.szDefFile);
  180.    SetStandardCaption();
  181.    return bRet;
  182.    }
  183. /*+ QuerySaveChanges
  184.  *
  185.  *-======================================================================*/
  186. BOOL QuerySaveChanges (
  187.    HWND hWnd,
  188.    BOOL bSetForeground)
  189.    {
  190.    UINT  idBtn;
  191.    DWORD dwEB = EB_YNC;
  192.    if (!gs.pIDF)
  193.       return TRUE;
  194.    if (bSetForeground)
  195.       dwEB |= MB_SETFOREGROUND;
  196.    idBtn = ErrorBox (IDS_QUERY_SAVE, dwEB, gs.pIDF->szFile);
  197.    if (idBtn == IDYES)
  198.       return SaveAndCloseHeader (hWnd, FALSE);
  199.    else if (idBtn == IDCANCEL)
  200.       return FALSE;
  201.    return TRUE;
  202.    }
  203. /*+ OpenHeader
  204.  *
  205.  *-======================================================================*/
  206. STATICFN LONG WINAPI OpenHeader (
  207.    HWND hWnd,
  208.    BOOL bPrompt)
  209.    {
  210.    TCHAR szFile[MAX_PATH];
  211.    TCHAR szTitle[MAX_PATH];
  212.    LPIDFHEAD pIDF;
  213.    pIDF = gs.pIDF = &gs.idf;
  214.    if (gs.idf.bChanged && ! QuerySaveChanges (hWnd, FALSE))
  215.       return 0;
  216.    FreeIDFFile (gs.pIDF);
  217.    szFile[0] = 0;
  218.    if (bPrompt)
  219.       {
  220.       if ( ! PromptForIDFName (hWnd, szFile, szTitle, FALSE))
  221.          return 0;
  222.       lstrcpy (gs.szDefFile, szFile);
  223.       LoadIDFFromFile (pIDF, szFile);
  224.       }
  225.    if (!pIDF->hWndHead)
  226.       {
  227.       RECT rc;
  228.       GetClientRect (hWnd, &rc);
  229.       pIDF->hWndHead = CreateWindowEx (fdwExStyle | WS_EX_NOPARENTNOTIFY,
  230.                                        cszHdrClass,
  231.                                        "",
  232.                                        WS_CHILD | WS_VISIBLE,
  233.                                        0, 0, rc.right, rc.bottom,
  234.                                        hWnd,
  235.                                        (HMENU)1,
  236.                                        hInst,
  237.                                        pIDF);
  238.       }
  239.    else
  240.       {
  241.       Head_RefreshTree (pIDF->hWndHead);
  242.       }
  243.    SetStandardCaption();
  244.    return (LONG)pIDF->hWndHead;
  245.    }
  246. /*+ MainCommands
  247.  *
  248.  *-=================================================================*/
  249. LONG WINAPI MainCommands (
  250.    HWND   hWnd,
  251.    WPARAM wParam,
  252.    LPARAM lParam)
  253.    {
  254.    LONG lRet     = 1;
  255.    WORD wID      = GET_WM_COMMAND_ID (wParam, lParam);
  256.    WORD wNotify  = GET_WM_COMMAND_CMD (wParam, lParam);
  257.    HWND hWndCtl  = GET_WM_COMMAND_HWND (wParam, lParam);
  258.    switch (wID)
  259.       {
  260.       case IDM_ABOUT:
  261.          return DialogBox (hInst,
  262.                            MAKEINTRESOURCE(IDD_ABOUT),
  263.                            hWnd,
  264.                            AboutDlgProc);
  265.          break;
  266.       case IDM_HELP:
  267.          ErrorBox (IDS_ERR_NOHELP, MB_OK);
  268.          break;
  269.       case IDM_FILEOPEN:
  270.          lRet = OpenHeader (hWnd, TRUE);
  271.          break;
  272.       case IDM_FILENEW:
  273.          lRet = OpenHeader (hWnd, FALSE);
  274.          if (gs.pIDF)
  275.          {
  276.             NewIDFInstrum (gs.pIDF, NULL, "<untitled>");
  277.             gs.pIDF->bChanged = FALSE;
  278.             Head_RefreshTree (gs.pIDF->hWndHead);
  279.          }
  280.          break;
  281.       case IDM_FILESAVE:
  282.       case IDM_FILESAVEAS:
  283.          lRet = SaveAndCloseHeader (hWnd, wID == IDM_FILESAVEAS);
  284.          if (lRet)
  285.          {
  286.             // Saving has the side effect of also closing the file
  287.             // so we need to re-open it after the save completes
  288.             //
  289.             LoadIDFFromFile (gs.pIDF, gs.szDefFile);
  290.          }
  291.          Head_RefreshTree (gs.pIDF->hWndHead);
  292.          break;
  293.       case IDM_NEW_INSTRUMENT:
  294.          NewIDFInstrum (gs.pIDF, NULL, "<untitled>");
  295.          Head_RefreshTree (gs.pIDF->hWndHead);
  296.          break;
  297.       case IDM_FILEEXIT:
  298.          PostMessage (hWnd, WM_CLOSE, 0, 0);
  299.          break;
  300.       //case IDM_EDITUNDO:
  301.       //   break;
  302.       case IDM_EDITCUT:
  303.       case IDM_EDITCOPY:
  304.          if (gs.pIDF && gs.pIDF->piSelect)
  305.             {
  306.             CopyInstrumToClip (gs.pIDF);
  307.             if (wID == IDM_EDITCUT)
  308.                DeleteInstrum (gs.pIDF);
  309.             }
  310.          break;
  311.       case IDM_EDITPASTE:
  312.          PasteInstrum (gs.pIDF);
  313.          break;
  314.       case IDM_EDITDELETE:
  315.          if (gs.pIDF && gs.pIDF->piSelect)
  316.             DeleteInstrum (gs.pIDF);
  317.          break;
  318.       }
  319.    return lRet;
  320.    }
  321. /*+ MainWndProc
  322.  *
  323.  *-=================================================================*/
  324. LRESULT CALLBACK MainWndProc (
  325.    HWND   hWnd,
  326.    UINT   wMsgID,
  327.    WPARAM wParam,
  328.    LPARAM lParam)
  329.    {
  330.    LONG  lRet = 0;         // return value from this routine
  331.    switch (wMsgID)
  332.       {
  333.       case WM_COMMAND:
  334.          lRet = MainCommands (hWnd, wParam, lParam);
  335.          break;
  336.       case WM_NOTIFY:
  337.          break;
  338.       case WM_SIZE:
  339.          if (gs.idf.hWndHead)
  340.             SetWindowPos (gs.idf.hWndHead, NULL,
  341.                           0, 0, LOWORD(lParam), HIWORD(lParam),
  342.                           SWP_NOZORDER);
  343.          break;
  344.       case WM_CREATE:
  345.          {
  346.          // send ourselves a command to create a document window.
  347.          //
  348.          PostMessage (hWnd, WM_COMMAND, IDM_FILEOPEN, 0);
  349.          }
  350.          break;
  351.       case WM_INITMENUPOPUP:
  352.          {
  353.          HMENU  hPopup = (HMENU)wParam;
  354.          UINT   uPos   = (UINT) LOWORD (lParam);
  355.          BOOL   fSystemMenu = HIWORD (lParam);
  356.          UINT   uFirstID;
  357.          // if this is for the system menu, go no further.
  358.          //
  359.          if (fSystemMenu)
  360.             break;
  361.          // if this is the 'File' popup, do menu initialization
  362.          //
  363.          uFirstID = GetMenuItemID (hPopup, 0);
  364.          if (uFirstID == IDM_FILENEW)
  365.             {
  366.             EnableMenuItem (hPopup, IDM_FILESAVE, gs.pIDF ? MF_ENABLED : MF_GRAYED);
  367.             EnableMenuItem (hPopup, IDM_FILESAVEAS, gs.pIDF ? MF_ENABLED : MF_GRAYED);
  368.             }
  369.          else if (uFirstID == IDM_EDITCUT)
  370.             {
  371.             BOOL bCanPaste = IsClipboardFormatAvailable(CF_RIFF);
  372.             BOOL bCanCut = (gs.idf.piSelect != NULL);
  373.             // BOOL bCanUndo = FALSE;
  374.             // EnableMenuItem (hPopup, IDM_EDITUNDO, bCanUndo ? MF_ENABLED : MF_GRAYED);
  375.             EnableMenuItem (hPopup, IDM_EDITCUT, bCanCut ? MF_ENABLED : MF_GRAYED);
  376.             EnableMenuItem (hPopup, IDM_EDITDELETE, bCanCut ? MF_ENABLED : MF_GRAYED);
  377.             EnableMenuItem (hPopup, IDM_EDITCOPY, bCanCut ? MF_ENABLED : MF_GRAYED);
  378.             EnableMenuItem (hPopup, IDM_EDITPASTE, bCanPaste ? MF_ENABLED : MF_GRAYED);
  379.             }
  380.          break;
  381.          }
  382.       case WM_CLOSE:
  383.       case WM_QUERYENDSESSION:
  384.          {
  385.          WINDOWPLACEMENT wpl;
  386.          if (gs.idf.bChanged &&
  387.              !QuerySaveChanges (hWnd, wMsgID == WM_QUERYENDSESSION))
  388.             break;
  389.          //
  390.          // before we shutdown, save the current size and position
  391.          // of the window to the INI file.
  392.          //
  393.          ZeroMemory (&wpl, sizeof(wpl));
  394.          wpl.length = sizeof(wpl);
  395.          GetWindowPlacement (hWnd, &wpl);
  396.          SaveWindowPosToIni (&wpl.rcNormalPosition);
  397.          lRet = DefWindowProc (hWnd, wMsgID, wParam, lParam);
  398.          break;
  399.          }
  400.       case WM_DESTROY:
  401.          // close the app (by causing an exit from the message loop)
  402.          PostQuitMessage (0);
  403.          break;
  404.       default:
  405.          lRet = DefWindowProc (hWnd, wMsgID, wParam, lParam);
  406.       }
  407.    return lRet;
  408.    }
  409. /*+ RegClasses ()
  410.  *
  411.  *  Registers all window classes that will be
  412.  *   used in this application.
  413.  *
  414.  *  Called from WinMain
  415.  *
  416.  *  returns: the return value of the call to RegisterClass ()
  417.  *          TRUE   if successful registration
  418.  *          FALSE  if registration failed
  419.  *
  420.  *-=================================================================*/
  421. static CONST TCHAR cszMainClass[] = "Main";
  422. extern LRESULT WINAPI ViewWndProc (HWND, UINT, WPARAM, LPARAM);
  423. BOOL WINAPI RegClasses (
  424.    HANDLE hInstance)
  425.    {
  426.    WNDCLASS  wc;
  427.    TCHAR     ach[2];
  428.    LoadString(hInstance, IDS_IS_RTL, ach, sizeof(ach)/sizeof(ach[0]));
  429.    fdwExStyle = (ach[0] == '1') ? WS_EX_LEFTSCROLLBAR | WS_EX_RIGHT | WS_EX_RTLREADING : 0;
  430.    //InitCommonControls();
  431.    // register the main window class
  432.    //
  433.    ZeroMemory (&wc, sizeof(wc));
  434.    wc.lpszClassName = cszMainClass;
  435.    wc.lpfnWndProc   = MainWndProc;
  436.    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
  437.    wc.hIcon         = LoadIcon (hInst, MAKEINTRESOURCE (IDR_MAIN));
  438.    wc.lpszMenuName  = MAKEINTRESOURCE (IDR_MAIN);
  439.    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
  440.    wc.hInstance     = hInstance;
  441.    if (!RegisterClass (&wc))
  442.        return FALSE;
  443.    // register the idf instrument window class
  444.    //
  445.    ZeroMemory (&wc, sizeof(wc));
  446.    wc.lpszClassName = cszHdrClass;
  447.    wc.lpfnWndProc   = HeadWndProc;
  448.    wc.style         = CS_VREDRAW | CS_HREDRAW  | CS_DBLCLKS;
  449.    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
  450.    wc.hIcon         = LoadIcon (hInst, MAKEINTRESOURCE (IDR_MAIN));
  451.    wc.lpszMenuName  = NULL;
  452.    wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE+1);
  453.    wc.hInstance     = hInstance;
  454.    if (!RegisterClass (&wc))
  455.        return FALSE;
  456.    ZeroMemory (&wc, sizeof(wc));
  457.    wc.lpszClassName = cszInstrumClass;
  458.    wc.lpfnWndProc   = ViewWndProc;
  459.    wc.style         = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
  460.    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
  461.    wc.hIcon         = LoadIcon (hInst, MAKEINTRESOURCE (IDR_INSTRUM));
  462.    wc.lpszMenuName  = NULL;
  463.    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
  464.    wc.hInstance     = hInstance;
  465.    if (!RegisterClass (&wc))
  466.        return FALSE;
  467.    return TRUE;
  468.    }
  469. /*+ CreateMainWindow ()
  470.  *
  471.  *  Creates the main window for the application.
  472.  *
  473.  *  Called from WinMain
  474.  *
  475.  *  returns:  a valid window handle if CreateWindow succeeds
  476.  *            or NULL if CreateWindow Fails
  477.  *
  478.  *-=================================================================*/
  479. HWND WINAPI CreateMainWindow (
  480.    int nCmdShow)
  481.    {
  482.    HWND   hWnd;
  483.    TCHAR  szTitle[100];
  484.    RECT   rc;
  485.    LoadString (hInst, IDS_CAPTION_BAR, szTitle, NUMELMS (szTitle));
  486.    // get x, y, cx, cy positions from ini files
  487.    //
  488.    if ( ! GetWindowPosFromIni (&rc))
  489.       rc.left = rc.right = CW_USEDEFAULT;
  490.    hWnd = CreateWindowEx (fdwExStyle,        // RTL style
  491.                        cszMainClass,         // class
  492.                        szTitle,              // title
  493.                        WS_OVERLAPPEDWINDOW,
  494.                        rc.left,
  495.                        rc.top,               // position: x,y
  496.                        rc.right,
  497.                        rc.bottom,            // size: width, height
  498.                        NULL,                 // parent
  499.                        NULL,                 // menu or child id
  500.                        hInst,                // instance
  501.                        NULL);                // params to pass on to WM_CREATE
  502.    if (hWnd)
  503.       ShowWindow (hWnd, nCmdShow);
  504.    return hWnd;
  505.    }
  506. /*+ WinMain ()
  507.  *
  508.  *-=================================================================*/
  509. int WINAPI WinMain (
  510.    HINSTANCE hInstance,
  511.    HINSTANCE hPrevInstance,
  512.    LPSTR lpszCmdLine,
  513.    int nCmdShow)
  514.    {
  515.    MSG     msg;      // temp for current message
  516.    HACCEL  hAccel;
  517.    // save off instance handle in a global. THIS MUST BE DONE FIRST!
  518.    // also load the application name into a global string
  519.    //
  520.    hInst = hInstance;
  521.    LoadString (hInst, IDS_APPNAME, szApp, NUMELMS (szApp));
  522.    // if this is not the first instance, register the class
  523.    // if class registration fails, put up a message box and quit
  524.    if (!RegClasses (hInstance))
  525.        return ErrorBox (IDS_ERR_REGCLASSES, EB_FATAL);
  526.    hAccel = LoadAccelerators (hInst, MAKEINTRESOURCE(IDR_MAIN));
  527.    // create the main window and save it's window handle in a global
  528.    // if the creation fails, put up a message box and quit.
  529.    //
  530.    hWndMain = CreateMainWindow (nCmdShow);
  531.    if ( !hWndMain)
  532.       return ErrorBox (IDS_ERR_CREATEMAIN, EB_FATAL);
  533.    // loop forever getting messages and dispatching them
  534.    // to the appropriate window.
  535.    //
  536.    while (GetMessage (&msg, NULL, 0,0))
  537.    {
  538.       if (TranslateAccelerator (hWndMain, hAccel, &msg))
  539.          continue;
  540.       TranslateMessage (&msg);
  541.       DispatchMessage (&msg);
  542.    }
  543.    // return the wParam of the last message (the QUIT message)
  544.    //
  545.    return msg.wParam;
  546.    }