⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csdn_文档中心_[窗口重绘技术--虚拟窗口实现法].htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 2 页
字号:
    </TD>
    <TD align=middle width=620>
      <TABLE bgColor=#eeeeee border=0 cellPadding=0 cellSpacing=0 width=600>
        <TBODY>
        <TR bgColor=#ffffff>
          <TD align=middle height=10 width=50></TD>
          <TD align=right><A href="http://www.csdn.net/">CSDN</A> - <A 
            href="http://www.csdn.net/develop/">文档中心</A> - <FONT 
            color=#003399>Visual C++</FONT>&nbsp;&nbsp;&nbsp;&nbsp; </TD></TR>
        <TR>
          <TD align=middle height=5></TD>
          <TD align=middle width=500></TD></TR>
        <TR>
          <TD align=middle bgColor=#003399 height=10><FONT 
            color=#ffffff>标题</FONT></TD>
          <TD><B>&nbsp;&nbsp;&nbsp;&nbsp;[窗口重绘技术--虚拟窗口实现法]</B>&nbsp;&nbsp;&nbsp;&nbsp;huyoo(收藏) 
          </TD></TR>
        <TR>
          <TD align=middle height=5></TD>
          <TD align=middle width=500></TD></TR>
        <TR>
          <TD align=middle bgColor=#003399><FONT color=#ffffff>关键字</FONT></TD>
          <TD width=500>&nbsp;&nbsp;&nbsp;&nbsp;[Windows API 窗口重绘/VC]</TD></TR>
        <TR>
          <TD align=middle height=5></TD>
          <TD align=middle width=500></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
      <TABLE border=0 width=600>
        <TBODY>
        <TR>
          <TD align=left><BR>
            <P>1 
            Windows程序是图形窗口,各窗口之间可以互相切换。然而,就在这窗口的切换之中,涉及到一个窗口重绘的问题:当A窗口被B窗口覆盖或者部分覆盖之后,移去B窗口时,A窗口中的内容会被B窗口擦去……<BR>如下图:<BR><IMG 
            alt="" border=0 src="" dypop="user posted image">&nbsp;</P>
            <P>2---------------------------<BR>当B窗口移去的时候,如何实现A窗口的重绘呢?<BR>这里有三种方法:<BR>1)当窗口的内容是用某种计算方法创建的时候,可以的WM_PAINT消息处理之中再次计算重新绘出窗口。这种方法适用于计算量很小的情况,否则,计算时间太长,重绘效果仍然不理想~<BR><BR>2)预先保存窗口显示事件的记录,当窗口重绘的时候,再使这些事件发生。<BR><BR>3) 
            建立一个与显示窗口(屏幕上的应用程序窗口)对应的虚拟窗口(相当于它的镜子),每次向显示窗口中写内容时,同时也向虚拟窗口中写入同样的内容,两者始终保持同步。<BR>当B窗口移去时,会产生WM_PAINT消息,要求程序重绘窗口。这时,就可以直接将虚拟窗口中的内容复制到显示窗口中去,从而实现窗口的重绘!!这也是大多数Windows应用程序重绘窗口最常用的技术。<BR>如下图:<BR><IMG 
            alt="" border=0 src="" 
            dypop="user posted image"><BR><BR>3--------------------------<BR>实现<BR><BR>使用Windows 
            API来实现该技术。分为以下3个过程:<BR>1)创建虚拟窗口。(在WM_CREATE实现)<BR>2)向虚拟窗口同步输出(在绘图的过程中实现)<BR>3)重绘时,虚拟窗口拷贝到显示窗口(在WM_PAINT)中实现<BR><BR>附实现的源代码(如果将绿色的部分(有[color]标记的部分)注释掉,就会出现首贴中的那种不重绘的情况,因为DefWindowProc过程不会处理窗口重绘的,这写都需要程序员的劳动,所以程序员也不是吃干饭的,必须考虑周到,用最好的方法实现最好的功能-----------大家不妨试一试!)<BR><!--c1--><STRONG>代码</STRONG></P>
            <TABLE border=1>
              <TBODY>
              <TR>
                <TD>
                  <P>#include &lt;windows.h&gt;<BR>#include 
                  "resource.h"<BR><BR><BR><BR>//Globals<BR><BR><BR>//Proc<BR>LRESULT 
                  CALLBACK 
                  WndProc(HWND,UINT,WPARAM,LPARAM);<BR><BR>//*******************************************************************<BR>// 
                  &nbsp; 
                  WinMain<BR>//*******************************************************************<BR><BR><BR><BR><BR>HINSTANCE 
                  pInstance;<BR><BR><BR>int WINAPI WinMain (HINSTANCE 
                  hInstance,HINSTANCE hPrevInstance,<BR>&nbsp; &nbsp; PSTR 
                  szCmdLine,int iCmdShow)<BR>{<BR>static char 
                  szAppName[]="AppName";<BR>HWND hwnd;<BR>MSG 
                  &nbsp;msg;<BR><BR>WNDCLASSEX wndclass;<BR>wndclass.cbSize 
                  =sizeof(wndclass);<BR>wndclass.style 
                  =CS_HREDRAW|CS_VREDRAW;<BR>wndclass.lpfnWndProc 
                  =WndProc;<BR>wndclass.cbClsExtra =0;<BR>wndclass.cbWndExtra 
                  =0;<BR>wndclass.hInstance=hInstance;<BR>wndclass.hIcon 
                  =LoadIcon(NULL,IDI_APPLICATION);<BR>wndclass.hCursor 
                  =LoadCursor(NULL,IDC_ARROW);<BR>wndclass.hbrBackground 
                  =(HBRUSH)GetStockObject(WHITE_BRUSH);<BR>wndclass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);<BR>wndclass.lpszClassName 
                  =szAppName;<BR>wndclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);<BR><BR>RegisterClassEx(&amp;wndclass);<BR><BR>hwnd=CreateWindow(szAppName,<BR>&nbsp;"窗口标题",<BR>&nbsp;WS_OVERLAPPEDWINDOW,<BR>&nbsp;CW_USEDEFAULT,<BR>&nbsp;CW_USEDEFAULT,<BR>&nbsp;CW_USEDEFAULT,<BR>&nbsp;CW_USEDEFAULT,<BR>&nbsp;NULL,<BR>&nbsp;NULL,<BR>&nbsp;hInstance,<BR>&nbsp;NULL);<BR><BR><BR><BR>ShowWindow(hwnd,iCmdShow);<BR>UpdateWindow(hwnd);<BR><BR>while(GetMessage(&amp;msg,NULL,0,0))<BR>{<BR>&nbsp; 
                  TranslateMessage(&amp;msg);<BR>&nbsp; 
                  DispatchMessage(&amp;msg);<BR>}<BR>return 
                  msg.wParam;<BR>}<BR>//*******************************************************************<BR>// 
                  &nbsp; &nbsp; 
                  窗口过程<BR>//*******************************************************************<BR>LRESULT 
                  CALLBACK WndProc (HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM 
                  lParam)<BR>{<BR>HDC hdc;<BR>PAINTSTRUCT ps;<BR><BR>static HDC 
                  memDC;<BR>static HBITMAP hBitmap;<BR>HBRUSH hBrush;<BR>static 
                  int maxX,maxY;<BR>int 
                  response;<BR><BR>switch(iMsg)<BR>{<BR><BR>case 
                  WM_CREATE:{<BR><BR>&nbsp; &nbsp; &nbsp; [COLOR=green] 
                  maxX=GetSystemMetrics(SM_CXSCREEN);<BR>&nbsp; &nbsp; 
                  maxY=GetSystemMetrics(SM_CYSCREEN);<BR>&nbsp; &nbsp; hdc = 
                  GetDC (hwnd); &nbsp; //得到当前的设备描述表<BR>&nbsp; &nbsp; 
                  memDC=CreateCompatibleDC(hdc);//得到兼容的设备描述表<BR>&nbsp; &nbsp; 
                  hBitmap=CreateCompatibleBitmap(hdc,maxX,maxY);//创建兼容位图<BR>&nbsp; 
                  &nbsp; SelectObject(memDC,hBitmap);//将位图选入内存设备描述表<BR>&nbsp; 
                  &nbsp; 
                  hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH);//得到白色画刷<BR>&nbsp; 
                  &nbsp; SelectObject(memDC,hBrush);//将画刷选入内存设备描述表<BR>&nbsp; 
                  &nbsp; PatBlt(memDC,0,0,maxX,maxY,PATCOPY);//用当前画刷填充<BR>&nbsp; 
                  &nbsp; ReleaseDC(hwnd,hdc);//释放当前设备描述表[/COLOR] &nbsp; &nbsp; 
                  break;<BR>&nbsp; &nbsp; } <BR><BR>case 
                  WM_PAINT:<BR>&nbsp;hdc=BeginPaint(hwnd,&amp;ps);<BR>&nbsp;[COLOR=green]BitBlt(hdc,ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right-ps.rcPaint.left,ps.rcPaint.bottom-ps.rcPaint.top,<BR>&nbsp; 
                  memDC,ps.rcPaint.left,ps.rcPaint.top,SRCCOPY);//对需要重画的区域进行重画<BR>&nbsp; 
                  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//将memDC总得内容复制到hdc中去 
                  */[/COLOR] &nbsp;EndPaint(hwnd,&amp;ps);<BR>&nbsp;return 
                  0;<BR>case WM_COMMAND:<BR>&nbsp;switch(LOWORD 
                  (wParam))<BR>&nbsp;{<BR>&nbsp;case IDM_DRAW:<BR>&nbsp; 
                  hdc=GetDC(hwnd);<BR>&nbsp; int x,y,width,height;<BR>&nbsp; int 
                  red,green,blue;<BR>&nbsp; 
                  width=GetSystemMetrics(SM_CXFULLSCREEN);<BR>&nbsp; 
                  height=GetSystemMetrics(SM_CYFULLSCREEN);//得到客户区的高和宽<BR>&nbsp; 
                  for(x=0;x&lt;width;x++) &nbsp; //画出晚霞~<BR>&nbsp; 
                  &nbsp;for(y=0;y&lt;height;y++)<BR>&nbsp; &nbsp;{<BR>&nbsp; 
                  &nbsp; red=x*255/width;<BR>&nbsp; &nbsp; 
                  green=y*255/height;<BR>&nbsp; &nbsp; 
                  blue=(x*255/width+(height-y)*255/height)/2;<BR>&nbsp; &nbsp; 
                  SetPixel(hdc,x,y,RGB(red,green,blue));//输出到物理窗口<BR>&nbsp; 
                  &nbsp; 
                  [COLOR=green]SetPixel(memDC,x,y,RGB(red,green,blue));//输出到虚拟窗口[/COLOR] 
                  &nbsp; &nbsp;}<BR>&nbsp; &nbsp;ReleaseDC(hwnd,hdc);<BR>&nbsp; 
                  &nbsp;break;<BR><BR>&nbsp;case IDM_CLEAR:<BR>&nbsp; 
                  hdc=GetDC(hwnd);<BR>&nbsp; 
                  PatBlt(hdc,0,0,maxX,maxY,PATCOPY);//清除物理屏幕<BR>&nbsp; 
                  PatBlt(memDC,0,0,maxX,maxY,PATCOPY);//清除虚拟屏幕<BR>&nbsp; 
                  ReleaseDC(hwnd,hdc);<BR>&nbsp; break;<BR><BR><BR>&nbsp;case 
                  ID_EXIT:<BR><BR><BR>&nbsp; 
                  response=MessageBox(hwnd,"真的要退出吗?","退出",MB_YESNO);<BR>&nbsp; 
                  if(response==IDYES) PostQuitMessage(0);<BR>&nbsp; 
                  break;<BR><BR>&nbsp;}<BR>&nbsp;return 
                  0;<BR>&nbsp;break;<BR><BR>case WM_DESTROY:<BR><FONT 
                  color=#3e7d3e>&nbsp;</FONT><FONT 
                  color=#4dd52b>DeleteDC(memDC);//释放内存设备描述表<BR>&nbsp;DeleteObject(hBitmap);</FONT>&nbsp;PostQuitMessage(0);<BR>&nbsp;return 
                  0;<BR>}<BR>return 
                  DefWindowProc(hwnd,iMsg,wParam,lParam);<BR>}<BR></P><!--c2--></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0 
