Windows提供了几个预定义的类供我们使用,我们一般将他们叫做子窗口控件,简称控件;
控件会自己处理消息,并在自己状态发生改变时通知父窗口;
预定义的控件有:
按钮、复选框、编辑框、静态字符串标签和滚动条;
用效果如下的案例来来练习使用子窗口控件:
/*-------------------------------
MyWindows.c
---------------------------------*/
#include <Windows.h>
#include <Strsafe.h>
#define IDC_EDIT_1 0x100
#define IDC_BUTTON_1 0x101
#define IDC_BUTTON_2 0x102
HINSTANCE g_hInstance;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, //入口函数,WINAPI即是__stdcall(函数调用约定的一种)
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
g_hInstance = hInstance;
static TCHAR szAppName[] = TEXT("MyWindows");//定义窗口类的名字
HWND hwnd; //窗口句柄定义
MSG msg; //定义消息
WNDCLASS wndclass; //Windows类定义
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
//背景,先要得到画刷句柄传回
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
wndclass.hInstance = g_hInstance;//模块句柄,如前面说的.exe .dll等地址
wndclass.lpfnWndProc = WndProc;//过程函数
wndclass.lpszClassName = szAppName; //类名
wndclass.lpszMenuName = NULL;//菜单
wndclass.style = CS_HREDRAW | CS_VREDRAW;//调整宽度和高度重新绘制窗口
if (!RegisterClass(&wndclass)){ //填完窗口类注册该窗口类
MessageBox(NULL, TEXT("此程序需要在Windows NT平台上运行!"),
szAppName, MB_ICONERROR);
return 0;
}
//创建窗口并设置其具体特征,返回窗口句柄,窗口类名
hwnd = CreateWindow(szAppName,
TEXT("Win模板"), //窗口标题
WS_OVERLAPPEDWINDOW, //类风格的扩展
CW_USEDEFAULT, //初始窗口坐标
CW_USEDEFAULT,
600,
500,
NULL, //有无父窗口
NULL, //有无菜单
g_hInstance,
NULL
);
ShowWindow(hwnd, iCmdShow);//显示窗口
UpdateWindow(hwnd); //更新窗口
while (GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg); //翻译消息
DispatchMessage(&msg); //派送消息到系统,系统再调用WinProc函数处理消息
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)//传入消息结构体的前四个参数
{
TCHAR szOutBuffer[0x80] = {0};
//StringCchPrintf(szOutBuffer, 0x80, TEXT("消息:%x\n"), message);
//OutputDebugString(szOutBuffer);//用来看产生什么消息
switch (message)
{
case WM_CREATE:
CreateWindow(TEXT("EDIT"), //文本框
NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE,
0,
0,
500,
500,
hwnd,
IDC_EDIT_1,
g_hInstance,
NULL
);
CreateWindow(TEXT("BUTTON"), //按钮
TEXT("设置"),
WS_CHILD | WS_VISIBLE,
520,
380,
60,
30,
hwnd,
IDC_BUTTON_1,
g_hInstance,
NULL
);
CreateWindow(TEXT("BUTTON"), //按钮
TEXT("获取"),
WS_CHILD | WS_VISIBLE,
520,
420,
60,
30,
hwnd,
IDC_BUTTON_2,
g_hInstance,
NULL
);
return 0;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BUTTON_1:
SetDlgItemText(hwnd, IDC_EDIT_1, TEXT("测试"));
return 0;
case IDC_BUTTON_2:
GetDlgItemText(hwnd, IDC_EDIT_1, szOutBuffer, 0x80);
MessageBox(hwnd, szOutBuffer, TEXT("读到数据"), MB_OK);
return 0;
}
return 0;
case WM_DESTROY: //点击右上角关闭发送WM_DESTROY消息
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}