📄 csdn_文档中心_[窗口重绘技术--虚拟窗口实现法].htm
字号:
</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> </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> [窗口重绘技术--虚拟窗口实现法]</B> 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> [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"> </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 <windows.h><BR>#include
"resource.h"<BR><BR><BR><BR>//Globals<BR><BR><BR>//Proc<BR>LRESULT
CALLBACK
WndProc(HWND,UINT,WPARAM,LPARAM);<BR><BR>//*******************************************************************<BR>//
WinMain<BR>//*******************************************************************<BR><BR><BR><BR><BR>HINSTANCE
pInstance;<BR><BR><BR>int WINAPI WinMain (HINSTANCE
hInstance,HINSTANCE hPrevInstance,<BR> PSTR
szCmdLine,int iCmdShow)<BR>{<BR>static char
szAppName[]="AppName";<BR>HWND hwnd;<BR>MSG
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(&wndclass);<BR><BR>hwnd=CreateWindow(szAppName,<BR> "窗口标题",<BR> WS_OVERLAPPEDWINDOW,<BR> CW_USEDEFAULT,<BR> CW_USEDEFAULT,<BR> CW_USEDEFAULT,<BR> CW_USEDEFAULT,<BR> NULL,<BR> NULL,<BR> hInstance,<BR> NULL);<BR><BR><BR><BR>ShowWindow(hwnd,iCmdShow);<BR>UpdateWindow(hwnd);<BR><BR>while(GetMessage(&msg,NULL,0,0))<BR>{<BR>
TranslateMessage(&msg);<BR>
DispatchMessage(&msg);<BR>}<BR>return
msg.wParam;<BR>}<BR>//*******************************************************************<BR>//
窗口过程<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> [COLOR=green]
maxX=GetSystemMetrics(SM_CXSCREEN);<BR>
maxY=GetSystemMetrics(SM_CYSCREEN);<BR> hdc =
GetDC (hwnd); //得到当前的设备描述表<BR>
memDC=CreateCompatibleDC(hdc);//得到兼容的设备描述表<BR>
hBitmap=CreateCompatibleBitmap(hdc,maxX,maxY);//创建兼容位图<BR>
SelectObject(memDC,hBitmap);//将位图选入内存设备描述表<BR>
hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH);//得到白色画刷<BR>
SelectObject(memDC,hBrush);//将画刷选入内存设备描述表<BR>
PatBlt(memDC,0,0,maxX,maxY,PATCOPY);//用当前画刷填充<BR>
ReleaseDC(hwnd,hdc);//释放当前设备描述表[/COLOR]
break;<BR> } <BR><BR>case
WM_PAINT:<BR> hdc=BeginPaint(hwnd,&ps);<BR> [COLOR=green]BitBlt(hdc,ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right-ps.rcPaint.left,ps.rcPaint.bottom-ps.rcPaint.top,<BR>
memDC,ps.rcPaint.left,ps.rcPaint.top,SRCCOPY);//对需要重画的区域进行重画<BR>
//将memDC总得内容复制到hdc中去
*/[/COLOR] EndPaint(hwnd,&ps);<BR> return
0;<BR>case WM_COMMAND:<BR> switch(LOWORD
(wParam))<BR> {<BR> case IDM_DRAW:<BR>
hdc=GetDC(hwnd);<BR> int x,y,width,height;<BR> int
red,green,blue;<BR>
width=GetSystemMetrics(SM_CXFULLSCREEN);<BR>
height=GetSystemMetrics(SM_CYFULLSCREEN);//得到客户区的高和宽<BR>
for(x=0;x<width;x++) //画出晚霞~<BR>
for(y=0;y<height;y++)<BR> {<BR>
red=x*255/width;<BR>
green=y*255/height;<BR>
blue=(x*255/width+(height-y)*255/height)/2;<BR>
SetPixel(hdc,x,y,RGB(red,green,blue));//输出到物理窗口<BR>
[COLOR=green]SetPixel(memDC,x,y,RGB(red,green,blue));//输出到虚拟窗口[/COLOR]
}<BR> ReleaseDC(hwnd,hdc);<BR>
break;<BR><BR> case IDM_CLEAR:<BR>
hdc=GetDC(hwnd);<BR>
PatBlt(hdc,0,0,maxX,maxY,PATCOPY);//清除物理屏幕<BR>
PatBlt(memDC,0,0,maxX,maxY,PATCOPY);//清除虚拟屏幕<BR>
ReleaseDC(hwnd,hdc);<BR> break;<BR><BR><BR> case
ID_EXIT:<BR><BR><BR>
response=MessageBox(hwnd,"真的要退出吗?","退出",MB_YESNO);<BR>
if(response==IDYES) PostQuitMessage(0);<BR>
break;<BR><BR> }<BR> return
0;<BR> break;<BR><BR>case WM_DESTROY:<BR><FONT
color=#3e7d3e> </FONT><FONT
color=#4dd52b>DeleteDC(memDC);//释放内存设备描述表<BR> DeleteObject(hBitmap);</FONT> PostQuitMessage(0);<BR> 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 © 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 + -