首页
社区
课程
招聘
[求助]“我被重绘了1次”在XP下调试不出来
发表于: 2014-12-14 20:55 3950

[求助]“我被重绘了1次”在XP下调试不出来

2014-12-14 20:55
3950
问题:编写一个窗口程序,中间显示“Hello,Windows 98!”,然后当窗口被重绘的时候显示“我被重绘了n次”(n为当前重绘的次数)

知识点:WM_PAINT 消息在什么情况下会产生,比如改变窗口的尺寸、窗口最大化、窗口被覆盖等等

源代码:
#include <windows.h>
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("HelloWin") ;
     HWND         hwnd ;
     MSG          msg ;
	 WNDCLASS	wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;

     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName,                  // window class name
                          TEXT ("The Hello Program"), // window caption
                          WS_OVERLAPPEDWINDOW,        // window style
                          CW_USEDEFAULT,              // initial x position
                          CW_USEDEFAULT,              // initial y position
                          CW_USEDEFAULT,              // initial x size
                          CW_USEDEFAULT,              // initial y size
                          NULL,                       // parent window handle
                          NULL,                       // window menu handle
                          hInstance,                  // program instance handle
                          NULL) ;                     // creation parameters
     
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
     
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     HDC         hdc ;
     PAINTSTRUCT ps ;
     RECT        rect ;
	 static int iRepaintTimes = 0 ;
     TCHAR szStringInformation[500];

     switch (message)
     {
     case WM_CREATE:
//          PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
          return 0 ;
          
     [COLOR="Red"]case WM_PAINT:

		  iRepaintTimes++;
		  
          hdc = BeginPaint (hwnd, &ps) ;
          
          GetClientRect (hwnd, &rect) ;
          
		  if (iRepaintTimes == 1) {
			  DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
						DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
		  }
		  else {
			  wsprintf (szStringInformation, TEXT ("我被重绘了%d次"), iRepaintTimes - 1) ;
			  DrawText (hdc, szStringInformation, -1, &rect,
						DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
		  }
          
          EndPaint (hwnd, &ps) ;
          return 0 ;[/COLOR]
          
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}


我的疑问:"我被重绘了1次" 在XP下调试不出来,即调试状态下没能显示包含"我被重绘了1次"的窗口(但在Win7下可以调试出来),直接显示的就是"我被重绘了2次".


我的调试步骤:

1、在VS2010下 F5 先运行起来

2、将显示"Hello,Windows 98!"的窗口最小化

3、在 "iRepaintTimes++;" 这行 F9 设置断点,如下图:


4、单击hellowin窗口,即将窗口最大化

5、程序运行至 "iRepaintTimes++;"这行,如下图:


6、F10走两步之后,将之前的断点去掉,F5运行后如下图:


我的思考:

1) 出现这个问题,我也自己调试了好多遍,发现在XP下一次窗口最大化操作会发送了两次重绘消息(WM_PAINT),所以就直接显示的是"我被重绘了2次",但真心不知道这是为什么?不知有没有朋友也遇到过这种问题?

2)Windows编程的书籍中少有关于窗口调试的讲解,我猜是不是因为方法和控制台下差不多,所以就不讲了,还想请教大家是如何进行窗口程序的调试的?

最后为工程附件: hellowin.rar

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 24
活跃值: (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
路过,不懂,等大牛来解
2014-12-15 09:00
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
1、双屏调试

2、用OutputDebugString输出而非TextOut
2014-12-15 09:19
0
雪    币: 168
活跃值: (823)
能力值: ( LV10,RANK:173 )
在线值:
发帖
回帖
粉丝
4
1. 双屏调试指的应该就是远程调试吧?我以前试过这种方法,好像效果也不是很好啊

2. 我用的是DrawText输出的,没有用TextOut

2014-12-15 19:11
0
游客
登录 | 注册 方可回帖
返回
//