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 }
執行結果