2009年4月10日星期五

创建一个窗口 -- From GameTutorials, LLC

#include // 必须的头文件
#include

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
// LRESULT 是一个32位的数值,对于一个回调函数其返回类型是LRESULT。
// 其定义为:
// typedef LONG_PTR LRESULT;
// 关于回调函数(CALLBACK),它可以和一个窗口类相关联。
//MSDN中的解释是:CALLBACK Calling convention for callback functions.
//
//This type is declared in WinDef.h as follows:
//
//
//#define CALLBACK __stdcall

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow )
// 同CALLBACK一样 WINAPI 也是 Calling convention for the Win32 API,
// 个人目前无法理解。。。
// WinMain各个参数的解释:
// HINSTANCE hInstance -- 应用程序的实例信息,一个程序可以有两个实例同时运行(开两个QQ)
// HINSTANCE hPrevInstance -- 一般情况下为NULL,没有实际用处。
// PSTR szCmdLine -- 传给应用程序的参数,PSTR就是字符串。
// int iCmdShow -- 保存关于窗口的信息,诸如最大化、最小化等等。
{
HWND hwnd; // HWND -- 窗口句柄,用它来追踪窗口,应用程序可以有多个窗口。
MSG msg; // MSG -- 消息,传递给窗口的。
WNDCLASSEX wndclass; // WNDCLASSEX -- 窗口类,存有窗口的常用信息如图标、标题、大小等。

// 设置窗口属性。
wndclass.cbSize = sizeof( wndclass );
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc; // 指定窗口过程,告知窗口去调用哪个回调函数来处理窗口消息。
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0; // 通常都赋值为0
wndclass.hInstance = hInstance; // ?不解啊
// 设置图标和箭头,空值为HINSTANCE类型。
wndclass.hIcon = LoadIcon( NULL, IDI_WINLOGO );
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
wndclass.hbrBackground = ( HBRUSH ) GetStockObject( WHITE_BRUSH );
// The GetStockObject function retrieves a handle to one of the stock pens, brushes, fonts, or palettes.
// 返回值是VOID* 因此需要类型转换。
wndclass.lpszMenuName = NULL;
// 为窗口类起的名字,在创建窗口时将会用到。
wndclass.lpszClassName = TEXT( "Window Class" );
wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO );

RegisterClassEx( &wndclass ); // 注册窗口类。

hwnd = CreateWindow( TEXT( "Window Class" ),
TEXT( "BLIZZARD Window" ), // 窗口标题。
WS_OVERLAPPEDWINDOW, // 窗口类型。
CW_USEDEFAULT, // 初始X位置。
CW_USEDEFAULT, // 初始Y位置。
CW_USEDEFAULT, // 初始X大小。
CW_USEDEFAULT, // 初始Y大小。
NULL, // 父窗口句柄。
NULL, // 菜单句柄。
hInstance, // 实例句柄。
NULL // 可以利用最后一个参数给WndProc传递变量,当然也可以用全局变量的方式。
);

ShowWindow( hwnd, iCmdShow ); // MSDN中的注释:The ShowWindow function sets the specified window's show state.
// 因此不能从翻译上理解ShowWindow函数调用后会显示窗口。
UpdateWindow( hwnd ); // 绘制窗口,会向窗口发送一个WM_PAINT消息。

// 消息循环。
// 如果收到WM_QUIT消息将返回0。
while( GetMessage( &msg, NULL, 0, 0 ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg ); // 将消息发送给窗口过程。
}

UnregisterClass( TEXT( "Window Class" ), hInstance );

return msg.wParam;
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
{
switch( iMsg ) {
case WM_CREATE : // 创建窗口。
break;
case WM_SIZE : // 改变窗口大小。
break;
case WM_PAINT : // 窗口重绘。
break;
case WM_DESTROY :
PostQuitMessage( 0 ); // 必须调用PostQuitMessage。
break;
}
return DefWindowProc( hwnd, iMsg, wParam, lParam );
// 调用DefWindowProc采用默认方式处理未处理消息。
}



学习WIN 32离不开MSDN,这点深有体会,许多东西必须查!

WIN 32 编程的一般步骤是:

1) 初始化窗口类。

2) 注册窗口类。

3) 创建窗口。

4) 从窗口过程获取消息。

5) 处理消息。

没有评论:

发表评论