首页>
技术资讯>
详情

送给初学者的礼物:游戏编程起源连载二

2016-05-28 来源:CloudBest 阅读量: 426
关键词: 程序设计


  三、创建窗口
  好消息,创建窗口你所要做的只是调用一个CreateWindowEx()函数。坏消息是,这个函数有好多的参数。以下便是函数原形:
  
  HWND CreateWindowEx(
  DWORD dwExStyle, // extended window style
  LPCTSTR lpClassName, // pointer to registered class name
  LPCTSTR lpWindowName, // pointer to window name
  DWORD dwStyle, // window style
  int x, // horizontal position of window
  int y, // vertical position of window
  int nWidth, // window width
  int nHeight, // window height
  HWND hWndParent, // handle to parent or owner window
  HMENU hMenu, // handle to menu, or child-window identifier
  HINSTANCE hInstance, // handle to application instance
  LPVOID lpParam // pointer to window-creation data
  );
  
  首先:函数的返回值。也就是函数的类型。是不是所有创建窗口用的函数的类型的讨厌样子都感觉亲切了一点儿?不要紧,你会习惯的,肯定比你想象的速度要快。这里返回的类型是HWND,是一个窗口的句柄(句柄就是窗口的标识符)。你将把CreateWindowEx()的返回值传递给一个窗口的句柄,就像一个参数一样。现在,我们来琢磨一下这些参数,很多根据名字就知道它是干什么的了。
  
  ※ DWORD dwExStyle:扩充的窗口风格。你将很少使用扩充的窗口风格,所以多数时间你会把它设置为NULL。如果有兴趣,查一下帮助文件,可以一试由WS_EX_打头的扩充风格。
  
  ※ LPCTSTR lpClassName:还记得你的窗口类的名称吗?再用一次。
  
  ※ LPCTSTR lpWindowName:将显示在窗口的标题栏里的简短文字。
  
  ※ DWORD dwStyle:窗口的风格。它将允许你详细的描绘你所要创建的窗口的风格。有很多风格你可以利用哦,都是以WS_打头的,你可以利用(|)符号组合利用它们。我将在这儿介绍几个常用的。
  
  ◎ WS_POPUP 指定一个弹出的窗口。
  
  ◎ WS_OVERLAPPED 指定一个具有标题栏和边界的重叠窗口。
  
  ◎ WS_OVERLAPPEDWINDOW 指定一个具有所有标准控件的窗口。
  
  ◎ WS_VISIBLE 指定一个初始时可见的窗口。
  
  看得出,WS_OVERLAPPEDWINDOW是一个组合体。简单的说,你可以按照如下规律:如果你要创建一个可以最大化、最小化、随意改变大小等等地窗口,就选择WS_OVERLAPPEDWINDOW;如果你只想要一个具有标题栏、可改变大小的窗口,就选择WS_OVERLAPPED;如果你只想要一个光秃秃的窗口,就选择WS_POPUP;如果你只想显示一个黑色的大方框,可能你要用它写一个全屏的游戏,选择WS_VISIBLE是没错的。
  
  ※ int x,y:你所要创建的窗口的左上角的坐标。
  
  ※ int nWidth,nHeight:猜也猜到了,是窗口的长和高。
  
  ※ HWND hWndParent:指向父窗口的句柄。你若想在窗口下再建立一个窗口,那么第一个窗口就叫父窗口。咱先建立一个主窗口,所以设置为NULL,也就意味着Windows桌面是父窗口。
  
  ※ HMENU hMenu:这是用在窗口上的菜单句柄。若你学会建立和使用资源,即建立自己的菜单,你可以用LoadMenu()函数调用自己的菜单资源。目前,先设为NULL。
  
  ※ HINSTANCE hInstance:是一个名柄,它指向由Windows传递给WinMain()的实例。
  
  ※ LPVOID lpParam:对于游戏编程来说,没有什么用的东西,只有简单的窗口程序用到它。设置为NULL好了。
  
  我们现在万事具备,东风也有了。我先给个示例:
  
  HWND hwnd;
  if (!(hwnd = CreateWindowEx(NULL,         // extended style, not needed
  "Sample Class",    // class identifier
  "Sample Window",   // window title
  WS_POPUP | WS_VISIBLE,// parameters
  0, 0, 320, 240,    // initial position, size
  NULL,         // handle to parent (the desktop)
  NULL,         // handle to menu (none)
  hinstance,      // application instance handle
  NULL)))        // who needs it?
  return(0);
  
  你可能会在游戏编程中用上这这段代码,因为它是一个弹出式窗口。注意,我用了if形式,目的是一旦CreateWindowsEX()函数失灵,返回一个NULL,也就意味着如果窗口由于某种原因不能被建立,那么WinMain()就被简单的返回,程序结束。现在我们学会了足够的知识建立一个小有功能的窗口了。还记得我们建立窗口类“sample class”时,一个指向“CALLBACK”类型函数的指针吗?对,是“lpfnWndProc”。要想让你的窗口真正做点事儿,我们还得来处理一下它指向的“窗口过程”函数。
  
  四、显示窗口
  CreateWindowEx()从内部创建窗口,但并不显示它。要显示这个窗口,必须调用另外两个函数:ShowWindow()和UpdateWindow()。头一个设置窗口的显示状态,后一个则更新窗口的客户区。对于程序的主窗口,ShowWindow()必须被调用一次,调用代码如下:
  
  ShowWindow(hwnd,nCmdShow);
  
  第一个参数是由CreateWindowEx()函数返回的窗口句柄;第二个参数就是窗口的显示模式参数,在☆WinMain()函数中提到过,就不重复了。UpdateWindow()函数的调用代码如下:
  
  UpdateWindow(hwnd);
  
  参数hwnd同ShowWindow()函数的hwnd一样。
  
  五、消息的处理
  我已经说过消息在窗口里的作用了,下面让我们来仔细学习一下它。处理消息的函数结构如下:
  
  LRESULT CALLBACK MsgHandler(
  HWND hwnd,   // window handle
  UINT msg,   // the message identifier
  WPARAM wparam, // message parameters
  LPARAM lparam // more message parameters
  );
  
  这个LRESULT类型要求返

热门推荐 查看更多