设置定时器,SetTimer(),第一个参数传入全局变量main_window_handle无效,Debug调试看到main_window_handle值为0X00000000,和hwnd值不一样,说明在WinMain函数中对全局变量赋值无效,请问这是为什么呀???
// DEMO3_1.CPP  - Demo of loading an icon and cursor resource// INCLUDES ///////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN  // just say no to MFC#include <windows.h>   // include all the windows headers
#include <windowsx.h>  // include useful macros
#include <mmsystem.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<tchar.h>
//#include "DEMO3_1RES.H" // include the resource header// DEFINES ////////////////////////////////////////////////// defines for windows 
#define WINDOW_CLASS_NAME "WINCLASS1"
#define TIMER_ID_1SEC   1
#define TIMER_ID_3SEC   3// GLOBALS ////////////////////////////////////////////////
HWND main_window_handle  = NULL;
HINSTANCE main_instance = NULL;#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)// FUNCTIONS ////////////////////////////////////////////////LRESULT CALLBACK TimerProc(HWND)
LRESULT CALLBACK WindowProc(HWND hwnd, 
    UINT msg, 
                            WPARAM wparam, 
                            LPARAM lparam)
{
// this is the main message handler of the system
PAINTSTRUCT ps; // used in WM_PAINT
HDC hdc; // handle to a device context
TCHAR buffer[80];static int      counter1=0, // counters
                counter3=0;// what is the message 
switch(msg)
{
case WM_CREATE: 
        {
// do initialization stuff here
////设置定时器
SetTimer(hwnd,TIMER_ID_1SEC,1000,NULL); ///////这里用全局变量main_window_handle为什么不行
SetTimer(hwnd,TIMER_ID_3SEC,3000,NULL);
        // return success
return(0);
} break; case WM_TIMER:
{
////what timer fired?
switch(wparam)
{
case TIMER_ID_1SEC:
{
//MessageBox(hwnd,TEXT("timer 1 fired!"),"Timer 1",MB_OK);
// print out a message
                   // get the dc
                   hdc = GetDC(hwnd);                   // set the color
                   SetTextColor(hdc,RGB(0,255,0));
                   SetBkColor(hdc,RGB(0,0,0));
                   SetBkMode(hdc,OPAQUE);                   // build up the messages
                   sprintf(buffer,"The 1 second timer has fired %d times",++counter1);                   // print the message
                   TextOut(hdc,0,0,buffer,strlen(buffer));                   // release the dc
                   ReleaseDC(hwnd,hdc);
}
break;
case TIMER_ID_3SEC:
{
//MessageBox(hwnd,TEXT("timer 3 fired!"),NULL,MB_OK);
 // make a beep
                   MessageBeep(MB_ICONEXCLAMATION);                   // get the dc
                   hdc = GetDC(hwnd);                   // set the color
                   SetTextColor(hdc,RGB(0,255,0));
                   SetBkColor(hdc,RGB(0,0,0));
                   SetBkMode(hdc,OPAQUE);                   // build up the messages
                   sprintf(buffer,"The 3 second timer has fired %d times",++counter3);                   // print the message
                   TextOut(hdc,0,20,buffer,strlen(buffer));                   // release the dc
                   ReleaseDC(hwnd,hdc);
}
break;
}
}
break; case WM_PAINT: 
{
// simply validate the window
hdc = BeginPaint(hwnd,&ps);  
// you would do all your painting here
//TextOut(hdc,0,0,buffer,strlen(buffer));
        EndPaint(hwnd,&ps);        // return success
return(0);
    } break;
/* case WM_CLOSE:
{
///display message box
int result = MessageBox(hwnd,TEXT("Close The Window???"),TEXT("Null"),MB_YESNO); 
///does the uders want to close ?
if (IDYES == result)
return DefWindowProc(hwnd,msg,wparam,lparam);///call default handler
return 0; /////throw message away
}break;
*/
//////调用顺序:WM_CLOSE---->WM_DESTROY--->WM_QUIT case WM_DESTROY: 
{
// kill the application, this sends a WM_QUIT message  KillTimer(hwnd,TIMER_ID_1SEC);
KillTimer(hwnd,TIMER_ID_3SEC);
PostQuitMessage(0);        // return success
return(0);
} break; default:break;    } // end switch
// process any messages that we didn't take care of 
return (DefWindowProc(hwnd, msg, wparam, lparam));} // end WinProc
///start game main
void Game_Main()
{
   
}// WINMAIN ////////////////////////////////////////////////
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{WNDCLASSEX winclass; // this will hold the class we create
HWND    hwnd;  // generic window handle
MSG    msg;  // generic message// first fill in the window class stucture
winclass.cbSize         = sizeof(WNDCLASSEX);
winclass.style = CS_DBLCLKS | CS_OWNDC | 
                          CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(hinstance, IDI_APPLICATION);
winclass.hCursor = LoadCursor(hinstance, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
winclass.hIconSm        = LoadIcon(hinstance, IDI_APPLICATION);// register the window class
if (!RegisterClassEx(&winclass))
return(0);// create the window
if (!(hwnd = CreateWindowEx(NULL,                  // extended style
                            WINDOW_CLASS_NAME,     // class
    "Demo of Custom Cursor and Icon", // title
    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
      0,0,   // initial x,y
400,400,
    //GetSystemMetrics(SM_CXFULLSCREEN),
//GetSystemMetrics(SM_CYFULLSCREEN),  // initial width, height
    NULL,   // handle to parent 
    NULL,   // handle to menu
    hinstance,// instance of this application
    NULL))) // extra creation parms
return(0);main_window_handle = hwnd;//这里赋的值
main_instance = hinstance;// enter main event loop, but this time we use PeekMessage()
// instead of GetMessage() to retrieve messages
while(TRUE)
{
    // test if there is a message in queue, if so get it
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
   { 
   // test if this is a quit
       if (msg.message == WM_QUIT)
           break;

   // translate any accelerator keys
   TranslateMessage(&msg);    // send the message to the window proc
   DispatchMessage(&msg);
   } // end if
    
    // main game processing goes here
 //Game_Main(); // or whatever your loop is called
if(KEYDOWN(VK_ESCAPE))
SendMessage(hwnd,WM_CLOSE,0,0);////////WM_QUIT为什么不行????

} // end while// return to Windows like this
return(msg.wParam);} // end WinMain///////////////////////////////////////////////////////////加红色的那个地方请各位解释一下为什么赋值不成功......
谢谢啦.....

解决方案 »

  1.   

    一个可能是因为系统在发出WM_CREATE时CreateWindowEx函数还没有返回。
      

  2.   


    WM_CREATE消息不是在窗口被创建时产生么,没返回哪里来的窗口呢?
      

  3.   

    MSDN上的原话:
    The WM_CREATE message is sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. (The message is sent before the function returns.)
    也就是说,这个消息是CreateWindow这个API在执行过程中发送的,发送这个消息时CreateWindow这个API并没有执行完,所以当你的程序在处理WM_CREATE时,CreateWindowEx还没有返回,你上面的赋值语句还没有执行到。