设置全局变量为什么没有成功!!!

来源:互联网 发布:济南seo公司 编辑:程序博客网 时间:2024/04/30 19:39

问题描述:见代码红色部分

// 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

///////////////////////////////////////////////////////////

 

 

原创粉丝点击