前面我們在編寫Win32應用程序的思路都是:
1、設計窗口類。2、注冊窗口類。3、創建窗口。……
然而,當我們接觸控件以后, 會發現一個問題,我們在窗口上放置控件實在不好弄,而資源中的對話框具有圖形編輯器,操作起來相對方便。
于是,就有了一個想法:把對話框用作主窗口,那我們在布局控件時就輕松了。
其實這想法在網上已有牛人做了,不過,人家是用Win32匯編干的,當然,要把它變為C++就更簡單了。
首先,介紹第一個法子,直接以桌面作為父窗口來創建對話框。
1、創建一個對話框資源,界面就發揮你的設計天賦了。
2、創建一個圖標資源,既作為應用程序的圖標(VS編譯時會選擇第一個添加到資源中的圖標作為EXE的圖標),也作為對話框的圖標。
3、在代碼中創建并顯示對話框。
~~~
#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:
// 設置對話框的圖標
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;
}
~~~
這樣,我們可以運行一下。

=================================================================
第二種方法,我們還是遵照設計窗口類、注冊窗口類、創建窗口等步驟,只是把對話框作為窗口的子級,對話框采用Form View視圖。
在插入資源的對話框中,點擊Dialog左邊的圖標,展開列表,在列表中選擇IDD_FORMVIEW,然后點“新建”。

然后你看到一個沒有邊框和標題欄的對話框。

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

最后,在響應WM_CREATE消息時,創建并顯示對話框,父級是我們的主窗口。
~~~
case WM_CREATE:
{
// 創建對話框
HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc);
// 顯示對話框
ShowWindow(hdlg, SW_SHOWNA);
}
return 0;
~~~
最后運行結果如下:

完整的代碼清單:
~~~
#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)
{
// 設計窗口類
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;
// 創建窗口
HWND hwnd = CreateWindow(L"supper_man", L"超級應用",
WS_OVERLAPPEDWINDOW, 40, 25, 380, 300, NULL, NULL, hThisApp, NULL);
if(!hwnd)
return 0;
ShowWindow(hwnd, nShow);
UpdateWindow(hwnd);
// 消息循環
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:
{
// 創建對話框
HWND hdlg = CreateDialog(hgAppInst, MAKEINTRESOURCE(IDD_MYFORM), hwnd, (DLGPROC)DlgProc);
// 顯示對話框
ShowWindow(hdlg, SW_SHOWNA);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0;
}
// 處理對話框消息
INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
/* .............. */
return (INT_PTR)FALSE;
}
~~~
- 前言
- (1):關于C++的幾個要點
- (2):完整的開發流程
- (3):窗口的重繪
- (4):創建菜單
- (5):具有單選標記的菜單
- (6):創建右鍵菜單
- (7):多邊形窗口
- (8):繪圖(A)
- (9):繪圖(B)
- (10):繪圖(C)
- (11):使用控件——先來耍一下按鈕
- (12):使用控件——單選按鈕
- (13):握手對話框
- (14):用對話框作為主窗口
- (15):ListView控件
- (16):ListView的多個視圖
- (17):啟動和結束進程
- (18):使用對話框的兩個技巧
- (19):瀏覽和打開文件
- (20):瀏覽文件夾
- (21):復制&amp;粘貼&amp;剪貼板操作
- (22):抓取屏幕
- (23):漸變顏色填充
- (24):計時器
- (25):監視剪貼板