1. 程式人生 > 其它 >API建立視窗 按鍵 按鈕 CreateWindowEx

API建立視窗 按鍵 按鈕 CreateWindowEx

一.控制元件概念
·控制元件:特殊的一類”子”視窗,系統已經定義好了視窗型別.

建立方式和建立視窗類似,呼叫createWindows,每個控制元件都由ID

·父視窗直接通過sendmessage向控制元件傳送訊息.

控制元件事件發生後,會向所在的父視窗傳送通知訊息

·注意:建立視窗時必須新增兩個屬性

WS_CHILD:控制元件是放在我們的視窗上的,自然要作為視窗的子視窗

WS_CHILDWINDOW也一樣,為了節約幾個字母,用WS_CHILD吧。

WS_VISIBLE:設定可見,要想別人稱讚你老婆漂亮,先讓別人見你老婆

·建立視窗函式講解

HWND WINAPI CreateWindow( 類名, 顯示內容, 風格, nt x, int y,

int nWidth, int nHeight, 父視窗, 控制元件ID,

HINSTANCE hInstance, LPVOID lpParam );

·主要控制元件:按鈕,編輯框,靜態框,列表框,組合框,樹控制元件,分組框,等

二.按鈕
2.1基本概念
視窗類名 BUTTON

按鈕分類:

下壓式按鈕 BS_PUSHIBUTTON/BS_DEFPUSHIBUTTON

複選框 BS_CHECKBOX/BS_AUTOCHECKBOX /BS_3STATE/ BS_AUTO3STATE

單選框BS_RADIOBUTTON/BS_AUTORADIOBUTTON

分組框BS_GROUPBOX

2.2下壓式按鈕
建立按鈕:

CreateWindow(L"Button", L"按鈕一", WS_VISIBLE | WS_CHILD |

BS_PUSHBUTTON, .... hwnd, (HMENU)IDB_ONE, hg_app, NULL);

按鈕訊息:WM_COMMAND

LOWORD(wParam) --- 儲存的是按鈕ID

HIWORD(wparam)---通知碼BN_CLICKED

lParam 子視窗控制代碼

改變按鈕文字資訊: 向控制元件傳送 WM_SETTEXT

2.3 分組框
視窗名稱BUTTON

視窗風格 BS_GROUPBOX

2.4單選框
視窗名稱BUTTON

視窗風格BS_RADIOBUTTON / BS_AUTORADIOBUTTON/WS_GROUP

WS_GROUP的單選框,到下一個WS_GROUP單選框之前,為1組

獲取和設定選擇狀態(通知訊息是BN_CLICKED)

BM_SETCHECK

BM_GETCHECK

案例:if( HIWORD(wParam)==BN_CLICKED ) {

HWND h3State = GetDlgItem( hWnd, 1005 );

LRESULT nRet = SendMessage( h3State, BM_GETCHECK, 0, 0 );

if( nRet == BST_CHECKED )}

2.5複選框
視窗類名:BUTTON

視窗風格:

BS_CHECKBOX - 點選選擇時,需要自己維護選擇狀態

BS_AUTOCHECKBOX - 點選選擇時,系統自動維護選擇狀態

BS_3STATE --變灰的三種狀態

BS_AUTO3STATE-自動處理的三種狀態

獲取和設定選擇狀態(通知訊息是BN_CLICKED)

BST_INDETERMINATE-設定灰色

BST_CHECKED ---設定選擇

BST_UNCHECKED --設定不選擇

設定狀態SendMessage(... BM_SETCHECK,具體狀態,必須為0);

獲取狀態SendMessage(... BM_GETCHECK,0,0);

案例SendMessage( 控制代碼, BM_SETCHECK,BST_INDETERMINATE, 0 );

三. 編輯框
3.1基本概念
視窗類名 EDIT

分類:

文字編輯框:顯示單行文字/顯示多行文字

密碼編輯框:ES_PASSWORD,顯示密碼

視窗風格

3.2通知訊息
在WM_COMMAND case下 處理這個引數
if (HIWORD(wParam) == EN_CHANGE && LOWORD(wParam) == nEditID)

3.2.1 WM_GETTEXT ---獲取編輯框文字

wPararm - buffer 的大小 lPararm – buffer的首地址

