1. 程式人生 > 其它 >【2021.01.05】子視窗、子視窗控制元件

【2021.01.05】子視窗、子視窗控制元件

技術標籤:Win32

子視窗控制元件

  1. Windows提供了幾個預定義的視窗類以方便我們的使用,我們一般叫它們為子視窗控制元件,簡稱控制元件。
  2. 控制元件會自己處理訊息,並在自己狀態發生改變時通知父視窗。
  3. 預定義的控制元件有:按鈕、複選框、編輯框、靜態字串標籤和滾動條等。

建立編輯框和按鈕

// 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);
}

效果