子窗口控件
- 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);
}
效果