前面我們?cè)诰帉慦in32應(yīng)用程序的思路都是:
1、設(shè)計(jì)窗口類。2、注冊(cè)窗口類。3、創(chuàng)建窗口?!?/p>
然而,當(dāng)我們接觸控件以后, 會(huì)發(fā)現(xiàn)一個(gè)問題,我們?cè)诖翱谏戏胖每丶?shí)在不好弄,而資源中的對(duì)話框具有圖形編輯器,操作起來相對(duì)方便。
于是,就有了一個(gè)想法:把對(duì)話框用作主窗口,那我們?cè)诓季挚丶r(shí)就輕松了。
其實(shí)這想法在網(wǎng)上已有牛人做了,不過,人家是用Win32匯編干的,當(dāng)然,要把它變?yōu)镃++就更簡(jiǎn)單了。
首先,介紹第一個(gè)法子,直接以桌面作為父窗口來創(chuàng)建對(duì)話框。
1、創(chuàng)建一個(gè)對(duì)話框資源,界面就發(fā)揮你的設(shè)計(jì)天賦了。
2、創(chuàng)建一個(gè)圖標(biāo)資源,既作為應(yīng)用程序的圖標(biāo)(VS編譯時(shí)會(huì)選擇第一個(gè)添加到資源中的圖標(biāo)作為EXE的圖標(biāo)),也作為對(duì)話框的圖標(biāo)。
3、在代碼中創(chuàng)建并顯示對(duì)話框。
- #include <Windows.h>
- #include "resource.h"
- // 開啟可視化效果
- #pragma comment(linker,"\"/manifestdependency:type='win32' \
- name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
- processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
-
- INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
-
- HINSTANCE hgInst;
- int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow)
- {
- hgInst = hThisApp;
- HWND hdlg = CreateDialog(hThisApp, MAKEINTRESOURCE(IDD_MY),GetDesktopWindow(),(DLGPROC)DlgProc);
- if(!hdlg)
- {
- return 0;
- }
- ShowWindow(hdlg,SW_SHOW);
- MSG msg;
- while(GetMessage(&msg,NULL,0,0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return 0;
- }
-
- INT_PTR CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch(msg)
- {
- case WM_INITDIALOG:
- // 設(shè)置對(duì)話框的圖標(biāo)
- SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hgInst, MAKEINTRESOURCE(IDI_APP)));
- return 0;
- case WM_SYSCOMMAND:
- if(wParam == SC_CLOSE)
- {
- PostQuitMessage(0);//退出
- }
- return 0;
- }
- return (INT_PTR)FALSE;
- }
這樣,我們可以運(yùn)行一下。

=================================================================
第二種方法,我們還是遵照設(shè)計(jì)窗口類、注冊(cè)窗口類、創(chuàng)建窗口等步驟,只是把對(duì)話框作為窗口的子級(jí),對(duì)話框采用Form View視圖。
在插入資源的對(duì)話框中,點(diǎn)擊Dialog左邊的圖標(biāo),展開列表,在列表中選擇IDD_FORMVIEW,然后點(diǎn)“新建”。

然后你看到一個(gè)沒有邊框和標(biāo)題欄的對(duì)話框。

接下來我們可以放些控件上去。

最后,在響應(yīng)WM_CREATE消息時(shí),創(chuàng)建并顯示對(duì)話框,父級(jí)是我們的主窗口。
- case WM_CREATE:
- {
- // 創(chuàng)建對(duì)話框
- HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc);
- // 顯示對(duì)話框
- ShowWindow(hdlg, SW_SHOWNA);
- }
- return 0;
最后運(yùn)行結(jié)果如下:

完整的代碼清單:
- #include <Windows.h>
- #include "resource.h"
- #pragma comment(linker,"\"/manifestdependency:type='win32' \
- name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
- processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
-
- LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
- INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam);
-
- HINSTANCE hgAppInst;
- int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpCmd, int nShow)
- {
- // 設(shè)計(jì)窗口類
- WNDCLASS wc = { };
- wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
- wc.lpfnWndProc = (WNDPROC)WindowProc;
- wc.lpszClassName = L"supper_man";
- wc.hInstance = hThisApp;
- wc.style = CS_HREDRAW | CS_VREDRAW;
- RegisterClass(&wc);
- hgAppInst = hThisApp;
- // 創(chuàng)建窗口
- HWND hwnd = CreateWindow(L"supper_man", L"超級(jí)應(yīng)用",
- WS_OVERLAPPEDWINDOW, 40, 25, 380, 300, NULL, NULL, hThisApp, NULL);
- if(!hwnd)
- return 0;
- ShowWindow(hwnd, nShow);
- UpdateWindow(hwnd);
- // 消息循環(huán)
- MSG msg;
- while(GetMessage(&msg,NULL,0,0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return 0;
- }
-
- LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch (msg)
- {
- case WM_CREATE:
- {
- // 創(chuàng)建對(duì)話框
- HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc);
- // 顯示對(duì)話框
- ShowWindow(hdlg, SW_SHOWNA);
- }
- return 0;
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- default:
- return DefWindowProc(hwnd,msg,wParam,lParam);
- }
- return 0;
- }
-
- // 處理對(duì)話框消息
- INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- /* .............. */
- return (INT_PTR)FALSE;
- }
|