一生一世学坛

 找回密码
 立即注册
搜索
查看: 8490|回复: 0
打印 上一主题 下一主题

VC窗口透明而窗口上的文字不透明

[复制链接]

334

主题

385

帖子

6816

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6816
跳转到指定楼层
楼主
发表于 2020-4-20 14:21:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

VC窗口透明而窗口上的文字不透明:

1、第一步实现窗口透明而控件不透明:

运用这里提供的方法,可以实现背景颜色的透明。

其原理是使用SetLayeredWindowAttributes对对话框进行的Alpha的操作。

以MFC的对话框为例讲下具体方法:

(1)OnInitDialog()中

// TODO: 在此添加额外的初始化代码
COLORREF maskColor = RGB(255,0,0);//红色
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst=LoadLibrary(_T("User32.DLL"));
if(hInst)
{
typedef BOOL (WINAPI * MYFUNC)(HWND , COLORREF,BYTE,DWORD);
MYFUNC fun=NULL;
fun=(MYFUNC)GetProcAddress(hInst,"SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),maskColor,255,1);
FreeLibrary(hInst);
}

(2)在OnPaint中重绘,修改对话框背景色为红色

else
{
CRect rect;
CPaintDC dc(this);
GetClientRect(rect);
dc.FillSolidRect(rect,RGB(255,0,0));


CDialogEx::OnPaint();
}


2、实现静态文字框的背景透明,文字不透明:

VC中设置STATIC控件背景,比如透明

假设static控件ID为IDC_STATIC1:

然后重载对话框的WM_CTLCOLOR消息响应函数:


在OnCtlColor中添加如下代码:


HBRUSH CYourDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);


// TODO: Change any attributes of the DC here

switch(pWnd->GetDlgCtrlID())

{

     case IDC_STATIC1:

      pDC->SetBkMode(TRANSPARENT);

      pDC->SetTextColor(RGB(0,0,0));

      return (HBRUSH)GetStockObject(HOLLOW_BRUSH);

    default: break;

}


// TODO: Return a different brush if the default is not desired

return hbr;

}

这里主要是因为使用白色的话,会把菜单栏都透明了,无法响应鼠标拖拽对话框及关闭等。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|分享学习  

GMT+8, 2024-5-2 15:52 , Processed in 0.042657 second(s), 5 queries , File On.

声明:本站严禁任何人以任何形式发表违法言论!

本站内容由网友原创或转载,如果侵犯了您的合法权益,请及时联系处理!© 2017 zamxqun@163.com

皖公网安备 34010402700634号

皖ICP备17017002号-1

快速回复 返回顶部 返回列表