窗体透明,而上面的控件不透明的问题!麻烦来解决一下

yemeng111 2010-10-16 09:49:43
建立了一个对话框,使对话框透明,但是对话框上面的控件不透明,自己找了一些资料,实现了,代码如下:
OnInitDialog中添加以下代码:
COLORREF maskColor = RGB(255,255,255);
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);
}
else ;

FreeLibrary(hInst);

}
OnPaint函数中的else分支添加以下代码:
CRect rect;
CPaintDC dc(this);
GetClientRect(&rect);
dc.FillSolidRect(rect,RGB(255,255,255));


现在效果可以实现,但是当你对话框的border为None时,这个对话框就拖动不了,即使改成有边框,只能按住对话框的标题栏拖,鼠标放在对话框的窗体上还拖不了,这个怎么处理,知道的来帮忙解决一下!!!!!!
...全文
647 11 打赏 收藏 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-11-14
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
xiaohuh421 2010-10-19
  • 打赏
  • 举报
回复
楼主注意:当你把窗口透明后,你如果想选中窗口的话,你点击透明的部份是没有用的.如果你自已的窗口中只有按钮哦,编辑框这类会拦截对话框消息的控件,那么移动的话就会有问题,只能在pretranslatemsg中进行控制

http://download.csdn.net/source/2682377
这里有个例子,在创建透明窗口后,只要鼠标放在文字按下左键上面就能拖动窗口,只不过字体有点小,不容易选中个.
yemeng111 2010-10-16
  • 打赏
  • 举报
回复
楼上的,你的方法不行啊
yemeng111 2010-10-16
  • 打赏
  • 举报
回复
楼上的,你的方法不行啊!
看不见的裂痕 2010-10-16
  • 打赏
  • 举报
回复
1楼的方法可能有问题,因为CDialog本身会屏蔽一些消息,OnLButtonDown貌似就是其中一个.如果调试不成功,可以用PretranslateMessage尝试.
贪玩的老鼠 2010-10-16
  • 打赏
  • 举报
回复
void CXXXDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
CDialog::OnLButtonDown(nFlags, point);
}
toyuk 2010-10-16
  • 打赏
  • 举报
回复
如果不可以,可以把
if(fun)fun(this->m_hWnd  ,0x00EDE9EB,128,1);//0x00EDE9EB透明色
这是的0x00EDE9EB换成RGB(236,233,216)就可以了
魔都小强 2010-10-16
  • 打赏
  • 举报
回复
只能给你这些了,其实网上应该有很多的!~下面这个是贴透明Png的,放在OnInitDialog中。

//透明窗体填充
void CTransBG::FillWin()
{
//设置窗体相关属性
m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000
m_Blend.BlendFlags=0; //nothingelseisspecial...
m_Blend.AlphaFormat=1; //...
m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA

//窗体样式为0x80000为层级窗体
DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);
SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);

//绘制内存位图
HDC hdcTemp=GetDC()->m_hDC;
m_hdcMemory=CreateCompatibleDC(hdcTemp);
HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,500,500);
SelectObject(m_hdcMemory,hBitMap);

//使用GDI+载入PNG图片
HDC hdcScreen=::GetDC (m_hWnd);
RECT rct;
GetWindowRect(&rct);
POINT ptWinPos={rct.left,rct.top};
Graphics graph(m_hdcMemory); //GDI+中的类
Image image(L"bk.png",TRUE); //GDI+中的类
graph.DrawImage(&image,0,0,500, 400); //后面两个参数要设置成跟图片一样大小,否则会失真

//使用UpdateLayerWindow进行窗口透明处理
HMODULE hFuncInst=LoadLibrary("User32.DLL");
typedef BOOL (WINAPI *MYFUNC)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD);
MYFUNC UpdateLayeredWindow;
UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst,"UpdateLayeredWindow");
SIZE sizeWindow={/*267,154*/500, 400};
POINT ptSrc={0,0};
UpdateLayeredWindow( m_hWnd,hdcScreen,&ptWinPos,&sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2);
}
toyuk 2010-10-16
  • 打赏
  • 举报
回复
把给我吧.等待
在OnInitDialog加入	

SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->m_hWnd ,0x00EDE9EB,128,1);//0x00EDE9EB透明色
FreeLibrary(hInst);
}
魔都小强 2010-10-16
  • 打赏
  • 举报
回复
我是用两个窗体类实现的,一个类贴透明的PNG;一个类就是放置控件等,后者的窗体是透明的。再控制大家的Moving.

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