创建一个Win32应用程序步骤:
1、编写WinMain函数。(可以在MSDN上查找并复制)
2、创建(一个)窗口(步骤如下):
a、设计(一个)窗口类(WNDCLASS)
b、注册(该)窗口类。
c、创建窗口。
d、显示并更新窗口。
3、编写消息循环。
4、编写窗口过程函数。(窗口过程的函数的语法,可通过MSDN查看WNDCLASS的lpfnWndProc成员变量,在这个成员的解释中可查到)
分解:
窗口与句柄
在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。句柄是Windows程序中一个重要的概念(图标句柄(HICON)、光标句柄(HCURSOR)、画刷句柄(HBRUSH) )。
1、WinMain函数的原型声明:
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
a、窗口类函数的声明:
typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS;
回调函数的实现机制:(下次在写)
b、注册窗口类
注册函数原型说明:
ATOM RegisterClass (CONST WNDCLASS *lpWndClass);
c、创建窗口
函数原型说明:
HWND CreateWindow(
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
HANDLE hInstance, // handle to application instance
LPVOID lpParam // pointer to window-creation data
);
d、显示及更新窗口
(1)、显示窗口
函数原型声明:
BOOL ShowWindow(
HWND hWnd, // handle to window
int nCmdShow // show state of window
);
(2)、更新窗口
BOOL UpdateWindow(
HWND hWnd // handle of window
);
3、消息循环:
在创建窗口、显示窗口、更新窗口后,我们需要编写一个消息循环,不断的从消息队列中取出消息。
GetMessage()函数原型声明:
BOOL GetMessage(
LPMSG lpMsg, // address of structure with message
HWND hWnd, // handle of window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax // last message
);
通常我们编写的消息循环代码如下:
MSG msg;
while ( GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
提示:消息队列中过去消息还可以调用PeekMessage函数。(查阅MSDN)
4、编写窗口过程函数
窗口过程函数的声明形式:(用于处理发送给窗口的消息;一个Windows应用程序的主要代码部分就集中在窗口过程能够函数中)
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
提示:系统通过窗口过程函数的地址(指针)来调用窗口过程函数,而不是名字。
函数填充:
LRESULT CALLBACK WindowAzeProc( //WindowAzeProc 可以自己命名,但是要和前面声明的一样
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CHAR:
...
break;
case WM_LBUTTONDOWN:
...
break;
case WM_PAINT:
...
break;
case WM_CLOSE:
if(IDYES == MessageBox(hwnd, "是否真的结束?", "message",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
postQuitMessage(0);
break;
default:
return DefWindlowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
问:“Win32 Application” 和 “Win32 Console Application” 的区别:
答:Win32 Application 是基于WINDOWS平台的32位开发环境开发应用程序,SDK程序;
Win32 Console Application 是基于DOS开发平台开发应用程序,不能使用与图形有关的函数,是控制台程序。