【2021.01.05】子窗口、子窗口控件

子窗口控件

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

效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值