控件
控件概念
控件: 特殊的一类”子”窗口,系统已经定义好了窗口类型
创建方式和创建窗口类似,调用CreateWindow,每个控件都有自己的ID
控件事件发生后,会向所在的父窗口发送通知消息
可以使用SendMessage和PostMessage给控件发送消息
注意: 创建窗口时必须添加两个属性
- WS_CHILD:控件是放在我们的窗口上的,自然要作为窗口的子窗口,WS_CHILDWINDOW也一样
- WS_VISIBLE:设置可见
创建控件函数
HWND WINAPI CreateWindow( 类名, 显示内容, 风格, int x, int y,
int nWidth, int nHeight, 父窗口, 控件ID,
HINSTANCE hInstance, LPVOID lpParam );
按钮
窗口类名 BUTTON
按钮分类:
- 下压式按钮 BS_PUSHIBUTTON / BS_DEFPUSHIBUTTON
- 复选框 BS_CHECKBOX(点击选择时,需要自己维护选择状态) / BS_AUTOCHECKBOX(点击选择时,系统自动维护选择状态) / BS_3STATE(变灰的三种状态) / BS_AUTO3STATE(自动处理的三种状态)
- 单选框 BS_RADIOBUTTON / BS_AUTORADIOBUTTON
- 分组框 BS_GROUPBOX
按钮消息: WM_COMMAND
- LOWORD(wParam) 保存的是按钮ID
- HIWORD(wparam) 通知码BN_CLICKED
- lParam 子窗口句柄
设置按钮文本 - WM_SETTEXT
- SetWindowText
Demo
// ButtonDemo.cpp : 定义应用程序的入口点。
//
#include "framework.h"
#include "ButtonDemo.h"
#define MAX_LOADSTRING 100
#define DN_ID_PUSH_BUTTON WM_USER + 1
#define DN_ID_DEF_PUSH_BUTTON DN_ID_PUSH_BUTTON + 1
#define DN_ID_CHECK_BOX DN_ID_DEF_PUSH_BUTTON + 1
#define DN_ID_AUTO_CHECK_BOX DN_ID_CHECK_BOX + 1
#define DN_ID_3_STATE DN_ID_AUTO_CHECK_BOX + 1
#define DN_ID_AUTO_3_STATE DN_ID_3_STATE + 1
#define DN_ID_RADIO_BUTTON DN_ID_AUTO_3_STATE + 1
#define DN_ID_AUTO_RADIO_BUTTON DN_ID_RADIO_BUTTON + 1
#define DN_ID_GROUP_BOX DN_ID_AUTO_RADIO_BUTTON + 1
// 全局变量:
HINSTANCE hInst; // 当前实例
WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
HWND g_hPushButton;
HWND g_hDefPushButton;
HWND g_hCheckBox;
HWND g_hAutoCheckBox;
HWND g_h3State;
HWND g_hAuto3State;
HWND g_hRadioButton;
HWND g_hAutoRadioButton;
HWND g_hGroupBox;
// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
void CreateButton(HWND hwnd, HINSTANCE hInstance);
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此处放置代码。
// 初始化全局字符串
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_BUTTONDEMO, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_BUTTONDEMO));
MSG msg;
// 主消息循环:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// 函数: MyRegisterClass()
//
// 目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BUTTONDEMO));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_BUTTONDEMO);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
}
//
// 函数: InitInstance(HINSTANCE, int)
//
// 目标: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // 将实例句柄存储在全局变量中
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
CreateButton(hWnd, hInstance);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
void CreateButton(HWND hwnd, HINSTANCE hInstance)
{
//分组框
g_hGroupBox = CreateWindow(_T("BUTTON"), _T("GroupBox"), WS_VISIBLE | WS_CHILD | BS_GROUPBOX,
20, 20, 200, 500, hwnd, (HMENU)(DN_ID_GROUP_BOX), hInstance, NULL);
g_hPushButton = CreateWindow(L"BUTTON", L"PushButotn", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
50, 50, 80, 30, hwnd, (HMENU)(DN_ID_PUSH_BUTTON), hInstance, NULL);
g_hDefPushButton = CreateWindow(_T("BUTTON"), _T("DefPushButotn"), WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
50, 100, 150, 30, hwnd, (HMENU)(DN_ID_DEF_PUSH_BUTTON), hInstance, NULL);
g_hCheckBox = CreateWindow(_T("BUTTON"), _T("CheckBox"), WS_VISIBLE | WS_CHILD | BS_CHECKBOX,
50, 150, 150, 30, hwnd, (HMENU)(DN_ID_CHECK_BOX), hInstance, NULL);
g_hAutoCheckBox = CreateWindow(_T("BUTTON"), _T("AutoCheckBox"), WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,
50, 200, 150, 30, hwnd, (HMENU)(DN_ID_AUTO_CHECK_BOX), hInstance, NULL);
g_h3State = CreateWindow(_T("BUTTON"), _T("3State"), WS_VISIBLE | WS_CHILD | BS_3STATE,
50, 250, 150, 30, hwnd, (HMENU)(DN_ID_3_STATE), hInstance, NULL);
g_hAuto3State = CreateWindow(_T("BUTTON"), _T("Auto3State"), WS_VISIBLE | WS_CHILD | BS_AUTO3STATE,
50, 300, 150, 30, hwnd, (HMENU)(DN_ID_AUTO_3_STATE), hInstance, NULL);
//单选框
g_hRadioButton = CreateWindow(_T("BUTTON"), _T("RadioButton"), WS_VISIBLE | WS_CHILD | BS_RADIOBUTTON,
50, 350, 150, 30, hwnd, (HMENU)(DN_ID_RADIO_BUTTON), hInstance, NULL);
//单选框自动改变状态
g_hAutoRadioButton = CreateWindow(_T("BUTTON"), _T("AutoRadioButton"), WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
50, 400, 150, 30, hwnd, (HMENU)(DN_ID_AUTO_RADIO_BUTTON), hInstance, NULL);
}
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目标: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case DN_ID_PUSH_BUTTON: //按钮单机事件的处理
SendMessage((HWND)lParam, WM_SETTEXT, NULL, (WPARAM)_T("我被单击了"));
break;
case DN_ID_DEF_PUSH_BUTTON://按钮单机事件的处理
SetWindowText((HWND)lParam, _T("我被单击了"));
break;
case DN_ID_RADIO_BUTTON: //单选框
{
//获取单选框选中状态
LRESULT nRet = SendMessage(g_hRadioButton, BM_GETCHECK, 0, 0);
if (nRet == BST_CHECKED) //如果为选中状态
{
SendMessage(g_hRadioButton, BM_SETCHECK, BST_UNCHECKED, 0); //设置为未选中
}
else if (nRet == BST_UNCHECKED) //如果为未选中状态
{
SendMessage(g_hRadioButton, BM_SETCHECK, BST_CHECKED, 0); //设置为选中状态
}
else if (nRet == BST_INDETERMINATE) //为置灰状态
{
}
}
break;
case DN_ID_CHECK_BOX: //复选框
{
HWND hCheckBox = GetDlgItem(hWnd, DN_ID_CHECK_BOX); //根据id或者控件句柄
LRESULT nRet = SendMessage(hCheckBox, BM_GETCHECK, 0, 0);
if (nRet == BST_CHECKED) //如果为选中状态
{
SendMessage(hCheckBox, BM_SETCHECK, BST_UNCHECKED, 0); //设置为未选中
}
else if (nRet == BST_UNCHECKED) //如果为未选中状态
{
SendMessage(hCheckBox, BM_SETCHECK, BST_CHECKED, 0); //设置为选中状态
}
else if (nRet == BST_INDETERMINATE) //为置灰状态
{
}
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: 在此处添加使用 hdc 的任何绘图代码...
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
编辑框
窗口类名 EDIT
分类:
- 文字编辑框:显示单行文字/显示多行文字
- 密码编辑框:ES_PASSWORD,显示密码
窗口风格
通知消息
在WM_COMMAND case下 处理这个参数
if (HIWORD(wParam) == EN_CHANGE && LOWORD(wParam) == nEditID)
WM_GETTEXT —获取编辑框文本
wPararm - buffer 的大小 lPararm – buffer的首地址
SendMessage( (WPARAM) wParam, // number of characters to copy
WM_GETTEXTLENGTH-获取文本长度
SendMessage( (WPARAM) 0, (LPARAM) 0)
WM_SETTEXT设置内容
wParam – 没用,lParam – 准备设置内容的buffer的首地址
补充:
· SendMessage( hWndEdit, WM_CUT, 0, 0 );
· SendMessage( hWndEdit, WM_COPY, 0, 0 );
· SendMessage( hWndEdit, WM_CLEAR, 0, 0 )
静态框
窗口名称 STATIC 用来用来显示文字,加载图片(设置属性 SS_ICON/SS_BITMAP)
窗口消息: sendMessage 发送到控件即可 例如 STM_SETICON
组合框
组合框分类
简单组合框 CBS_SIMPLE (可以输入可以选择)
下拉式组合框 CBS_DROPDOWN (可以输入,可以选择)
下拉式列表组合框 CBS_DROPDOWNLIST (只可以选择不可以输入)
组合框发送消息
CB_ADDSTRING ----添加项(WPARAM—没用 LPARAM----字符串指针)
CB_INSERTSTRING 添加项
CB_DELETESTRING 删除制定项
CB_RESETCONTENT 清除所有项
CB_SETCURSEL 设置当前项
CB_GETCURSLE 获取当前项
CB_FINDSTRING 查找某项字符串
CB_GETLBTEXTLEN 获取选择的字符长度
CB_GETLBTEXT 获取选项的一个字符内容
CB_DIR 在组合框中显示制定路径下的文件和目录名字
CB_SETITENDATA 将数据保存到指定选项中
CB_GETITEMDATA 从指定选项中获取数据
菜单
获取菜单句柄
::LoadMenu( 程序实例instance,资源句柄 );
资源句柄使用MAKEINTRESOURCE(菜单ID);ID在resource.h里定义好了.
这个函数返回的是一个菜单句柄
hwnd = CreateWindowEx (
0,
szClassName,
"Code::Blocks Template Windows App",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
544,
375,
HWND_DESKTOP,
LoadMenu(hThisInstance,MAKEINTRESOURCE(IDR_MENU)), // MENU
hThisInstance, /* Program Instance handler */
NULL
);
注册窗口类是提供菜单句柄
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BUTTONDEMO));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;//MAKEINTRESOURCEW(IDC_BUTTONDEMO); //获取菜单句柄
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
}
手动添加
HMENU CreateMyMenu()
{
HMENU hRoot = CreateMenu();
HMENU pop1 = CreatePopupMenu();
AppendMenu(hRoot, MF_POPUP, (UINT_PTR)pop1, L"文件");
// 一种方法是使用AppendMenu函数
AppendMenu(pop1, MF_STRING, DN_ID_MENU_OPEN, L"打开");
// 另一种方法是使用InsertMenuItem函数
MENUITEMINFO mif;
mif.cbSize = sizeof(MENUITEMINFO);
mif.cch = 100;
mif.dwItemData = NULL;
mif.dwTypeData = (TCHAR*)L"保存";
mif.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mif.fState = MFS_ENABLED;
mif.fType = MIIM_STRING;
mif.wID = DN_ID_MENU_SAVE;
InsertMenuItem(pop1, DN_ID_MENU_SAVE, FALSE, &mif);
return hRoot;
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // 将实例句柄存储在全局变量中
HMENU hRoot = CreateMyMenu();
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, hRoot, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
CreateButton(hWnd, hInstance);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
自定义控件类
自定义按钮
// CustomWidget.cpp : 定义应用程序的入口点。
//
#include "framework.h"
#include "CustomWidget.h"
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst; // 当前实例
WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此处放置代码。
// 初始化全局字符串
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_CUSTOMWIDGET, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CUSTOMWIDGET));
MSG msg;
// 主消息循环:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
LRESULT CALLBACK MyBtnProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
RECT rect = { 0 };
GetWindowRect(hWnd, &rect);
int nWidth = rect.right - rect.left;
int nHegiht = rect.bottom - rect.top;
TCHAR szTitle[256] = { 0 };
int nTextCount = GetWindowText(hWnd, szTitle, 256);
SetBkColor(hdc, RGB(0, 0, 0));// 设置当前背景颜色
HBRUSH hbrush = CreateSolidBrush(RGB(0, 255, 0));//创建画刷
HBRUSH oldhbrush = (HBRUSH)SelectObject(hdc, hbrush);//选入设备环境
RoundRect(hdc, 2, 2, nWidth - 4, nHegiht - 4, nWidth / 10, nHegiht / 10);//画图
SelectObject(hdc, oldhbrush);//恢复先前画刷
DeleteObject(hbrush);//删除画刷
hbrush = (HBRUSH)GetStockObject(NULL_BRUSH);
oldhbrush = (HBRUSH)SelectObject(hdc, hbrush);//选入设备环境
SetTextColor(hdc, RGB(255, 0, 0));
SetBkColor(hdc, RGB(0, 0, 0));
SetBkMode(hdc, TRANSPARENT); // 设置透明
TextOut(hdc, 10, nHegiht / 4, szTitle, nTextCount);
SelectObject(hdc, oldhbrush);//恢复先前画刷
EndPaint(hWnd, &ps);
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
//
// 函数: MyRegisterClass()
//
// 目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CUSTOMWIDGET));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_CUSTOMWIDGET);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
RegisterClassExW(&wcex);
WNDCLASSEXW wcMyBtn = { 0 };
wcMyBtn.cbSize = sizeof(WNDCLASSEX);
//wcMyBtn.style = CS_HREDRAW | CS_VREDRAW;
wcMyBtn.lpfnWndProc = MyBtnProc;
wcMyBtn.hInstance = hInstance;
wcMyBtn.lpszClassName = _TEXT("MyBtn");
ATOM ret = RegisterClassExW(&wcMyBtn);
return ret;
}
//
// 函数: InitInstance(HINSTANCE, int)
//
// 目标: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // 将实例句柄存储在全局变量中
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目标: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
HWND hBtn = CreateWindow(_T("MyBtn"), _T("自定义按钮"), WS_VISIBLE | WS_CHILD,
20, 20, 100, 60, hWnd, (HMENU)567, hInst, NULL);
OutputDebugString(_TEXT("MainWindow Create"));
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: 在此处添加使用 hdc 的任何绘图代码...
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}