SendMessage( (WPARAM) wParam, // number of characters to copy

(LPARAM) lParam // text buffer);

3.2.2 WM_GETTEXTLENGTH-獲取文字長度

SendMessage( (WPARAM) 0, (LPARAM) 0)

3.2.3 WM_SETTEXT設定內容
wParam – 沒用,lParam – 準備設定內容的buffer的首地址

補充:

· SendMessage( hWndEdit, WM_CUT, 0, 0 );

· SendMessage( hWndEdit, WM_COPY, 0, 0 );

· SendMessage( hWndEdit, WM_CLEAR, 0, 0 )

四. 靜態框:
視窗名稱 “STATIC” 用來用來顯示文字,載入圖片(設定屬性 SS_ICON/SS_BITMAP)

視窗訊息: sendMessage 傳送到控制元件即可 例如 STM_SETICON

通知訊息: 需要建立時增加SS_NOTIFY風格

通知訊息通過WM_COMMAND 訊息傳遞

LOWORD(wparam)---控制元件ID

HIWORD(wparam)---notify-code(STN_CLICKED)

Lparam---控制元件視窗控制代碼

CreateWindowEx的拓展風格

WS_EX_NODRAG:防止視窗被移動

WS_EX_ACCEPTFILES: 接受一個拖拽檔案。

WS_EX_APPWINDOW:當視窗可見時,將一個頂層視窗放置到任務條上。

WS_EX_CLIENTEDGE:指定視窗有一個帶陰影的邊界。

WS_EX_CONTEXTHELP:在視窗的標題條包含一個問號標誌。當用戶點選了問號時,滑鼠游標變為一個問號的指標、如果點選了一個子視窗,則子視窗接收到、

WS_EX_DLGMODALFRAME:建立一個帶雙邊的視窗;

五.組合框
5.1組合框分類
簡單組合框 CBS_SIMPLE (可以輸入可以選擇)

下拉式組合框 CBS_DROPDOWN (可以輸入,可以選擇)

下拉式列表組合框 CBS_DROPDOWNLIST (只可以選擇不可以輸入)

5.2組合框傳送訊息
CB_ADDSTRING ----新增項(WPARAM---沒用 LPARAM----字串指標)

CB_INSERTSTRING 新增項

CB_DELETESTRING 刪除制定項

CB_RESETCONTENT 清除所有項

CB_SETCURSEL 設定當前項

CB_GETCURSLE 獲取當前項

CB_FINDSTRING 查詢某項字串

CB_GETLBTEXTLEN 獲取選擇的字元長度

CB_GETLBTEXT 獲取選項的一個字元內容

CB_DIR 在組合框中顯示制定路徑下的檔案和目錄名字

CB_SETITENDATA 將資料儲存到指定選項中

CB_GETITEMDATA 從指定選項中獲取資料

5.3向父視窗訊息
當選擇項傳送改變時 會給父視窗傳送 CBN_SELCHANGE訊息

當輸入內容傳送改 變時 會給父視窗傳送 CBN_EDITCHANGE

六.雜燴知識點

UNREFERENCED_PARAMETER

最高級別的警告 Level 4(/W4)進行編譯時。例如在程式中定義一個變數未使用就會提出警告.你可以加上UNREFERENCED_PARAMETER為了騙過編譯器。對某個變數不需要提供警告資訊

LoadString把String Table裡面的字串讀出來到CString物件裡

LoadAccelerators載入快捷鍵,返回快捷鍵控制代碼

TranslateAccelerator把訊息跟快捷鍵表裡定義的按鍵進行比較,如果發現有快捷鍵,就會把這個按鍵訊息轉換為WM_COMMAND或者WM_SYSCOMMAND訊息給視窗的訊息處理函式傳送過去,而不會發送wm_keydown訊息

下面通過一些程式碼展示這些函式的用法(只是cpp部分的程式碼,不包含標頭檔案)

  1 // 控制元件練習.cpp : 定義應用程式的入口點。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "控制元件練習.h"
  6 TCHAR TcharArr[1024] = _T("你好吧,你走吧大賽的恢復健康是的哈附近考慮水電費哈聖誕節快樂");
  7 #define MAX_LOADSTRING 100
  8 // 全域性變數: 
  9 HINSTANCE hInst;    // 當前例項
 10 TCHAR szTitle[MAX_LOADSTRING];    // 標題欄文字
 11 TCHAR szWindowClass[MAX_LOADSTRING];    // 主視窗類名
 12 
 13 // 此程式碼模組中包含的函式的前向宣告: 
 14 INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
 15 ATOM    MyRegisterClass(HINSTANCE hInstance);
 16 BOOL    InitInstance(HINSTANCE, int);
 17 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
 18 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 19 
 20 int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
 21 _In_opt_ HINSTANCE hPrevInstance,
 22 _In_ LPTSTR lpCmdLine,
 23 _In_ int nCmdShow)
 24 {
 25 UNREFERENCED_PARAMETER(hPrevInstance);
 26 UNREFERENCED_PARAMETER(lpCmdLine);
 27 
 28 // TODO: 在此放置程式碼。
 29 MSG msg;
 30 HACCEL hAccelTable;
 31 
 32 // 初始化全域性字串
 33 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
 34 LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);
 35 MyRegisterClass(hInstance);
 36 
 37 // 執行應用程式初始化: 
 38 if (!InitInstance (hInstance, nCmdShow))
 39 {
 40 return FALSE;
 41 }
 42 
 43 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY));
 44 
 45 // 主訊息迴圈: 
 46 while (GetMessage(&msg, NULL, 0, 0))
 47 {
 48 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
 49 {
 50 TranslateMessage(&msg);
 51 DispatchMessage(&msg);
 52 }
 53 }
 54 
 55 return (int) msg.wParam;
 56 }
 57 
 58 
 59 
 60 //
 61 // 函式: MyRegisterClass()
 62 //
 63 // 目的: 註冊視窗類。
 64 //
 65 ATOM MyRegisterClass(HINSTANCE hInstance)
 66 {
 67 WNDCLASSEX wcex;
 68 
 69 wcex.cbSize = sizeof(WNDCLASSEX);
 70 
 71 wcex.style    = CS_HREDRAW | CS_VREDRAW;
 72 wcex.lpfnWndProc    = WndProc;
 73 wcex.cbClsExtra    = 0;
 74 wcex.cbWndExtra    = 0;
 75 wcex.hInstance    = hInstance;
 76 wcex.hIcon    = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY));
 77 wcex.hCursor    = LoadCursor(NULL, IDC_ARROW);
 78 wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
 79 wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_MY);
 80 wcex.lpszClassName    = szWindowClass;
 81 wcex.hIconSm    = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 82 
 83 return RegisterClassEx(&wcex);
 84 }
 85 
 86 //
 87 // 函式: InitInstance(HINSTANCE, int)
 88 //
 89 // 目的: 儲存例項控制代碼並建立主視窗
 90 //
 91 // 註釋: 
 92 //
 93 // 在此函式中,我們在全域性變數中儲存例項控制代碼並
 94 // 建立和顯示主程式視窗。
 95 //
 96 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
 97 {
 98 HWND hWnd;
 99 
100 hInst = hInstance; // 將例項控制代碼儲存在全域性變數中
101 
102 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
103 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
104 
105 if (!hWnd)
106 {
107 return FALSE;
108 }
109 
110 ShowWindow(hWnd, nCmdShow);
111 UpdateWindow(hWnd);
112 
113 return TRUE;
114 }
115 
116 //
117 // 函式: WndProc(HWND, UINT, WPARAM, LPARAM)
118 //
119 // 目的: 處理主視窗的訊息。
120 //
121 // WM_COMMAND    - 處理應用程式選單
122 // WM_PAINT    - 繪製主視窗
123 // WM_DESTROY    - 傳送退出訊息並返回
124 //
125 //
126 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
127 {
128 int wmId, wmEvent;
129 PAINTSTRUCT ps;
130 HDC hdc;
131 
132 switch (message)
133 {
134 case WM_LBUTTONDOWN:
135 {
136 /*DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogProc);*/
137 HWND hDiawnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogProc);
138 ShowWindow(hDiawnd, SW_SHOWNORMAL);
139 }
140 break;
141 case WM_COMMAND:
142 wmId = LOWORD(wParam);
143 wmEvent = HIWORD(wParam);
144 // 分析選單選擇: 
145 switch (wmId)
146 {
147 case IDM_ABOUT:
148 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
149 break;
150 case IDM_EXIT:
151 DestroyWindow(hWnd);
152 break;
153 default:
154 return DefWindowProc(hWnd, message, wParam, lParam);
155 }
156 break;
157 case WM_PAINT:
158 hdc = BeginPaint(hWnd, &ps);
159 // TODO: 在此新增任意繪圖程式碼...
160 EndPaint(hWnd, &ps);
161 break;
162 case WM_DESTROY:
163 PostQuitMessage(0);
164 break;
165 default:
166 return DefWindowProc(hWnd, message, wParam, lParam);
167 }
168 return 0;
169 }
170 
171 // “關於”框的訊息處理程式。
172 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
173 {
174 UNREFERENCED_PARAMETER(lParam);
175 switch (message)
176 {
177 case WM_INITDIALOG:
178 return (INT_PTR)TRUE;
179 
180 case WM_COMMAND:
181 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
182 {
183 EndDialog(hDlg, LOWORD(wParam));
184 return (INT_PTR)TRUE;
185 }
186 break;
187 }
188 return (INT_PTR)FALSE;
189 }
190 
191 
192 // “關於”框的訊息處理程式。
193 INT_PTR CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
194 {
195 UNREFERENCED_PARAMETER(lParam);
196 switch (message)
197 {
198 case WM_INITDIALOG:
199 CreateWindow(_T("button"), _T("這是一個調查問卷"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10, 10, 550, 500, hDlg, (HMENU)5002, hInst, nullptr);
200 
201 //喜歡選項
202 CreateWindow(_T("static"), _T("你喜歡誰:"), WS_CHILD | WS_VISIBLE, 15, 35, 100, 20, hDlg, (HMENU)5003, hInst, nullptr);
203 CreateWindow(_T("button"), _T("花花:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 15, 60, 100, 20, hDlg, (HMENU)5004, hInst, nullptr);
204 CreateWindow(_T("button"), _T("草草:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 15, 85, 100, 20, hDlg, (HMENU)5005, hInst, nullptr);
205 
206 //喜歡顏色選項
207 CreateWindow(_T("static"), _T("你喜歡什麼顏色:"), WS_CHILD | WS_VISIBLE, 15, 115, 130, 20, hDlg, (HMENU)5006, hInst, nullptr);
208 CreateWindow(_T("button"), _T("藍色:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 15, 140, 100, 20, hDlg, (HMENU)5007, hInst, nullptr);
209 CreateWindow(_T("button"), _T("黃色:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 15, 165, 100, 20, hDlg, (HMENU)5008, hInst, nullptr);
210 
211 //愛好
212 CreateWindow(_T("static"), _T("你喜歡做什麼:"), WS_CHILD | WS_VISIBLE, 15, 200, 130, 20, hDlg, (HMENU)5009, hInst, nullptr);
213 CreateWindow(_T("button"), _T("洗衣服:"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX , 15, 225, 100, 20, hDlg, (HMENU)5010, hInst, nullptr);
214 CreateWindow(_T("button"), _T("拖地:"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 15, 255, 100, 20, hDlg, (HMENU)5011, hInst, nullptr);
215 
216 //輸入編輯框
217 CreateWindow(_T("edit"), _T("請輸入:"), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 15, 285, 400, 80, hDlg, (HMENU)5012, hInst, nullptr);
218 return (INT_PTR)TRUE;
219 
220 case WM_COMMAND:
221 switch (LOWORD(wParam))
222 {
223 case 5001:
224 SendMessage(hDlg, 5012, sizeof(TcharArr), (unsigned int)TcharArr);
225 if(IsDlgButtonChecked(hDlg, 5004))
226 {
227 MessageBox(0, _T("花花被選中了"), 0, 0);
228 }
229 else
230 {
231 SendMessage(GetDlgItem(hDlg, 5004), BM_SETCHECK, 1, 0);
232 }
233 break;
234 case 5002:
235 break;
236 }
237 
238 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
239 {
240 DestroyWindow(hDlg);
241 return (INT_PTR)TRUE;
242 }
243 break;
244 }
245 return (INT_PTR)FALSE;
246 }


執行結果:


示例二

  1 // test08.cpp : 定義應用程式的入口點。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "test08.h"
  6 
  7 #define MAX_LOADSTRING 100
  8 
  9 // 全域性變數: 
 10 HINSTANCE hInst;    // 當前例項
 11 TCHAR szTitle[MAX_LOADSTRING];    // 標題欄文字
 12 TCHAR szWindowClass[MAX_LOADSTRING];    // 主視窗類名
 13 
 14 // 此程式碼模組中包含的函式的前向宣告: 
 15 ATOM    MyRegisterClass(HINSTANCE hInstance);
 16 BOOL    InitInstance(HINSTANCE, int);
 17 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
 18 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 19 
 20 HWND g_hWnd;
 21 
 22 HWND g_hDlgWnd;
 23 
 24 int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
 25 _In_opt_ HINSTANCE hPrevInstance,
 26 _In_ LPTSTR lpCmdLine,
 27 _In_ int nCmdShow)
 28 {
 29 UNREFERENCED_PARAMETER(hPrevInstance);
 30 UNREFERENCED_PARAMETER(lpCmdLine);
 31 
 32 // TODO: 在此放置程式碼。
 33 MSG msg;
 34 HACCEL hAccelTable;
 35 
 36 // 初始化全域性字串
 37 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
 38 LoadString(hInstance, IDC_TEST08, szWindowClass, MAX_LOADSTRING);
 39 MyRegisterClass(hInstance);
 40 
 41 // 執行應用程式初始化: 
 42 if (!InitInstance (hInstance, nCmdShow))
 43 {
 44 return FALSE;
 45 }
 46 
 47 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST08));
 48 
 49 // 主訊息迴圈: 
 50 while (GetMessage(&msg, NULL, 0, 0))
 51 {
 52 //MessageBox(g_hWnd, 00, 0, 0);
 53 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
 54 {
 55 TranslateMessage(&msg);
 56 DispatchMessage(&msg);
 57 }
 58 }
 59 
 60 return (int) msg.wParam;
 61 }
 62 
 63 
 64 
 65 //
 66 // 函式: MyRegisterClass()
 67 //
 68 // 目的: 註冊視窗類。
 69 //
 70 ATOM MyRegisterClass(HINSTANCE hInstance)
 71 {
 72 WNDCLASSEX wcex;
 73 
 74 wcex.cbSize = sizeof(WNDCLASSEX);
 75 
 76 wcex.style    = CS_HREDRAW | CS_VREDRAW;
 77 wcex.lpfnWndProc    = WndProc;
 78 wcex.cbClsExtra    = 0;
 79 wcex.cbWndExtra    = 0;
 80 wcex.hInstance    = hInstance;
 81 wcex.hIcon    = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST08));
 82 wcex.hCursor    = LoadCursor(NULL, IDC_ARROW);
 83 wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
 84 wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_TEST08);
 85 wcex.lpszClassName    = szWindowClass;
 86 wcex.hIconSm    = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 87 
 88 return RegisterClassEx(&wcex);
 89 }
 90 
 91 //
 92 // 函式: InitInstance(HINSTANCE, int)
 93 //
 94 // 目的: 儲存例項控制代碼並建立主視窗
 95 //
 96 // 註釋: 
 97 //
 98 // 在此函式中,我們在全域性變數中儲存例項控制代碼並
 99 // 建立和顯示主程式視窗。
100 //
101 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
102 {
103 HWND hWnd;
104 
105 hInst = hInstance; // 將例項控制代碼儲存在全域性變數中
106 
107 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
108 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
109 
110 g_hWnd = hWnd;
111 
112 if (!hWnd)
113 {
114 return FALSE;
115 }
116 
117 ShowWindow(hWnd, nCmdShow);
118 UpdateWindow(hWnd);
119 
120 return TRUE;
121 }
122 
123 //
124 // 函式: WndProc(HWND, UINT, WPARAM, LPARAM)
125 //
126 // 目的: 處理主視窗的訊息。
127 //
128 // WM_COMMAND    - 處理應用程式選單
129 // WM_PAINT    - 繪製主視窗
130 // WM_DESTROY    - 傳送退出訊息並返回
131 //
132 //
133 
134 //對話方塊:特殊的視窗,主要用於使用者的輸入(有意識讓縮小使用者的輸入範圍),佈局控制元件
135 //可以認為對話方塊是用來承載控制元件
136 
137 //對話方塊分為2類:
138 //模態對話方塊 阻塞(同步)模式,對這個對話方塊之外的應用程式主視窗要進行操作,必須先操作完這個對話方塊才行
139 //非模態對話方塊 非阻塞(非同步)模式,對這個對話方塊之外的應用程式主視窗要進行操作,可以隨時
140 
141 //對話方塊的建立步驟:
142 //1、新增對話方塊資源(資源去新增一個對話方塊)
143 //2、呼叫一個函式去建立一個對話方塊(模態呼叫DialogBox,非模態呼叫createdialog)
144 //3、建立一個對話方塊的視窗處理函式
145 //4、釋放對話方塊(模態呼叫EndDialog,非模態呼叫DestroyWindow)
146 
147 //區別:
148 //模態的建立沒返回視窗控制代碼,非模態返回了視窗控制代碼,非模態需要呼叫ShowWindow,否則對話方塊不顯示
149 
150 //基本控制元件
151 //控制元件也是一個特殊的子視窗,是系統已經定義好的視窗類
152 //系統用小寫的識別符號來定義控制元件視窗類名,button(按鈕),static(靜態文字)
153 
154 //作業:
155 //自定義賬號和密碼,實現一個登入功能,輸入正確的賬號和密碼之後點確定後才能進入主視窗,輸入錯誤,把兩個輸入清空
156 //重新輸入
157 
158 TCHAR strArr[1024] = {};
159 
160 INT_PTR CALLBACK ModDialogRroc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
161 {
162 UNREFERENCED_PARAMETER(lParam);
163 switch (message)
164 {
165 case WM_INITDIALOG://初始化對話方塊(類似wm_create)
166 //在對話方塊顯示之前先響應訊息 子控制元件的建立通過CreateWindow
167 //WS_CHILD 子視窗 WS_VISIBLE 可見的 WS_BORDER 有邊框
168 //BS_PUSHBUTTON 下壓式的按鈕 BS_GROUPBOX 組框 BS_AUTORADIOBUTTON 單選框 BS_AUTOCHECKBOX 複選框
169 //注意:建立控制元件的視窗是不需要選單控制代碼(對話方塊及子控制元件沒選單),把控制元件的id號,做為引數放在選單這個形參
170 CreateWindow(_T("button"), _T("這是一個按鈕"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
171 500, 450, 100, 30, hDlg, (HMENU)5001, hInst, NULL);
172 
173 //==========================
174 //組框
175 CreateWindow(_T("button"), _T("這是一個調查問卷"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
176 10, 10, 500, 400, hDlg, (HMENU)5002, hInst, NULL);
177 //靜態文字
178 CreateWindow(_T("static"), _T("誰最帥:"), WS_CHILD | WS_VISIBLE,
179 20, 40, 100, 30, hDlg, (HMENU)5003, hInst, NULL);
180 //單選框
181 //WS_GROUP 代表從當前程式碼處開始分組,碰到下一個WS_GROUP程式碼處終止(或者沒有單選按鈕為止),為一組
182 CreateWindow(_T("button"), _T("小廣廣"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP,
183 50, 70, 100, 30, hDlg, (HMENU)6001, hInst, NULL);
184 CreateWindow(_T("button"), _T("夏七"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
185 50, 100, 100, 30, hDlg, (HMENU)6002, hInst, NULL);
186 CreateWindow(_T("button"), _T("凱文"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
187 50, 130, 100, 30, hDlg, (HMENU)6003, hInst, NULL);
188 
189 //靜態文字
190 CreateWindow(_T("static"), _T("調查者的學歷:"), WS_CHILD | WS_VISIBLE,
191 20, 170, 200, 30, hDlg, (HMENU)5004, hInst, NULL);
192 //單選框
193 CreateWindow(_T("button"), _T("大專"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP,
194 50, 200, 100, 30, hDlg, (HMENU)6004, hInst, NULL);
195 CreateWindow(_T("button"), _T("本科"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
196 50, 230, 100, 30, hDlg, (HMENU)6005, hInst, NULL);
197 CreateWindow(_T("button"), _T("幼兒圓"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
198 50, 260, 100, 30, hDlg, (HMENU)6006, hInst, NULL);
199 
200 //靜態文字
201 CreateWindow(_T("static"), _T("調查者的興趣喜好:"), WS_CHILD | WS_VISIBLE,
202 220, 40, 200, 30, hDlg, (HMENU)5005, hInst, NULL);
203 //複選框
204 CreateWindow(_T("button"), _T("吃飯"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
205 250, 70, 100, 30, hDlg, (HMENU)6007, hInst, NULL);
206 CreateWindow(_T("button"), _T("睡覺"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
207 250, 100, 100, 30, hDlg, (HMENU)6008, hInst, NULL);
208 CreateWindow(_T("button"), _T("打豆豆"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
209 250, 130, 100, 30, hDlg, (HMENU)6009, hInst, NULL);
210 
211 //編輯框: edit
212 CreateWindow(_T("edit"), _T("請輸入:"), WS_CHILD | WS_VISIBLE |WS_BORDER,
213 30, 290, 450, 100, hDlg, (HMENU)6010, hInst, NULL);
214 
215 //設定預設的控制元件
216 //沒有儲存視窗,可以通過GetDlgItem得到控制元件的視窗控制代碼
217 //第3個引數設定為1,代表6001id的這個控制元件被選中
218 SendMessage(GetDlgItem(hDlg, 6001), BM_SETCHECK, 1, 0);
219 
220 SendMessage(GetDlgItem(hDlg, 6007), BM_SETCHECK, 1, 0);
221 return (INT_PTR)TRUE;
222 
223 case WM_COMMAND://命令訊息
224 switch (LOWORD(wParam))
225 {
226 case 6010:
227 break;
228 case 6007:
229 break;
230 case 6001:
231 break;
232 case 5001:
233 _tcscpy_s(strArr, _T("誰最帥:"));
234 if (IsDlgButtonChecked(hDlg, 6001))//判斷6001這個按鈕是否被選中
235 _tcscat_s(strArr,_T("小廣廣。"));
236 _tcscat_s(strArr,_T("調查者的學歷:"));
237 if (IsDlgButtonChecked(hDlg, 6004))
238 _tcscat_s(strArr,_T("大專。"));
239 _tcscat_s(strArr, _T("調查者的興趣喜好:"));
240 if (IsDlgButtonChecked(hDlg, 6007))
241 _tcscat_s(strArr, _T("吃飯。"));
242 
243 
244 SetDlgItemText(hDlg, 6010, strArr);
245 
246 TCHAR aa[1024] = {};
247 GetDlgItemText(hDlg, 6010, aa, 1023);
248 MessageBox(0, aa, 0, 0);
249 break;
250 }
251 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
252 {
253 EndDialog(hDlg, LOWORD(wParam));
254 //DestroyWindow(g_hDlgWnd);//非模態的釋放
255 return (INT_PTR)TRUE;
256 }
257 break;
258 }
259 return (INT_PTR)FALSE;
260 }
261 
262 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
263 {
264 int wmId, wmEvent;
265 PAINTSTRUCT ps;
266 HDC hdc;
267 
268 switch (message)
269 {
270 case WM_RBUTTONDOWN:
271 //模態
272 //第3個引數為父視窗控制代碼; //第4個引數為對話方塊的視窗處理函式指標
273 DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, ModDialogRroc);//建立模態對話方塊
274 //EndDialog模態對話方塊的釋放 DialogBox模態對話方塊的建立
275 
276 非模態
277 //g_hDlgWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, ModDialogRroc);//建立非模態對話方塊
278 //ShowWindow(g_hDlgWnd, SW_SHOWNORMAL);//非模態對話方塊建立之後必須要呼叫ShowWindow來顯示
279 break;
280 case WM_COMMAND:
281 wmId = LOWORD(wParam);
282 wmEvent = HIWORD(wParam);
283 // 分析選單選擇: 
284 switch (wmId)
285 {
286 case IDM_ABOUT:
287 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
288 break;
289 case IDM_EXIT:
290 DestroyWindow(hWnd);
291 break;
292 default:
293 return DefWindowProc(hWnd, message, wParam, lParam);
294 }
295 break;
296 case WM_PAINT:
297 hdc = BeginPaint(hWnd, &ps);
298 // TODO: 在此新增任意繪圖程式碼...
299 EndPaint(hWnd, &ps);
300 break;
301 case WM_DESTROY:
302 PostQuitMessage(0);
303 break;
304 default:
305 return DefWindowProc(hWnd, message, wParam, lParam);
306 }
307 return 0;
308 }
309 
310 // “關於”框的訊息處理程式。
311 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
312 {
313 UNREFERENCED_PARAMETER(lParam);
314 switch (message)
315 {
316 case WM_INITDIALOG://初始化對話方塊(類似wm_create)
317 return (INT_PTR)TRUE;
318 
319 case WM_COMMAND:
320 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
321 {
322 EndDialog(hDlg, LOWORD(wParam));
323 return (INT_PTR)TRUE;
324 }
325 break;
326 }
327 return (INT_PTR)FALSE;
328 }


執行結果