Windows編程之非模態對話框

//  注:  最近真不是喜歡上windows編程了..  項目需要啊
  設置程序圖標:
////應用程序圖標
static HICON hIcon1 = LoadIcon(hApp, MAKEINTRESOURCE(IDI_ICON1));
SendMessage(hMainWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon1);    //任務欄 alt + tab
SendMessage(hMainWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon1);  //標題欄 程序exe圖標
1  創建非模態對話框

<1>  HWNDCreateDialog(  HINSTANCE hInstance,  // handle to module

                LPCTSTRlpTemplate,    // dialog box template name

                HWNDhWndParent,    // handle to owner window

                DLGPROClpDialogFunc  // dialog box procedure);

<2> HWND CreateDialogIndirect(  HINSTANCE hInstance,        // handle to module

                LPCDLGTEMPLATE lpTemplate,   //dialog box template

                HWND hWndParent,           // handle to owner window

                DLGPROC lpDialogFunc         //dialog box procedure);

<3> HWND CreateDialogIndirectParam(  HINSTANCE hInstance,   // handle to module

                LPCDLGTEMPLATE lpTemplate,  // dialog box template

                HWND hWndParent,          // handle to owner window

                DLGPROC lpDialogFunc,       // dialog box procedure

                LPARAM lParamInit           // initialization value);

<4> HWND CreateDialogParam(  HINSTANCE hInstance,     // handle to module

                LPCTSTR lpTemplateName,    //dialog box template

                HWND hWndParent,         // handle to owner window

                DLGPROC lpDialogFunc,      //dialog box procedure

                LPARAM dwInitParam        //initialization value);

         參數跟非模態對話框一致。CreateDialogParam會調用CreateWindowExe去創建一個窗口,所以這樣的對話框其實就是窗口。當然單獨一個對話框可以沒有父窗口直接單獨存在。

2   含有父窗口的對話框程序


自定義窗口類(無父窗口)的對話框程序

<1>在腳本中指定對話框的類型以及各種控件假定腳本名稱爲new.dlg


<2>然後在rc文件中添加腳本


<3>在WinMain函數註冊窗口類

         注意這裏的CreateDialog的最後一個參數DLGPROC爲NULL,因爲在窗口類中指定了窗口過程函數。

  1. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCEhPrevInstance,PSTR szCmdLine, intiCmdShow)       
  2. {     
  3.     staticTCHAR szAppName[] = TEXT ("HexCalc");  
  4.     HWND                    hwnd ;  
  5.     MSG                     msg ;  
  6.     WNDCLASS                wndclass ;  
  7.          
  8.     wndclass.style              = CS_HREDRAW | CS_VREDRAW ;  
  9.     wndclass.lpfnWndProc        = WndProc ;  
  10.     wndclass.cbClsExtra         = 0 ;  
  11.     wndclass.cbWndExtra         = DLGWINDOWEXTRA ; // note here  
  12.     wndclass.hInstance          = hInstance ;  
  13.     wndclass.hIcon              = LoadIcon (NULL, IDI_APPLICATION) ;  
  14.     wndclass.hCursor            = LoadCursor (NULL, IDC_ARROW) ;  
  15.     wndclass.hbrBackground      = (HBRUSH) GetStockObject (WHITE_BRUSH) ;  
  16.     wndclass.lpszMenuName       = NULL ;  
  17.     wndclass.lpszClassName      =szAppName ;  
  18.          
  19.     if(!RegisterClass (&wndclass))     
  20.          {  
  21.         MessageBox (  NULL, TEXT ("Thisprogram requires Windows NT!"), szAppName, MB_ICONERROR) ;   
  22.         return0 ;  
  23.     }  
  24.          
  25.          hwnd =CreateDialog(hInstance,szAppName,NULL,NULL);    //note here  
  26.          
  27.     ShowWindow (hwnd, iCmdShow) ;  
  28.     UpdateWindow (hwnd) ;  
  29.          
  30.     while(GetMessage (&msg, NULL, 0, 0))         
  31.          {  
  32.                    TranslateMessage (&msg) ;  
  33.                    DispatchMessage (&msg) ;  
  34.     }  
  35.          
  36.     returnmsg.wParam ;        
  37. }  
生成的窗口程序程序如圖所示:


12 從資源加載(無父窗口)的對話框程序

  1. LRESULT CALLBACKWndProc(HWND,UINT,WPARAM,LPARAM) ;  
  2. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCEhPrevInstance,PSTR szCmdLine, intiCmdShow)       
  3. {  
  4.     HWND                    hwnd ;  
  5.     MSG                     msg ;  
  6.     
  7.          //hwnd =CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)WndProc);  
  8.     hwnd =CreateDialogParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)WndProc,NULL);  
  9.    
  10.     ShowWindow (hwnd, iCmdShow) ;  
  11.     UpdateWindow (hwnd) ;  
  12.          
  13.     while(GetMessage (&msg, NULL, 0, 0))         
  14.          {  
  15.                    TranslateMessage (&msg) ;  
  16.                    DispatchMessage (&msg) ;  
  17.     }     
  18.     returnmsg.wParam ;        
  19. }  
可以看到這裏沒有窗口的設計,窗口的註冊,因爲這種從資源加載的對話框的窗口類是已經定義的,就像那種PushButton一樣,都是定義好的窗口的類,因而不需要註冊。

生成的單獨對話框程序如下圖所示:


轉自:http://blog.csdn.net/ddupd/article/details/24491201

發佈了109 篇原創文章 · 獲贊 12 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章