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

所有版本的Windows上的Win32透明控件

发布时间:2020-12-14 01:54:46 所属栏目:Windows 来源:网络整理
导读:我正在使用普通的Win32 API(没有MFC或.NET)开发Win32 GUI应用程序.我遇到的问题是使控件显得透明.我想出了一个适用于大多数事情的方法,在 Windows Vista中,我在WndProc中执行此操作: case WM_CTLCOLORSTATIC:{ SetBkMode((HDC)wParam,TRANSPARENT); return
我正在使用普通的Win32 API(没有MFC或.NET)开发Win32 GUI应用程序.我遇到的问题是使控件显得透明.我想出了一个适用于大多数事情的方法,在 Windows Vista中,我在WndProc中执行此操作:

case WM_CTLCOLORSTATIC:
{
    SetBkMode((HDC)wParam,TRANSPARENT);
    return (INT_PTR)::GetStockObject(NULL_PEN);
}
break;

在Windows XP中,我在WndProc中执行此操作:

case WM_CTLCOLORSTATIC:
{
    HBRUSH hbr = (HBRUSH)DefWindowProc(hDlg,message,wParam,lParam);
    ::DeleteObject(hbr);
    SetBkMode((HDC)wParam,TRANSPARENT);
    return (LRESULT)(HBRUSH)(COLOR_WINDOW);
}

现在这适用于大多数控件,但是我在组框控件顶部的标签上获得透明背景,该控件在文本中绘制组框线.我开始研究一个只有组合箱的情况,但我确信这是一个必须先解决的问题,我不想重新发明轮子.

是否有经过试验和测试的方法使控件看起来透明?

谢谢,
?

解决方法

要实现透明控制,您必须意识到:

>你不能真的.标准的Windows控件只是不支持“透明”绘画.
>即使你做对了,如果调整大小,对话框也会闪烁不正常.
>如果打开或关闭主题,并且在Windows版本之间进行更改,那么获得透明控件工作的“黑客”往往会有所不同.

通常,使控件“透明”的目标是使控件下的位图皮肤显示出来.实现这种透明性的方法是为控件的背景创建一个位图.然后使用位图中的CreatePatternBrush.

这一块DialogProc代码实现了最简单的skinning方法,然后将绘制对话框的背景和支持这种绘制形式的大多数控件:

// _hwnd is the dialogs handle
  // _hbrSkin is a pattern brush handle
  HWND hwndCtl;
  POINT pt;
  HDC hdc;
case WM_CTLCOLORDLG:
  return (INT_PTR)_hbrSkin;
case WM_CTLCOLORSTATIC:
case WM_CTLCOLORBTN:
  hdc = (HDC)wParam;
  SetBkMode(hdc,TRANSPARENT); // Ensure that "static" text doesn't use a solid fill
  pt.x = 0; pt.y = 0;
  MapWindowPoints(hwndCtl,_hwnd,&pt,1);
  SetBrushOrgEx(hdc,-pt.x,-pt.y,NULL);
  return (INT_PTR)_hbrSkin;

重叠的控件将绘制错误,因为将“透明”背景绘制在另一个上.您可以通过以下方式减少闪烁:

>不允许调整对话框的大小.>在对话框上设置WS_EX_COMPOSITED样式,但由于Windows NT 6 DWM不支持它,它在Vista上基本没用.>在对话框中设置WS_CLIPCHILDREN样式&或WS_CLIPSIBLINGS – 这些样式阻止使用组框和选项卡控件,因为它们依赖于控件重叠.>继承所有控件,使用WM_PRINTCLIENT消息将它们绘制到后备缓冲区,然后在一次传递中将准备好的后备缓冲区blit.努力而不是所有控件都支持WM_PRINTCLIENT.

(编辑:李大同)

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

    推荐文章
      热点阅读