win32自绘按钮,使用GDI+(二)

一、解决上一篇的两个问题。

1、按钮背景透明

方法是,在绘制按钮之前,向按钮的父窗口发生WM_CTLCOLORBTN消息。该消息返回一个画刷句柄,系统使用该画刷句柄画出按钮的背景。所以我们在处理这个消息的时候,为系统返回一个空的画刷句柄就可以了。

直接在回调函数中添加代码

1    case WM_CTLCOLORBTN:
2         {
3             HBRUSH hBrush;
4             //hBrush = CreateSolidBrush(RGB(255, 0, 0));
5             hBrush=(HBRUSH)GetStockObject(NULL_BRUSH);
6             return (long)hBrush;
7         }

去掉FillRec函数,仍然可以实现下图效果:

 2、设置系统菜单栏为渐变色

响应WM_NCPAINT。该消息在窗口框架被绘制时被送去窗口。

这个还没尝试,我还是先一条路走到黑,继续用去掉标题栏,重绘这个思路。

WM_NCPAINT参考https://msdn.microsoft.com/ZH-CN/library/windows/desktop/dd145212(v=vs.85).aspx

 

二、可以在按钮上贴图,网上有直接将bitmap上面的某一种颜色设置成透明的,但我试过一个程式,貌似透明的色彩会有偏差,这里把这个问题留在这里。这里用到的简单的办法是用GDI+直接加载用ps处理过的透明png图片(GDI的api函数LoadImage不能加载png图片也是郁闷,而ps刚好又不能保存为.bmp背景透明),方法直接加载就可以了

1     Graphics graphics( pdis->hDC);
2     Image image(L"bitmap.png", FALSE);
3     graphics.DrawImage(&image, 0,0);

效果如下

 

三、接下来还有一个问题,就是怎样实现鼠标点击按钮和移动到按钮上,按钮具有某种特效,比如,背景色改变之类的。最后找到的方法是处理WM_MOUSEMOVE,WM_MOUSEHOVER和WM_MOUSELEAVE消息,为此似乎要为按钮窗口定义窗口过程。So, try to do it

 

转载于:https://www.cnblogs.com/lanf/p/5040672.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言中使用 GDI 绘图,需要使用 Windows API 中的 GDI 函数。以下是一个简单的示例: ```c #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 创建窗口 WNDCLASS wc = {0}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = "MyWindowClass"; RegisterClass(&wc); HWND hWnd = CreateWindow("MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); // 绘制图形 HDC hdc = GetDC(hWnd); Rectangle(hdc, 100, 100, 400, 400); MoveToEx(hdc, 100, 100, NULL); LineTo(hdc, 400, 400); ReleaseDC(hWnd, hdc); // 消息循环 MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } ``` 在上面的示例中,我们创建了一个窗口,并在窗口的客户区绘制了一个矩形和一条对角线。具体来说,我们在 `WinMain` 函数中获取了窗口的设备上下文(Device Context,简称 DC),然后使用 GDI 函数绘制了图形。最后,在消息循环中处理窗口消息。 需要注意的是,GDI 绘图是基于设备的,因此需要获取窗口的 DC 才能进行绘制。在绘制完成后,需要使用 `ReleaseDC` 函数释放 DC。此外,还有很多其他的 GDI 函数可以用于绘制各种不同的图形,例如 `Ellipse`、`Polygon`、`TextOut` 等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值