透明背景怎么强制刷新

caozoe 2010-08-17 06:29:18
class MyDialog : public CWnd


int MyDialog ::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
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->GetSafeHwnd(),0,128,2); //128透明程度
FreeLibrary(hInst);
}
return 0;
}

这样实现的透明背景。

问题1.
在 OnCtlColor 中
pDC->SetBkMode(TRANSPARENT);
HBRUSH hbr=(HBRUSH)::GetStockObject(NULL_BRUSH);

这两句具体表现是什么?跟背景有什么关系么?(我的程序中没写这个,但是不知道具体怎么应用)

问题2.
我在Onpaint实现画栅栏。并在选中的方块中涂成红色。
问题是,我之前涂红色的怎么能擦除?
在OnLButtonUp 中有Invalidate(TRUE);能实现点下去,及时涂上颜色。但是再点下去,无法及时消除颜色。只有最小化,再打开,颜色才没有。想问下,怎么能及时擦除之前的颜色呢?
...全文
133 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2010-08-17
  • 打赏
  • 举报
回复
OnCreate中的代码是把窗口设置为半透明,并非实现透明背景。

一些控件在绘制时会给其父窗口发送WM_CTLCOLOR消息,父窗口在响应该消息时可以设置控件的背景色,对话框绘制时也会给自己发送这个消息。OnCtlColor中的两行代码是让对话框和发送WM_CTLCOLOR消息的空间不填充背景色,这样做也不是实现透明背景,只是让窗口不填充背景,使窗口后面原本显示的图象保留在窗口客户区中,当窗口中绘制了某些内容后,无法“擦除”,除非把窗口隐藏或裁剪,使其后面的窗口刷新。

使用SetLayeredWindowAttributes可以实现透明背景,具体做法是:自己定义一种特殊颜色表示透明,把窗口及所有控件背景都设置为此颜色,需要显示的内容不要使用此颜色。用SetLayeredWindowAttributes设置透明色(第2参数给出颜色值,第4参数给LWA_COLORKEY)。
hastings 2010-08-17
  • 打赏
  • 举报
回复
难道要双缓存?~~~~~
zgsdzhaolanxiang1 2010-08-17
  • 打赏
  • 举报
回复
UpdateWindow

15,979

社区成员

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

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