winapp | 視窗程式的win32子控制元件
阿新 • • 發佈:2021-08-19
基於上一篇部落格裡的簡單win32app實現:
// windowsapp.cpp : Defines the entry point for the application. // #include "stdafx.h" HINSTANCE g_hInstance; // 全域性變數程式控制代碼 // 定義子控制元件編號巨集 #define IDC_EDIT_1 0x100 #define IDC_BUTTON_1 0x101 #define IDC_BUTTON_2 0x102 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM LParam){ // 視窗程式 // 處理訊息佇列的訊息 switch (uMsg) { case WM_CREATE: // 視窗被創建出來的訊息 //建立子控制元件 //建立文字框 CreateWindow( "EDIT", // 註冊的類名 這裡是文字框 "", // 視窗名 WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_MULTILINE, // 視窗風格 0, 0, // 相對於父視窗的x,y座標 300, 300, // 寬高 hwnd, // 父視窗的控制代碼 (HMENU)IDC_EDIT_1, // 選單控制代碼如果是子視窗就是身份標識 g_hInstance, // 是屬於哪個模組的 NULL // 附加資料 空 ); //建立兩個按鈕 CreateWindow( "BUTTON", // 註冊的類名 這裡是文字框 "設定", // 視窗名 WS_CHILD|WS_VISIBLE, // 視窗風格 300, 0, // 相對於父視窗的x,y座標 60, 30, // 寬高 hwnd, // 父視窗的控制代碼 (HMENU)IDC_BUTTON_1, // 選單控制代碼 g_hInstance, // 是屬於哪個模組的 NULL // 附加資料 空 ); CreateWindow( "BUTTON", // 註冊的類名 這裡是文字框 "獲取", // 視窗名 WS_CHILD|WS_VISIBLE, // 視窗風格 300, 100, // 相對於父視窗的x,y座標 60, 30, // 寬高 hwnd, // 父視窗的控制代碼 (HMENU)IDC_BUTTON_2, // 選單控制代碼 g_hInstance, // 是屬於哪個模組的 NULL // 附加資料 空 ); break; case WM_COMMAND: // 按鈕發過來的訊息 switch (LOWORD(wParam)) { case IDC_BUTTON_1: SetDlgItemText(hwnd, IDC_EDIT_1, TEXT("測試")); break; case IDC_BUTTON_2: break; } break; case WM_DESTROY: PostQuitMessage(0); // 讓當前程式退出 break; } return DefWindowProc(hwnd, uMsg, wParam, LParam); // 呼叫預設的訊息處理函式 } int APIENTRY WinMain(HINSTANCE hInstance, // 控制代碼 模組的起始位置 HINSTANCE hPrevInstance, // 永遠為空 LPSTR lpCmdLine, int nCmdShow) { /* DWORD dwAddr = (DWORD)hInstance; char szOutBuff[0x80]; sprintf(szOutBuff, "module place: 0x%X \n", dwAddr); // 列印模組起始地址 OutputDebugString(szOutBuff); */ // 給全域性變數控制代碼賦值 g_hInstance = hInstance; // 第一步:定義視窗是什麼樣的 TCHAR className[] = TEXT("My first Window"); WNDCLASS wndclass = {0}; // 視窗類初始化 wndclass.hbrBackground = (HBRUSH)COLOR_WINDOW;//背景色 wndclass.lpszClassName = className; // 視窗類名 wndclass.hInstance = hInstance; // 視窗是屬於哪個程式的 wndclass.lpfnWndProc = WindowProc; // 視窗程式(視窗過程函式地址) // 第二步:註冊視窗類 RegisterClass(&wndclass); // 讓作業系統知道你這個視窗 // 第三步:建立並顯示視窗 HWND hwnd = CreateWindow( className, // 註冊的類名 TEXT("Mz1小工具"), // 視窗名 WS_OVERLAPPEDWINDOW, // 視窗風格 100, 100, // 相對於父視窗的x,y座標 600, 300, // 寬高 NULL, // 父視窗的控制代碼 NULL, // 選單控制代碼 hInstance, // 是屬於哪個模組的 NULL // 附加資料 空 ); // 第四步:顯示視窗 ShowWindow(hwnd, SW_SHOW); // 預設形式顯示 // 第五步:接收訊息並處理 MSG msg; // 用於接收訊息的結構體 BOOL bRet; while((bRet = GetMessage( &msg, NULL, 0, 0)) != 0){// 引數2:取哪個視窗的訊息,如果為空,就是取所有的 if (bRet == -1){ // handle the error }else{ TranslateMessage(&msg); // 轉換訊息 DispatchMessage(&msg); // 分發訊息 給訊息處理函式處理 } } return 0; }