使用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; }运行效果:
点击按钮,弹出提示框。