加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

xp主题控制的透明背景

发布时间:2020-12-14 04:28:17 所属栏目:Windows 来源:网络整理
导读:我在位图上绘制了一些窗口控件,在对话框上绘制了彩色背景.是否有一些可能的方法使窗口控件的背景透明?目前,它们显示对话框的默认彩色背景. 示例 – 我尝试粘贴一个纯蓝色位图,两个按钮控件具有明显的默认彩色矩形背景. 解决方法 这可以通过为 Windows提供一
我在位图上绘制了一些窗口控件,在对话框上绘制了彩色背景.是否有一些可能的方法使窗口控件的背景透明?目前,它们显示对话框的默认彩色背景.

示例 – 我尝试粘贴一个纯蓝色位图,两个按钮控件具有明显的默认彩色矩形背景.

解决方法

这可以通过为 Windows提供一个句柄来轻松解决,这个句柄可以用于绘制按钮背景的任何画笔.只要在按钮的父窗口的消息处理程序中收到 WM_CTLCOLORBTN message,就可以执行此操作.

我嘲笑了一个小型的演示应用程序,它可以并排比较两个不同的按钮.两者都是标准的Win32 BUTTON控件,但左边的控件处理WM_CTLCOLORBTN消息并指定与窗口背景颜色相同的画笔.您可以立即看到差异 – 按钮矩形周围的浅灰色(或者更确切地说,3D控件的默认颜色,COLOR_3DFACE)条纹消失了,按钮看起来与自定义背景颜色相比要好得多:

该效果也适用于启用了视觉主题的Windows XP – 这是同一个应用程序的屏幕截图:

我用来创建上述效果的代码几乎是非常简单的.将其添加到应用程序的主窗口过程(MainWndProc),如上所述.您无需触摸按钮.

HBRUSH hButtonBackColor = NULL;

LRESULT CALLBACK MainWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
   switch(msg)
   {
      case WM_CTLCOLORBTN:
      {
         if (!hButtonBackColor)
         {
            // Create the brush,if it hasn't already been created.
            // (You can use any type of brush here; this is just an example.)
            hButtonBackColor = GetSysColorBrush(COLOR_3DDKSHADOW);
         }
         return (LRESULT)hButtonBackColor;
      }

      // ...
   }
}

但是,请确保您指定的画笔表示与窗口背景颜色完全相同的颜色 – 透明画笔可能无法正常工作.同样,对于带图案的画笔(有人再使用它们吗?),需要将brush’s origin设置为与背景相匹配.

始终确保通过拨打DeleteObject释放您创建的任何刷子!在C中,您可以通过使CBrush对象(或等效对象)成为对话框类的成员来实现此目的,以便自动销毁它.在C中,您需要处理WM_NCDESTROY消息并手动删除画笔.

另请注意,您无需指定BS_OWNERDRAW style以使此技巧起作用.上面的示例使用两个标准按钮控件,仅使用以下窗口样式标志创建:WS_CHILD,WS_VISIBLE和BS_PUSHBUTTON.

当然,如果你的设计比上面的例子复杂(例如,你的按钮重叠多个背景),你可能不得不采用所有者绘制路线.我认为这对于一个像你似乎描述的那个简单的任务来说太过分了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读