subject_19593.htm

来自「一些关于vc的问答」· HTM 代码 · 共 72 行

HTM
72
字号
<p>
序号:19593 发表者:编程吧 发表日期:2002-10-30 00:55:47
<br>主题:是谁在重画?
<br>内容:<BR>LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp; HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hdc ;<BR>&nbsp;&nbsp;&nbsp;&nbsp; PAINTSTRUCT ps ;<BR>&nbsp;&nbsp;&nbsp;&nbsp; RECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect ;<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; switch (message)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>...<BR>...<BR>&nbsp;&nbsp;&nbsp;&nbsp; case WM_PAINT:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; case WM_LBUTTONDOWN:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hdc = BeginPaint (hwnd, &ps) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetClientRect (hwnd, &rect) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EndPaint (hwnd, &ps) ;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>...<BR>...<BR>}<BR>我在WM_PAINT什么都没做,但窗口还是在重画,到底是谁在完成这个工作
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:未出手的飞刀 回复日期:2002-10-30 15:13:24
<br>内容:<BR>在WM_PAINT什么也不做也要调用BeginPaint 和 EndPaint以使无效矩形区域失效,不然WM_PAINT会一直被系统发出,不断调用WndProc 
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:编程吧 回复日期:2002-10-30 16:00:18
<br>内容:那么是谁在调用BeginPaint 和 EndPaint
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:xiongli 回复日期:2002-10-30 18:29:19
<br>内容:你逻辑不正确<BR>是这样的,当你鼠标点的时候,就算画了的但是你看不到.为什么呢,因为最后保留下来的东西是<BR>&nbsp;&nbsp;&nbsp;&nbsp; case WM_PAINT:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0 ;<BR><BR>做的东西,你却return 0;<BR>就是说什么都不做.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:编程吧 回复日期:2002-10-30 22:49:47
<br>内容:但程序运行了不是这样<BR>当我鼠标点击后,我能看到我所画的,<BR>而且在移动窗口时,我在鼠标点击时所画的(即"Hello, Windows 98!")也能够看见,<BR>只有当另外一个窗口覆盖了我的程序窗口时,那几个字才会不见。<BR><BR>我想问的就是,我在移动窗口时,是谁在写那几个字,<BR>难道移动窗口并不触发ON_PAINT?一切都是windows自己完成的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:未出手的飞刀 回复日期:2002-10-30 23:15:48
<br>内容:<BR>点饥发生WM_LBUTTONDOWN,所以画出来,<BR>移动时window会判断需不需要重画,<BR>但即使重画了你的WM_PAINT处理什么也不做也会使"Hello, Windows 98!不消失。<BR>当另外一个窗口覆盖了程序窗口,一定会发生WM_PAINT,但你什么也没做,所以什么也没有画。<BR><BR>在移动窗口时,没有代码在写那几个字,是dc保存了窗口的显示。<BR><BR>还有,记得<BR>case WM_PAINT:<BR>&nbsp;&nbsp;BeginPaint (hwnd, &ps) ;<BR>&nbsp;&nbsp;EndPaint (hwnd, &ps) ;<BR>&nbsp;&nbsp;break ;<BR>不然无效矩形区域不会消失<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:编程吧 回复日期:2002-10-30 23:19:06
<br>内容:但在WM_LBUTTONDOWN中不用BeginPaint,而用getdc的话,<BR>移动窗口时,那几个字就不会重画,<BR>为什么呢?<BR><BR>/*还有,记得<BR>case WM_PAINT:<BR>&nbsp;&nbsp;BeginPaint (hwnd, &ps) ;<BR>&nbsp;&nbsp;EndPaint (hwnd, &ps) ;<BR>&nbsp;&nbsp;break ;<BR>不然无效矩形区域不会消失<BR>*/<BR>这个我知道,我只是在做个实验而已
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:未出手的飞刀 回复日期:2002-10-30 23:26:27
<br>内容:<BR>BeginPaint和EndPaint使无效矩形区域消失,但getdc不会,<BR>所以你的窗口仍为无效矩形区域,所以字会被覆盖<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:编程吧 回复日期:2002-10-31 00:21:30
<br>内容:我明白了,3x<BR><BR>再问一下,是谁产生了WM_PAINT消息。<BR>是getdc,还是textout or drawtext.<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:编程吧 回复日期:2002-10-31 00:45:13
<br>内容:想了一下,我又有点糊涂了,<BR>WM_PAINT到底是什么时候产生的?<BR><BR>在响应WM_LBUTTONDOWN中<BR>用getdc时,<BR>从程序实际运行来看,<BR>wm_paint应该是在移动窗口时发出的,<BR>因为鼠标点击后,字可以看得见。<BR><BR>但如果用BeginPaint,<BR>窗口移动时,字可以看得见,<BR>说明wm_paint是在鼠标点击之前发出的,<BR>因为我在ON_PAINT中没有调用BeginPaint。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:*** 回复日期:2002-10-31 00:50:26
<br>内容:只要窗口的 client area 无效 ( 1:被覆盖,移动,放缩,等等 2:call APIs which<BR>cause client area invalid)<BR>系统会发一个WM_PAINT到你的message queue.<BR>对于非client area, the message is WM_NCPAINT
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:编程吧 回复日期:2002-10-31 11:29:12
<br>内容:但根据实际程序的运行,窗口移动时,系统是不会发出WM_PAINT的,<BR>否则我在移动窗口时,字就会消失.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

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