漳浦玄天上帝庙:我重绘了对话框的标题栏、边框等。但有别的窗口在我对话框上面移动时,我重绘的对话框 刷新有点慢,有白色的残影。是怎么回事?
来源:百度文库 编辑:偶看新闻 时间:2024/10/06 11:50:24
你没有使用区域刷新,所以会上层窗口移动导致残影.
你可以创建一个内存位图,在WM_SIZE时变化时先在这个内存位图里画好,然后在WM_NCPAINT消息里把这幅位图贴出来,这样效率更高.
在处理WM_NCPAINT时注意,当WM_NCPAINT的wParam是1时整个窗口非客户区都要进行得画,否你只需画某个区域.
你可以创建一个内存位图,在WM_SIZE时变化时先在这个内存位图里画好,然后在WM_NCPAINT消息里把这幅位图贴出来,这样效率更高.
在处理WM_NCPAINT时注意,当WM_NCPAINT的wParam是1时整个窗口非客户区都要进行得画,否你只需画某个区域.
LRESULT OnNcPaint(WPARAM wParam, LPARAM lParam){ HDC hDC; //窗口DC HDC hSkinDC; //皮肤DC HBITMAP hOldBitmap; //旧的位图 int nSaveDC; //保存DC CRect rcWindow; //窗口矩形 CRect rcClip; //剪切矩形 CRect rcExclude; //排除矩形(客户区的) GetWindowRect(m_hWnd, &rcWindow); GetClientRect(m_hWnd, &rcExclude); ClientToScreen(m_hWnd, (LPPOINT)&rcExclude); ClientToScreen(m_hWnd, (LPPOINT)&rcExclude+1); hDC = GetDCEx(m_hWnd, NULL, DCX_WINDOW|0x00010000L); //0x00010000L这是微软一个没公开的标记 if( wp == 1 ) { rcClip.SetRect(0, 0, rcWindow.Width(), rcWindow.Height(); } else { HRGN hRgn = reinterpret_cast
(wParam); GetRgnBox(hRgn, &rcClip); rcClip.OffsetRect(-rcWindow.TopLeft()); } //偏移位置 rcExclude.OffsetRect(-rcWindow.TopLeft()); rcWindow.OffsetRect(-rcWindow.TopLeft()); //窗口皮肤DC hSkinDC = CreateCompatibleDC(hDC); hOldBitmap = (HBITMAP)SelectObject(hSkinDC, m_hSaveBitmap); //m_hSaveBitmap是你在WM_SIZE里已画好的非客户区位图 //排除客户区 nSaveDC = SaveDC(hDC); ExcludeClipRect(hDC, rcExclude.left, rcExclude.top, rcExclude.right, rcExclude.bottom); //贴到屏上来 BitBlt(hDC, rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), hSkinDC, rcClip.left, rcClip.top, SRCCOPY); //释放资源 SelectObject(hSkinDC, hOldBitmap); DeleteDC(hSkinDC); RestoreDC(hDC, nSaveDC); ReleaseDC(m_hWnd, hDC);return 0;}//这是保存位图,放到WM_SIZE里
LRESULT OnSize(WPARAM wParam, lParam)
{
CRect rcWindow;
GetWindowRect(m_hWnd, &rcWindow);
SaveBitmap(rcWindow.Width(), rcWindow.Height());
// 重窗口
RedrawWindow(m_hWnd, NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INTERNALPAINT|RDW_INVALIDATE);
}
// 这里
BOOL SaveBitmap(int nWidth, int nHeight)
{
if( nWidth == 0 || nHeight == 0 )
return FALSE;
if( m_hSaveBitmap )
{
DeleteObject(m_hSaveBitmap);
m_hSaveBitmap = NULL;
}
HDC hDC, hMemDC;
HBITMAP hOldBitmap;
hDC = GetDCEx(m_hWnd, NULL, DCX_CACHE); //获得高速缓存DC
//窗口内存DC和保存位图
hMemDC = CreateCompatibleDC(hDC);
m_hSaveBitmap = CreateCompatibleBitmap(hDC, nWidth, nHeight);
hOldBitmap = (HBITMAP)SelectObject(hMemDC, m_hSaveBitmap);
//填充颜色
SetRect(&rect, 0, 0, nWidth, nHeight);
SetBkColor(hMemDC, RGB(255,255,255));
ExtTextOut(hMemDC, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL);
/////////////////////////////////////////////////////////
//下面你就可以在hMemDC上画出你窗口皮肤了,画出来的界面会保存在m_hSaveBitmap中,供WM_NCPAINT中使用
//释放资源
SelectObject(hMemDC, hOldBitmap);
DeleteDC(hMemDC);
ReleaseDC(m_hWnd, hDC);
}
这样有个好外就是只有当窗口大小发生变化时才绘制整窗口,否则它只会拿出以前保存的位画在屏幕上,这个可以极大的优化窗口重绘方式
我的IE只有标题栏了但有网页内容
我的电脑的XP的 但不知道为什么关机的时候出现的98的界面 要下拉一个对话框 让选择关机,重起等
我在对话框中显示HTML的时候总有那个粗粗的边框,各们大虾,有没有办法把边框给灭了?
遨游的整个标题栏工具栏等都隐藏了,怎么办?
我的IE只剩标题栏了!!
我的任务管理器没有了标题栏
我在world2003中插入了一个竖直文本框,但无法消除周围的边框,怎么办
请教VC 我用MFC 问:可不可以将对话框的标题栏隐藏
系统登录时的对话框标题栏是灰色的,怎么回事??
我的女朋友有别的男的了怎么办?
找有闪底、边框等素材的网站
急:我的IE浏览器标题栏没有了,怎么办?
我的IE外观只剩下标题栏了怎麽办?
紧急求救!我的IE只有标题栏了~
我的任务管理器没有标题栏了是为什么呀?
我的ie浏览器工具栏标题栏没了
系统问题:我的浏览器打开没有标题栏了?(急)
为什么我的窗口标题栏变成了这样??
我梦见了我家新房子有别人家的死人
我的IE没办法打开网页.等了很久都是空白的.但我系统更新了一个安全补丁后.重启.IE又正常了.
为什么我的浏览器窗口只有标题栏,没有地址栏,菜单栏,工具栏等
请问为什么我的IE6.0浏览器只有标题栏,而菜单栏、工具栏等不翼而飞?
我的IE的标题栏打开显示乱码,但打开相关链接就正常
怎摸去痘印啊?我这个红色的不重,但很久了