【2021.01.05】子視窗、子視窗控制元件
阿新 • • 發佈:2021-01-06
技術標籤:Win32
子視窗控制元件
- Windows提供了幾個預定義的視窗類以方便我們的使用,我們一般叫它們為子視窗控制元件,簡稱控制元件。
- 控制元件會自己處理訊息,並在自己狀態發生改變時通知父視窗。
- 預定義的控制元件有:按鈕、複選框、編輯框、靜態字串標籤和滾動條等。
建立編輯框和按鈕
// Project2.cpp : 定義應用程式的入口點。 // #include "framework.h" #include "Project2.h" #define IDC_EDIT_1 0x100 #define IDC_BUTTON_1 0x200 #define IDC_BUTTON_2 0x201 HINSTANCE g_hInstance; LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { // TODO: 在此處放置程式碼。 g_hInstance = hInstance; //1.定義視窗是什麼樣的 TCHAR className[] = TEXT("MyFirstWindow"); WNDCLASS wndclass = { 0 }; wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND; //背景顏色 wndclass.lpszClassName = className; //名稱 wndclass.hInstance = hInstance; //視窗屬於誰 wndclass.lpfnWndProc = WindowProc; //視窗訊息/視窗回撥/視窗過程函式 RegisterClass(&wndclass); //註冊視窗類 //2.建立並顯示視窗 HWND hwnd = CreateWindow(className, TEXT("Win32視窗程式"), WS_OVERLAPPEDWINDOW, 10, 10, 300, 300, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, SW_SHOW); //顯示視窗 //3.接收訊息並處理 MSG msg; BOOL bRet; WCHAR szBuffer[0x80]; //迴圈取出所有訊息訊息 while ((bRet = GetMessage(&msg, NULL, NULL, NULL)) != 0) { if (bRet == -1) { wsprintfW(szBuffer, L"Error:%d\0", GetLastError()); OutputDebugString(szBuffer); } else { //轉換訊息 TranslateMessage(&msg); //分發訊息 回到0環區分是哪個視窗的訊息 DispatchMessage(&msg); } } return 0; } //視窗訊息/視窗回撥/視窗過程函式 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { WCHAR szBuffer[0x80]; wsprintfW(szBuffer, L"訊息型別: %x\n", uMsg); OutputDebugString(szBuffer); switch (uMsg) { case WM_DESTROY: { //使當前程式退出 PostQuitMessage(0); return 0; } case WM_CREATE: { //建立文字框 CreateWindow( TEXT("EDIT"), //文字框/編輯框 TEXT(""), //標題 WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE, //樣式 子視窗、建立後可以看到、滾動條、自動換行 10, //顯示位置 10, //顯示位置 200, //寬度 100, //高度 hwnd, //父視窗控制代碼 (HMENU)IDC_EDIT_1, //如果是父視窗就是選單 如果不是父視窗就是子視窗標識 g_hInstance, //當前視窗屬於哪個程序 建立一個全域性變數將父視窗的賦值給全域性變數 NULL ); //建立2個按鈕 CreateWindow( TEXT("BUTTON"), //按鈕 TEXT("設定"), //標題 WS_CHILD | WS_VISIBLE, //樣式 子視窗、建立後可以看到 10, //顯示位置 150, //顯示位置 100, //寬度 50, //高度 hwnd, //父視窗控制代碼 (HMENU)IDC_BUTTON_1, //如果是父視窗就是選單 如果不是父視窗就是子視窗標識 g_hInstance, //當前視窗屬於哪個程序 建立一個全域性變數將父視窗的賦值給全域性變數 NULL ); CreateWindow( TEXT("BUTTON"), //按鈕 TEXT("獲取"), //標題 WS_CHILD | WS_VISIBLE, //樣式 子視窗、建立後可以看到 120, //顯示位置 150, //顯示位置 100, //寬度 50, //高度 hwnd, //父視窗控制代碼 (HMENU)IDC_BUTTON_2, //如果是父視窗就是選單 如果不是父視窗就是子視窗標識 g_hInstance, //當前視窗屬於哪個程序 建立一個全域性變數將父視窗的賦值給全域性變數 NULL ); } case WM_COMMAND: { //低16位中有標識 所以使用LOWORD()得到低16位 switch (LOWORD(wParam)) { case IDC_BUTTON_1: { SetDlgItemText(hwnd, IDC_EDIT_1, L"Hello World"); break; } case IDC_BUTTON_2: { WCHAR szBuffer[0x80]; GetDlgItemText(hwnd, IDC_EDIT_1, szBuffer, 0x80); MessageBox(NULL, szBuffer, NULL, NULL); break; } break; } } } return DefWindowProc(hwnd, uMsg, wParam, lParam); }