所有按钮都是子窗口。
#include <windows.h>
#include <windowsx.h> //使用Button_GetCheck这个宏必须包含这个头文件
#include <stdio.h>
#define null NULL
//窗口过程
LRESULT CALLBACK MyWindowProc
(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
//普通按钮
HWND hBtn = CreateWindow(L"button",L"普通按钮",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
30,30,80,30,hWnd,(HMENU)1000,
pcs->hInstance,NULL);
//单选按钮
HWND hBtn2 = CreateWindow(L"button", L"单选按钮", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
30, 70, 80, 50, hWnd, (HMENU)1001,
pcs->hInstance, NULL);
//多选按钮
HWND hBtn3 = CreateWindow(L"button", L"多选按钮", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
30, 100, 80, 50, hWnd, (HMENU)1002,
pcs->hInstance, NULL);
return 0;
}
case WM_COMMAND:
{
WORD id = LOWORD(wParam);
WORD code = HIWORD(wParam);
HWND hCtrl = (HWND)lParam;
if ( id == 1000 && code == BN_CLICKED )
{
MessageBox(hWnd,L"普通按钮被单击了!",L"提示",MB_OK);
}
else if (id == 1001 && code == BN_CLICKED )
{
MessageBox(hWnd, L"单选按钮被单击了!", L"提示", MB_OK);
if ( SendMessage(hCtrl,BM_GETCHECK,0,0) == BST_CHECKED )
{
MessageBox(hWnd, L"单选按钮被选中了!", L"提示", MB_OK);
}
else if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_UNCHECKED)
{
MessageBox(hWnd, L"单选按钮没有被选中了!", L"提示", MB_OK);
}
}
else if (id == 1002 && code == BN_CLICKED )
{
MessageBox(hWnd, L"多选按钮被单击了!", L"提示", MB_OK);
//if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED)
//{
// MessageBox(hWnd, L"多选按钮被选中了!", L"提示", MB_OK);
//}
//else if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_UNCHECKED)
//{
// MessageBox(hWnd, L"多选按钮没有被选中了!", L"提示", MB_OK);
//}
if ( Button_GetCheck(hCtrl) == BST_CHECKED )
MessageBox(hWnd, L"多选按钮被选中了!", L"提示", MB_OK);
else if (Button_GetCheck(hCtrl) == BST_UNCHECKED)
MessageBox(hWnd, L"多选按钮没有被选中了!", L"提示", MB_OK);
}
break;
}
case WM_LBUTTONDOWN:
{
char str[64];
sprintf(str, "鼠标左键按下:%d %d\n", LOWORD(lParam), HIWORD(lParam));
OutputDebugStringA(str);
break;
}
case WM_LBUTTONUP:
{
char str[64];
sprintf(str, "鼠标左键弹起:%d %d\n", LOWORD(lParam), HIWORD(lParam));
OutputDebugStringA(str);
break;
}
case WM_MOUSEMOVE:
{
char str[64];
sprintf(str, "鼠标移动:%d %d\n", LOWORD(lParam), HIWORD(lParam));
OutputDebugStringA(str);
break;
}
case WM_LBUTTONDBLCLK:
{
char str[64];
sprintf(str, "鼠标双击:%d %d\n", LOWORD(lParam), HIWORD(lParam));
OutputDebugStringA(str);
break;
}
//键盘消息
case WM_KEYDOWN:
{
char str[64];
sprintf(str, "键盘按下:%x %c\n", wParam, wParam);
OutputDebugStringA(str);
break;
}
case WM_CHAR:
{
char str[64];
sprintf(str, "字符消息:%x %c\n", wParam, wParam);
OutputDebugStringA(str);
break;
}
case WM_KEYUP:
{
char str[64];
sprintf(str, "键盘弹起:%x %c\n", wParam, wParam);
OutputDebugStringA(str);
break;
}
case WM_ERASEBKGND:
{
static int j = 0;
char str1[64];
sprintf(str1, "第%d次产生WM_ERASEBKGND!\n", j++);
OutputDebugStringA(str1); //在输出窗口打印信息
return 1;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
static int i = 0;
char str[64];
sprintf(str, "第%d次产生WM_PAINT!\n", i++);
OutputDebugStringA(str); //在输出窗口打印信息
EndPaint(hWnd, &ps);
return 0;
break;
}
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//窗口过程函数,用于处理消息
wnd.lpfnWndProc = MyWindowProc;
wnd.lpszClassName = L"MrVurtual";
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类样式 如果不加CS_DBLCLKS,不会显示双击
wnd.hInstance = hInstance;
RegisterClass(&wnd);
//创建窗口 WM_CREATE
HWND hWnd = CreateWindow(L"MrVurtual", L"第一个窗口程序", WS_OVERLAPPEDWINDOW,
100, 100, 300, 300, NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口 WM_PAINT
UpdateWindow(hWnd);
//消息循环 收到WM_QUIT消息退出
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
return 0;
}