width=770>
  <TBODY>
  <TR bgColor=#006699>
    <TD align=middle bgColor=#006699 id=white><FONT 
    color=#ffffff>对该文的评论</FONT></TD>
    <TD align=middle>
      <SCRIPT src="CSDN_文档中心_[窗口重绘技术--虚拟窗口实现法].files/readnum.htm"></SCRIPT>
    </TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TH bgColor=#006699 id=white><FONT 
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
  <TBODY>
  <TR>
    <TD>你没有登陆,无法发表评论。 请先<A 
      href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=27620">登陆</A> 
      <A 
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>

<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
  <TBODY>
  <TR align=middle>
    <TD height=10 vAlign=bottom><A 
      href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A 
      href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A 
      href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A 
      href="http://www.csdn.net/english">English</A> </TD>
    <TD align=middle rowSpan=3><A 
      href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG 
      border=0 height=48 src="CSDN_文档中心_[窗口重绘技术--虚拟窗口实现法].files/biaoshi.gif" 
      width=40></A></TD></TR>
  <TR align=middle>
    <TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
  <TR align=middle>
    <TD vAlign=top><FONT face=Verdana>Copyright &copy; CSDN.net, Inc. All rights 
      reserved</FONT></TD></TR>
  <TR>
    <TD height=15></TD>
    <TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -