大家来帮忙看看以下程序运行时执行几次 MessageBox(hwnd,TEXT("WM_PAINT occurs"),NULL,MB_OK);  
/*------------------------------------------------------------
   HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
                 (c) Charles Petzold, 1998
  ------------------------------------------------------------*/#include <windows.h>
#include <tchar.h>     
#include <stdio.h> 
#include "winnt.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 (BLACK_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 ;
     
     switch (message)
     {
     case WM_CREATE:
          PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
          return 0 ;
          
     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
          MessageBox(hwnd,TEXT("WM_PAINT occurs"),NULL,MB_OK); 
          GetClientRect (hwnd, &rect) ;
          
          DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
          
          EndPaint (hwnd, &ps) ;
          return 0 ;
      
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

解决方案 »

  1.   

    很多次,只要会导致窗口重新绘制的事件发生时,都会向窗口发送WM_PAINT消息
      

  2.   

    嗯,好象陷入死循环了。DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;导致消息队列里面不断地产生WM_PAINT消息。
      

  3.   

    试试看
    好奇怪,有的时候一次有的时候两次,我怀疑鼠标的操作可能造成WM_PAINT被响应
      

  4.   

    It's up to the times the message be produced
      

  5.   

    UNDATA一次,之后每动一次又一次~
      

  6.   

    绝对是死循环。可以说是无限次。OnPain()函数中你弹出了对话框,当你关闭时又重画(OnPain()函数又执行)。
      

  7.   

    (今天极度失恋中)
    应该把MessageBox(hwnd,TEXT("WM_PAINT occurs"),NULL,MB_OK); 放到case WM_CREATE:下面
      

  8.   

    one times 
    up  :)
      

  9.   

    但是不是说系统每隔一定时间,就会要求桌面上的程序自己绘制自己一遍吗?哪会有WM_PAINT消息出现吗?
      

  10.   

    消息队列里面不断地产生WM_PAINT
      

  11.   

    次数不定的,窗口从绘时就会发生;窗口移动并不一定会产生WM_PAINT消息,
      

  12.   

    这种问题,很恶心的,即使没有DrawText也会死循环吧!
      

  13.   

    int i=1;
    if(i)
    {
         新年快乐!
    }死循环
      

  14.   

    这要看系统中的缺省设置的窗口是多大,如果太大,消息框显示的时候覆盖了一部分窗口的话,那么就会有无数次,但是如果窗口太小,消息矿显示不覆盖窗口,那就只有一次了不过一般用系统的缺省设置,窗口一般都比较大,所以,一般情况下消息框都会覆盖一部分窗口,所以一般情况下是会触发很多次的
    如果你把这几句话
      CW_USEDEFAULT,              // initial x position
                              CW_USEDEFAULT,              // initial y position
                              CW_USEDEFAULT,              // initial x size
                              CW_USEDEFAULT,              // initial y size
    改成
      0,              // initial x position
                              0,              // initial y position
                              100,              // initial x size
                              100,              // initial y size这样窗口比较下,只会触发一次(切换窗口触发那就是另外一回事了)
      

  15.   

    每次需要刷新画面时跳MessageBox。
      

  16.   

    come in ......
    .
    .
    .
    .
    come out
      

  17.   

    没想到这样一个问题引来如此众多结论。
    可经实验结果证实,两次弹出对话框(我指的是程序初始化运行时)。。
    不知为何。
    不过我有一问:ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
    ////////////////////////////////
    以上两行代码会触发几次WM_PAINT消息?
      

  18.   

    UpdateWindow()一定会发一个WM_PAINT消息.但ShowWindow()则不一定,取决于Window当前状态和iCmdShow之间的组合.楼主只所以得到两次的结果,其原因是这样的:
    CreateWindow()如果建出来的窗口属性中有WS_VISIBLE,那么此函数将在发完WM_CREATE中发WM_PAINT(第一次).
    ShowWindow(),此时窗口已绘,楼主iCmdShow又是SW_SHOW,窗口并没有发生变化,所以不再发WM_PAINT消息.
    UpdateWindow()强行再发一次WM_PAINT(第二次)建议楼主不要在WM_PAINT处理函数中用messagebox(),如要统计个数,写到文件中即可,这种可能更改显示情况的函数不适合在此使用.
      

  19.   

    运行在98下的,加个#include "winnt.h"干嘛?
      

  20.   

    那是不是系统都定期会给程序发WM_PAINT,还是只有在窗口发生改变,或者程序自己强迫发送WM_PAINT,才有的?
      

  21.   

    我的意思的,如果只开一个最大化对话框程序,如果就把这个程序一直这样开着,也不移动鼠标,程序中也不用UpdateWindow或Invalidate,那么这个窗口会接受到WM_PAINT消息吗?
      

  22.   

    其实关键是看什么时候发送WM_PAINT。
    做几个试验:
    1.启动程序,对话框弹出。按确定,对话框不再弹出。这是因为对话框弹出并不能激发WM_PAINT,虽然它占用了一块空间。
    2.方法同上,但不要直接按确定,用鼠标拖着对话框走一段,在确定。好,对话框又弹出来了。说明移动对话框会激发WM_PAINT。
    3.将程序启动,对话框弹出,这是按下windows+D,(windows键就是左边ctrl旁边的画着windows logo的键)将窗口最小化,再将窗口恢复,会看到一大堆的对话框重叠着弹出来。因为是叠着的,所以这时关闭对话框时也会激发WM_PAINT。
      

  23.   

    1~2次
    不知为何。。
    不过我很同意/ Zark(金陵五月)  的意见,我取消了messagebox(),用一个static变量i统计该消息次数。。每次i++;
    ////////////////////
    建议楼主不要在WM_PAINT处理函数中用messagebox(),如要统计个数,写到文件中即可,这种可能更改显示情况的函数不适合在此使用.
      

  24.   

    I don't know.You can give me s all the same,can't you???
      

  25.   

    回复人: liufucsdn(乞力马扎罗的雪) 
    ok,but you must wait until this problem is resolved....