使用DirectUI技术模拟按钮控件
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow
){
static TCHAR szClassName[] = TEXT("HelloWin"); //窗口类名
HWND hwnd; //窗口句柄
MSG msg; //消息
WNDCLASS wndclass; //窗口类
//为窗口类的各个字段赋值
wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口风格
wndclass.lpfnWndProc = WndProc; //窗口过程
wndclass.cbClsExtra = 0; //暂时不需要理解
wndclass.cbWndExtra = 0; //暂时不需要理解
wndclass.hInstance = hInstance; //当前窗口句柄
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); //窗口图标
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); //鼠标样式
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH); //窗口背景画刷
wndclass.lpszMenuName = NULL ; //窗口菜单
wndclass.lpszClassName= szClassName; //窗口类名
//注册窗口
RegisterClass(&wndclass);
//创建窗口(并让窗口显示出来)
hwnd = CreateWindow(
szClassName, //窗口类的名字
TEXT("Welcome"), //窗口标题(出现在标题栏)
WS_OVERLAPPEDWINDOW, //窗口风格
CW_USEDEFAULT, //初始化时x轴的位置
CW_USEDEFAULT, //初始化时y轴的位置
500, //窗口宽度
300, //窗口高度
NULL, //父窗口句柄
NULL, //窗口菜单句柄
hInstance, //当前窗口的句柄
NULL //不使用该值
);
//显示窗口
ShowWindow (hwnd, iCmdShow);
//更新(绘制)窗口
UpdateWindow (hwnd);
//消息循环
while( GetMessage(&msg, NULL, 0, 0) ){
TranslateMessage(&msg); //翻译消息
DispatchMessage (&msg); //分派消息
}
return msg.wParam;
}
//窗口过程
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
PAINTSTRUCT ps;
HDC hdc;
TCHAR szText[20] = TEXT("点击这里"); //按钮文本
static HBRUSH hSolidBrush; //画刷
static HFONT hFont; //字体
static RECT rect = {60, 60, 260, 110}; //按钮坐标
static POINT pt; //鼠标点击时的坐标
switch (message){
case WM_CREATE:
//创建蓝色实心画刷
hSolidBrush = CreateSolidBrush(RGB(0, 0, 255));
//创建逻辑字体
hFont = CreateFont(
-15/*高度*/, -7.5/*宽度*/, 0/*不用管*/, 0/*不用管*/, 400 /*一般这个值设为400*/,
FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/,
DEFAULT_CHARSET, //这里我们使用默认字符集,还有其他以 _CHARSET 结尾的常量可用
OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, //这行参数不用管
DEFAULT_QUALITY, //默认输出质量
FF_DONTCARE, //不指定字体族*/
TEXT("微软雅黑") //字体名
);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
SelectObject(hdc, hFont); //将字体选入设备环境
SelectObject(hdc, hSolidBrush); //将画刷选入设备环境
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); //绘制矩形
SetTextColor( hdc, RGB(0xff, 0xff, 0xff) ); //设置按钮文本颜色为白色
SetBkMode(hdc, TRANSPARENT); //设置按钮文本背景为透明
TextOut(hdc, 128, 75, szText, wcslen(szText)); //输入按钮文本
EndPaint(hWnd, &ps);
break;
case WM_LBUTTONDOWN:
pt.x = LOWORD(lParam); //点击鼠标时的x坐标
pt.y = HIWORD(lParam); //点击鼠标时的y坐标
if(PtInRect(&rect, pt)){ //鼠标点击位置是否位于按钮内部
MessageBox(NULL, TEXT("感谢你的点击"), TEXT("提示"), MB_OK);
}
break;
case WM_DESTROY:
DeleteObject(hSolidBrush);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
运行效果:
点击按钮,弹出提示框。
