印第安人街头吹笛歌名:我重绘了对话框的标题栏、边框等。但有别的窗口在我对话框上面移动时,我重绘的对话框 刷新有点慢,有白色的残影。是怎么回事?

来源:百度文库 编辑:中财网 时间:2024/05/07 06:45:53
你没有使用区域刷新,所以会上层窗口移动导致残影.
你可以创建一个内存位图,在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的标题栏打开显示乱码,但打开相关链接就正常 怎摸去痘印啊?我这个红色的不重,但很久了