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

Windows编程

开发平台:

Visual C++

  1. //THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
  2. //ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  3. //THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright  1994-1996  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. // PROGRAM: Comdlg32.c
  9. //
  10. // PURPOSE: Demonstrates how to manipulate the file open common dialog.
  11. //
  12. // PLATFORMS: Windows 95
  13. //
  14. // FUNCTIONS:
  15. // WinMain() - calls initialization function, processes message loop
  16. // InitApplication() - Initializes window data nd registers window
  17. // InitInstance() -saves instance handle and creates main window
  18. // MainWindProc() Processes messages
  19. // About() - Process menssages for "About" dialog box
  20. //       OpenTheFile() - Processes the File Open common dialog box
  21. //       ComDlg32DlgProc() - Hook procedure for GetOpenFileName() common dialog
  22. // TestNotify() - Processes the WM_NOTIFY function for ComDlg32DlgProc
  23. // ProcessCDError() - uses CommonDialogExtendedError() to output useful error 
  24. //       messages
  25. //
  26. // SPECIAL INSTRUCTIONS: N/A
  27. //
  28. #include <windows.h>    // includes basic windows functionality
  29. #include <commdlg.h>    // includes common dialog functionality
  30. #include <dlgs.h>       // includes common dialog template defines
  31. #include <cderr.h>      // includes the common dialog error codes
  32. #include "COMDLG32.h"   // includes application-specific information
  33. const char szmsgSHAREVIOLATION[] = SHAREVISTRING;  // string for sharing violation
  34. const char szmsgFILEOK[]         = FILEOKSTRING;   // string for OK button
  35. const char szCommdlgHelp[]       = HELPMSGSTRING;  // string for Help button
  36. UINT cdmsgShareViolation = 0;  // identifier from RegisterWindowMessage
  37. UINT cdmsgFileOK         = 0;  // identifier from RegisterWindowMessage
  38. UINT cdmsgHelp           = 0;  // identifier from RegisterWindowMessage
  39. typedef struct _MYDATA
  40. {
  41. char szTest1[80]; // a test buffer containing the file selected
  42. char szTest2[80];       // a test buffer containing the file path
  43. } MYDATA, FAR * LPMYDATA;
  44. HINSTANCE g_hInst; // the current instance
  45. MYDATA sMyData; // an instance of a MYDATA
  46.  
  47. //
  48. //  FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
  49. //
  50. //  PURPOSE: Entry point for the application.
  51. //
  52. //  COMMENTS:
  53. //
  54. // This function initializes the application and processes the
  55. // message loop.
  56. //
  57. int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
  58.     LPSTR lpCmdLine, int nCmdShow )
  59. {
  60.     MSG msg;                         
  61.     if (!InitApplication(hInstance))
  62.             return (FALSE);              
  63.     // Create the main window.
  64.     if (!InitInstance(hInstance, nCmdShow))
  65.         return (FALSE);
  66.     // Acquire and dispatch messages until a WM_QUIT message is received.
  67.     while (GetMessage(&msg,NULL,0,0))
  68.         {
  69.             TranslateMessage(&msg);    // Translates virtual key codes.
  70.             DispatchMessage(&msg);     // Dispatches message to window.
  71.         }
  72.     return (msg.wParam);           // Returns the value from PostQuitMessage.
  73. }
  74. //
  75. //  FUNCTION: InitApplication(HANDLE)
  76. //
  77. //  PURPOSE: Initializes window data and registers window class 
  78. //
  79. //  COMMENTS:
  80. //
  81. //       In this function, we initialize a window class by filling out a data
  82. //       structure of type WNDCLASS and calling the Windows RegisterClass()
  83. //       function.
  84. //
  85. BOOL InitApplication(HANDLE hInstance)       
  86. {
  87.     WNDCLASS  wc;
  88.     // Register the window class for my window.                                                           */
  89.     wc.style = 0;                       // Class style.
  90.     wc.lpfnWndProc = (WNDPROC)MainWndProc; // Window procedure for this class.
  91.     wc.cbClsExtra = 0;                  // No per-class extra data.
  92.     wc.cbWndExtra = 0;                  // No per-window extra data.
  93.     wc.hInstance = hInstance;           // Application that owns the class.
  94.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  95.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  96.     wc.hbrBackground = GetStockObject(WHITE_BRUSH); 
  97.     wc.lpszMenuName =  "Comdlg32Menu";   // Name of menu resource in .RC file. 
  98.     wc.lpszClassName = "Comdlg32WClass"; // Name used in call to CreateWindow.
  99.     return (RegisterClass(&wc));
  100. }
  101. //
  102. //   FUNCTION: InitInstance(HANDLE, int)
  103. //
  104. //   PURPOSE: Saves instance handle and creates main window 
  105. //
  106. //   COMMENTS:
  107. //
  108. //        In this function, we save the instance handle in a global variable and
  109. //        create and display the main program window.
  110. //
  111. BOOL InitInstance( HANDLE hInstance, int nCmdShow)           
  112. {
  113.     HWND            hWnd;              
  114. // Save off the handle to the current instance.
  115.     g_hInst = hInstance;
  116.     // Create a main window for this application instance. 
  117.     hWnd = CreateWindow(
  118.         "Comdlg32WClass",
  119.         "Common Dialog Sample Application",
  120.         WS_OVERLAPPEDWINDOW,            // Window style.
  121.         CW_USEDEFAULT,                  // Default horizontal position.
  122.         CW_USEDEFAULT,                  // Default vertical position.
  123.         CW_USEDEFAULT,                  // Default width.
  124.         CW_USEDEFAULT,                  // Default height.
  125.         NULL,                           // Overlapped windows have no parent.
  126.         NULL,                           // Use the window class menu.
  127.         g_hInst,                        // This instance owns this window.
  128.         NULL                            // Pointer not needed.
  129.     );
  130.     // If window could not be created, return "failure".
  131.     if (!hWnd)
  132.         return (FALSE);
  133.     // Register the window messages to receive.
  134.     cdmsgShareViolation = RegisterWindowMessage(szmsgSHAREVIOLATION);
  135.     cdmsgFileOK         = RegisterWindowMessage(szmsgFILEOK);
  136.     cdmsgHelp           = RegisterWindowMessage(szCommdlgHelp);
  137.     // Make the window visible; update its client area; and return "success".
  138.     ShowWindow(hWnd, nCmdShow);  
  139.     UpdateWindow(hWnd);          
  140.     return (TRUE);               
  141. }
  142. //
  143. //  FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG)
  144. //
  145. //  PURPOSE:  Processes messages for the main window.
  146. //
  147. //  MESSAGES:
  148. //
  149. // WM_CREATE - initialize window and create the MLE
  150. // WM_COMMAND - process the application menu
  151. // WM_SIZE - size the MLE in the main window
  152. // WM_DESTROY - post a quit message and return
  153. //
  154. //
  155. LONG APIENTRY MainWndProc( HWND hWnd, UINT message, UINT wParam, LONG lParam)
  156. {
  157. static HWND hwndEdit;
  158.     CHAR lpszHello[] = "Choose File Open from the Options menu for a demo.";
  159.     switch (message) {
  160.         case WM_CREATE:
  161. // Create an MLE for the file contents.
  162. hwndEdit = CreateWindow(
  163.                 "EDIT",     
  164. NULL,       
  165.                 WS_CHILD | WS_VISIBLE | WS_VSCROLL |
  166.                     ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
  167.                 0, 0, 0, 0, 
  168.                 hWnd,       
  169.                 (HMENU) ID_EDITCHILD, 
  170.                 (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),
  171.                 NULL);               
  172.             // Update the MLE. 
  173.             SendMessage(hwndEdit, WM_SETTEXT, 0, (LPARAM) lpszHello);
  174.             return 0;
  175.  
  176.         case WM_SIZE:
  177.             // Make the edit control the size of the window's client area. 
  178.             MoveWindow(hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);          
  179.             return 0;
  180.         case WM_COMMAND:           // message: command from application menu 
  181.             switch( LOWORD( wParam ))
  182.             {
  183.                 case IDM_FILEOPEN:
  184. // Call the FileOpen common dialog to open the file.
  185.                     OpenTheFile( hWnd, hwndEdit );
  186.                     break;
  187.                 case IDM_EXIT:
  188.                     PostQuitMessage(0);
  189.                     break;
  190.                 case IDM_ABOUT:
  191.                     DialogBox(g_hInst,
  192.                         MAKEINTRESOURCE(IDD_ABOUT),
  193.                         hWnd,           
  194.                         (DLGPROC)About);
  195.                     break;
  196.                 default:
  197.                     return (DefWindowProc(hWnd, message, wParam, lParam));
  198.             }
  199.             break;
  200.         case WM_DESTROY:                  // message: window being destroyed
  201.             PostQuitMessage(0);
  202.             break;
  203.         default:
  204.             return (DefWindowProc(hWnd, message, wParam, lParam));
  205.     }
  206.     return (0);
  207. }
  208. //
  209. //   FUNCTION: OpenTheFile(HWND hwnd, HWND hwndEdit)
  210. //
  211. //   PURPOSE: Invokes common dialog function to open a file and opens it.
  212. //
  213. //   COMMENTS:
  214. //
  215. // This function initializes the OPENFILENAME structure and calls
  216. //            the GetOpenFileName() common dialog function.  
  217. //
  218. //    RETURN VALUES:
  219. //        TRUE - The file was opened successfully and read into the buffer.
  220. //        FALSE - No files were opened.
  221. //
  222. //
  223. BOOL OpenTheFile( HWND hWnd, HWND hWndEdit )
  224. {
  225.     HANDLE hFile;
  226.     DWORD dwBytesRead;
  227. DWORD dwFileSize;
  228. OPENFILENAME OpenFileName;
  229. TCHAR         szFile[MAX_PATH]      = "";
  230. char *lpBufPtr;
  231.     strcpy( szFile, "");
  232. // Fill in the OPENFILENAME structure to support a template and hook.
  233. OpenFileName.lStructSize       = sizeof(OPENFILENAME);
  234.     OpenFileName.hwndOwner         = hWnd;
  235.     OpenFileName.hInstance         = g_hInst;
  236.     OpenFileName.lpstrFilter       = NULL;
  237.     OpenFileName.lpstrCustomFilter = NULL;
  238.     OpenFileName.nMaxCustFilter    = 0;
  239.     OpenFileName.nFilterIndex      = 0;
  240.     OpenFileName.lpstrFile         = szFile;
  241.     OpenFileName.nMaxFile          = sizeof(szFile);
  242.     OpenFileName.lpstrFileTitle    = NULL;
  243.     OpenFileName.nMaxFileTitle     = 0;
  244.     OpenFileName.lpstrInitialDir   = NULL;
  245.     OpenFileName.lpstrTitle        = "Open a File";
  246.     OpenFileName.nFileOffset       = 0;
  247.     OpenFileName.nFileExtension    = 0;
  248.     OpenFileName.lpstrDefExt       = NULL;
  249.     OpenFileName.lCustData         = (LPARAM)&sMyData;
  250. OpenFileName.lpfnHook     = ComDlg32DlgProc;
  251. OpenFileName.lpTemplateName    = MAKEINTRESOURCE(IDD_COMDLG32);
  252.     OpenFileName.Flags             = OFN_SHOWHELP | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLETEMPLATE;
  253. // Call the common dialog function.
  254.     if (GetOpenFileName(&OpenFileName))
  255.     {
  256. // Open the file.
  257. if ((hFile = CreateFile((LPCTSTR)OpenFileName.lpstrFile,
  258. GENERIC_READ,
  259. FILE_SHARE_READ,
  260. NULL,
  261. OPEN_EXISTING,
  262. FILE_ATTRIBUTE_NORMAL,
  263. (HANDLE)NULL)) == (HANDLE)-1)
  264. {
  265.      MessageBox( hWnd, "File open failed.", NULL, MB_OK );
  266.      return FALSE;
  267. }
  268. // Get the size of the file.
  269. dwFileSize = GetFileSize(hFile, NULL);
  270. if (dwFileSize == 0xFFFFFFFF)
  271. {
  272.      MessageBox( NULL, "GetFileSize failed!", NULL, MB_OK);
  273.      return FALSE;
  274. }
  275. // Allocate a buffer for the file to be read into.
  276. lpBufPtr = (char *)GlobalAlloc( GMEM_FIXED, dwFileSize );
  277. if (lpBufPtr == NULL)
  278. {
  279.      MessageBox( NULL, "GlobalAlloc failed!", NULL, MB_OK);
  280.      CloseHandle( hFile );
  281.      return FALSE;
  282. }
  283. // Read it's contents into a buffer.
  284. ReadFile(hFile,(LPVOID)lpBufPtr, dwFileSize, &dwBytesRead, NULL);
  285. if (dwBytesRead == 0)
  286. {
  287.      MessageBox( hWnd, "Zero bytes read.", NULL, MB_OK );
  288.      return FALSE;
  289. }
  290.         // Update the MLE with the file contents.
  291.         SendMessage(hWndEdit, WM_SETTEXT, 0, (LPARAM) lpBufPtr);
  292. // Close the file.
  293. CloseHandle(hFile);
  294. return TRUE;
  295.     }
  296.     else
  297.     {
  298. ProcessCDError(CommDlgExtendedError(), hWnd );
  299. return FALSE;
  300.     }
  301. }
  302. //
  303. //   FUNCTION: TestNotify( HWND hDlg, LPOFNOTIFY pofn)
  304. //
  305. //  PURPOSE:  Processes the WM_NOTIFY message notifications that is sent
  306. //    to the hook dialog procedure for the File Open common dialog.
  307. //
  308. //
  309. BOOL NEAR PASCAL TestNotify(HWND hDlg, LPOFNOTIFY pofn)
  310. {
  311. switch (pofn->hdr.code)
  312. {
  313. // The selection has changed. 
  314. case CDN_SELCHANGE:
  315. {
  316. char szFile[MAX_PATH];
  317. // Get the file specification from the common dialog.
  318. if (CommDlg_OpenSave_GetSpec(GetParent(hDlg),
  319. szFile, sizeof(szFile)) <= sizeof(szFile))
  320. {
  321. // Set the dialog item to reflect this.
  322. SetDlgItemText(hDlg, IDE_SELECTED, szFile);
  323. }
  324. // Get the path of the selected file.
  325. if (CommDlg_OpenSave_GetFilePath(GetParent(hDlg),
  326. szFile, sizeof(szFile)) <= sizeof(szFile))
  327. {
  328. // Display this path in the appropriate box.
  329. SetDlgItemText(hDlg, IDE_PATH, szFile);
  330. }
  331. }
  332. break;
  333. // A new folder has been opened.
  334. case CDN_FOLDERCHANGE:
  335. {
  336. char szFile[MAX_PATH];
  337. if (CommDlg_OpenSave_GetFolderPath(GetParent(hDlg),
  338. szFile, sizeof(szFile)) <= sizeof(szFile))
  339. {
  340. // Display this new path in the appropriate box.
  341. SetDlgItemText(hDlg, IDE_SELECTED, szFile);
  342. }
  343. }
  344. break;
  345. // The "Help" pushbutton has been pressed.
  346. case CDN_HELP:
  347. MessageBox(hDlg, "Got the Help button notify.", "ComDlg32 Test", MB_OK);
  348. break;
  349. // The 'OK' pushbutton has been pressed.
  350. case CDN_FILEOK:
  351. // Update the appropriate box.
  352. SetDlgItemText(hDlg,IDE_SELECTED, pofn->lpOFN->lpstrFile);
  353. SetWindowLong(hDlg, DWL_MSGRESULT, 1L);
  354. break;
  355. // Received a sharing violation.
  356. case CDN_SHAREVIOLATION:
  357. // Update the appropriate box.
  358. SetDlgItemText(hDlg, IDE_SELECTED, pofn->pszFile);
  359. MessageBox(hDlg, "Got a sharing violation notify.", "ComDlg32 Test", MB_OK);
  360. break;
  361. }
  362. return(TRUE);
  363. }
  364. //
  365. //   FUNCTION: ComDlg32DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  366. //
  367. //  PURPOSE:  Processes messages for the File Open common dialog box.
  368. //
  369. //    MESSAGES:
  370. //
  371. // WM_INITDIALOG - save pointer to the OPENFILENAME structure in User data
  372. // WM_DESTROY - get the text entered and fill in the MyData structure
  373. // WM_NOTIFY - pass this message onto the TestNotify function
  374. // default - check for a sharing violation or the OK button and
  375. //     display a message box.
  376. //
  377. //
  378. BOOL CALLBACK ComDlg32DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  379. {
  380. switch (uMsg)
  381. {
  382. case WM_INITDIALOG:
  383. // Save off the long pointer to the OPENFILENAME structure.
  384. SetWindowLong(hDlg, DWL_USER, lParam);
  385. break;
  386. case WM_DESTROY:
  387. {
  388. LPOPENFILENAME lpOFN = (LPOPENFILENAME)GetWindowLong(hDlg, DWL_USER);
  389. LPMYDATA psMyData = (LPMYDATA)lpOFN->lCustData;
  390. GetDlgItemText(hDlg, IDE_PATH, psMyData->szTest1, sizeof(psMyData->szTest1));
  391. GetDlgItemText(hDlg, IDE_SELECTED, psMyData->szTest2, sizeof(psMyData->szTest2));
  392. }
  393. break;
  394. case WM_NOTIFY:
  395. TestNotify(hDlg, (LPOFNOTIFY)lParam);
  396. default:
  397. if (uMsg == cdmsgFileOK)
  398. {
  399. SetDlgItemText(hDlg, IDE_SELECTED, ((LPOPENFILENAME)lParam)->lpstrFile);
  400. if (MessageBox(hDlg, "Got the OK button message.nnShould I open it?", "ComDlg32 Test", MB_YESNO)
  401. == IDNO)
  402. {
  403. SetWindowLong(hDlg, DWL_MSGRESULT, 1L);
  404. }
  405. break;
  406. }
  407. else if (uMsg == cdmsgShareViolation)
  408. {
  409. SetDlgItemText(hDlg, IDE_SELECTED, (LPSTR)lParam);
  410. MessageBox(hDlg, "Got a sharing violation message.", "ComDlg32 Test", MB_OK);
  411. break;
  412. }
  413. return FALSE;
  414. }
  415. return TRUE;
  416. }
  417. //
  418. //  FUNCTION: About(HWND, unsigned, WORD, LONG)
  419. //
  420. //  PURPOSE:  Processes messages for "About" dialog box
  421. //
  422. //  MESSAGES:
  423. //
  424. // WM_INITDIALOG - initialize dialog box
  425. // WM_COMMAND    - Input received
  426. //
  427. //
  428. BOOL APIENTRY About( HWND hDlg, UINT message, UINT wParam, LONG lParam)
  429. {
  430.     switch (message)
  431.     {
  432.         case WM_INITDIALOG:                
  433.             return (TRUE);
  434.         case WM_COMMAND:                      
  435.             if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
  436.             {        
  437.                 EndDialog(hDlg, TRUE);        
  438.                 return TRUE;
  439.             }
  440.             break;
  441.     }
  442.     return FALSE;                           
  443. }
  444. //
  445. //  FUNCTION: ProcessCDError(DWORD) 
  446. //
  447. //  PURPOSE: Processes errors from the common dialog functions.
  448. //
  449. //  COMMENTS:
  450. //
  451. //        This function is called whenever a common dialog function
  452. //        fails.  The CommonDialogExtendedError() value is passed to
  453. //        the function which maps the error value to a string table.
  454. //        The string is loaded and displayed for the user. 
  455. //
  456. //
  457. void ProcessCDError(DWORD dwErrorCode, HWND hWnd)
  458. {
  459.    WORD  wStringID;
  460.    TCHAR  buf[MAX_PATH];
  461.    switch(dwErrorCode)
  462.       {
  463.  case CDERR_DIALOGFAILURE:   wStringID=IDS_DIALOGFAILURE;   break;
  464.  case CDERR_STRUCTSIZE:      wStringID=IDS_STRUCTSIZE;      break;
  465.  case CDERR_INITIALIZATION:  wStringID=IDS_INITIALIZATION;  break;
  466.  case CDERR_NOTEMPLATE:      wStringID=IDS_NOTEMPLATE;      break;
  467.  case CDERR_NOHINSTANCE:     wStringID=IDS_NOHINSTANCE;     break;
  468.  case CDERR_LOADSTRFAILURE:  wStringID=IDS_LOADSTRFAILURE;  break;
  469.  case CDERR_FINDRESFAILURE:  wStringID=IDS_FINDRESFAILURE;  break;
  470.  case CDERR_LOADRESFAILURE:  wStringID=IDS_LOADRESFAILURE;  break;
  471.  case CDERR_LOCKRESFAILURE:  wStringID=IDS_LOCKRESFAILURE;  break;
  472.  case CDERR_MEMALLOCFAILURE: wStringID=IDS_MEMALLOCFAILURE; break;
  473.  case CDERR_MEMLOCKFAILURE:  wStringID=IDS_MEMLOCKFAILURE;  break;
  474.  case CDERR_NOHOOK:          wStringID=IDS_NOHOOK;          break;
  475.  case PDERR_SETUPFAILURE:    wStringID=IDS_SETUPFAILURE;    break;
  476.  case PDERR_PARSEFAILURE:    wStringID=IDS_PARSEFAILURE;    break;
  477.  case PDERR_RETDEFFAILURE:   wStringID=IDS_RETDEFFAILURE;   break;
  478.  case PDERR_LOADDRVFAILURE:  wStringID=IDS_LOADDRVFAILURE;  break;
  479.  case PDERR_GETDEVMODEFAIL:  wStringID=IDS_GETDEVMODEFAIL;  break;
  480.  case PDERR_INITFAILURE:     wStringID=IDS_INITFAILURE;     break;
  481.  case PDERR_NODEVICES:       wStringID=IDS_NODEVICES;       break;
  482.  case PDERR_NODEFAULTPRN:    wStringID=IDS_NODEFAULTPRN;    break;
  483.  case PDERR_DNDMMISMATCH:    wStringID=IDS_DNDMMISMATCH;    break;
  484.  case PDERR_CREATEICFAILURE: wStringID=IDS_CREATEICFAILURE; break;
  485.  case PDERR_PRINTERNOTFOUND: wStringID=IDS_PRINTERNOTFOUND; break;
  486.  case CFERR_NOFONTS:         wStringID=IDS_NOFONTS;         break;
  487.  case FNERR_SUBCLASSFAILURE: wStringID=IDS_SUBCLASSFAILURE; break;
  488.  case FNERR_INVALIDFILENAME: wStringID=IDS_INVALIDFILENAME; break;
  489.  case FNERR_BUFFERTOOSMALL:  wStringID=IDS_BUFFERTOOSMALL;  break;
  490.  case 0:   //User may have hit CANCEL or we got a *very* random error
  491.     return;
  492.  default:
  493.     wStringID=IDS_UNKNOWNERROR;
  494.       }
  495.    LoadString(NULL, wStringID, buf, sizeof(buf));
  496.    MessageBox(hWnd, buf, NULL, MB_OK);
  497.    return;
  498. }