请教各位编程大虾:(200分)

  • 主题发起人 主题发起人 netbug
  • 开始时间 开始时间
N

netbug

Unregistered / Unconfirmed
GUEST, unregistred user!
我用C++编写了个windows的程序,请看过程函数:<br>LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)<br>{<br>&nbsp; &nbsp; &nbsp;HDC &nbsp; &nbsp; &nbsp; &nbsp; hdc ;<br>&nbsp; &nbsp; &nbsp;PAINTSTRUCT ps ;<br>&nbsp; &nbsp; &nbsp;RECT &nbsp; &nbsp; &nbsp; &nbsp;rect ;<br>&nbsp; &nbsp; &nbsp;switch (message)<br>&nbsp; &nbsp; &nbsp;{<br>&nbsp; &nbsp; &nbsp;case WM_CREATE:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return 0 ;<br>&nbsp; &nbsp; &nbsp;case WM_RBUTTONDOWN:<br> hdc=GetDC(hwnd);<br> TextOut(hdc,10,10,"Hello",5);<br> ReleaseDC(hwnd,hdc);<br> return 0;<br>&nbsp; &nbsp; &nbsp;case WM_PAINT:<br>&nbsp; &nbsp; &nbsp; &nbsp; hdc = BeginPaint (hwnd, &amp;ps) ;<br>&nbsp; &nbsp; &nbsp; &nbsp; EndPaint (hwnd, &amp;ps) ;<br> return 0 ;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp;case WM_DESTROY:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PostQuitMessage (0) ;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return 0 ;<br>&nbsp; &nbsp; &nbsp;}<br>&nbsp; &nbsp;return DefWindowProc (hwnd, message, wParam, lParam) ;<br>}<br>当我右击时,在窗口出现Hello,并当我按住标题栏移动时(没有与显示器的边框重合),<br>窗口中的Hello始终存在.我又把程序中的WM_PAINT消息该成了:<br>&nbsp;case WM_PAINT:<br>&nbsp; &nbsp; &nbsp; return 0 ;<br>此次当我右击时,窗口出现Hello,并当我按住标题栏稍微移动时,窗口中的Hello<br>就没了.我想问:<br>在程序更改前后,我在运行时,都没有产生无效矩形区,也就是说都没有产生WM_PAINT消息,<br>而我在更改WM_PAINT消息的前后,为何会有不同的效果?谢谢.
 
没有产生WM_PAINT消息?<br>你拿winsight来看看
 
to netbug: 不知你要达到什么功能。<br>对第一种情况是因为hello所在区域没有被覆盖。<br>即使产生了WM_PAINT消息,该区域在裁剪区域之外,<br>故没有重画。<br><br>对第二种情况,你返回了0。你实际上没有处理WM_PAINT消息。<br>裁剪区域并没重画(没有调用beginpaint和endpaint的下场),<br>你的应用程序总是收到WM_PAINT消息。<br>(不信你可在你的wm_paint消息后加入<br>&nbsp; case WM_PAINT: <br>&nbsp; &nbsp; hdc=GetDC(hwnd);<br>&nbsp; &nbsp; TextOut(hdc,10,10,"Hello",5);<br>&nbsp; &nbsp; ReleaseDC(hwnd,hdc);<br>&nbsp; &nbsp; return(0);<br>你会看到一个闪烁的Hello)<br>不拖动窗口时,没有要刷新的区域,Hello一直在(虽然老是收到WM_PAINT)。<br>拖动窗口后,<br>
 
加个flag,不要每次都发wm_paint的消息。
 
&nbsp;没有人说向屏幕作图非要用 InvalidateRect 方法,把作图的方法写在 WM_PAINT 中只是<br>为了在窗口刷新后仍然保持图像,所以你用鼠标点击后写文字肯定会马上出现。<br>&nbsp; 至于移动窗口后文字不见了,应该是第二种方法的写法触发了 WM_ERASEBKGND 消息的原因,<br>你截获这个消息,返回 1 就可以防止了。在第一种方法中调用 BeginPaint 后,PS 结构被填<br>充,此时你可以查看一下 fErase 的值,应该是 0 的,如果为 0 ,将不会发送 WM_ERASEBKGND<br>消息,就是说背景不会被擦除,因此文字保持在屏幕上。
 
多人接受答案了。
 
后退
顶部