问题描述:见代码红色部分
// 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为什么不行???
//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.)
The window procedure of the new window receives this message after the window is created,
but before the window becomes visible.
*/
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; ///未执行到此句就触发WM_CREATE消息,所以此时定时器中全局变量main_window_handle任然为NULL
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
///