您的位置:首页 > 其它

WIN32 基本应用框架

2010-07-13 10:23 363 查看
WIN32基本框架如下:

1 设计窗口类

要创建一个窗口,当然要先设计该窗口的样式特征,例如当鼠标滑过该窗口时的光标类型,该窗口的背景颜色,窗口过程函数(用于消息处理)等等。

例如:

//设计窗口类

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc = MainWndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = LoadCursor(NULL,IDC_ARROW);

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wc.lpszMenuName = NULL;

wc.lpszClassName = TEXT("WndNotears");

2 注册窗口类

窗口类型设计好之后,就要向操作系统来注册该窗口类。

例如:

//注册窗口类

if(0 == RegisterClass(&wc))

return -1;

3 注册窗口类完成之后,就可以来创建这种类型的窗口了。

例如:

//创建窗口

hWnd = CreateWindowEx(WS_EX_NODRAG,TEXT("WndNotears"),TEXT("Window notears"),WS_VISIBLE | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

4 可以检查一下是否成功创建了该窗口。

例如:

//检查窗口是否创建成功

if(!IsWindow(hWnd))

return -2;

5 创建窗口成功之后,接着显示窗口。

例如:

//显示窗口

ShowWindow(hWnd,nShowCmd);

6 最后一步更新窗口。

例如:

//更新窗口

UpdateWindow(hWnd);

以上的步骤就完成了一个窗口的创建,在WinMain函数中,接下来要做的事情就是完成消息循环的代码,以不断的处理消息队列中的消息,来让这个窗口“活”起来。

例如:

//消息循环

while(GetMessage(&msg,NULL,0,0))

{

//翻译消息

TranslateMessage(&msg);

//投递消息

DispatchMessage(&msg);

}

二 窗口过程函数

在窗口过程函数中,可以处理一些自己感兴趣的消息。一般在窗口过程函数中,会有一个switch语句。switch语句分析窗口过程接收到的消息,并分别进行处理。

例如:

LRESULT CALLBACK MainWndProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)

{

PAINTSTRUCT ps;

RECT rect;

HDC hdc;

switch(wMsg){

case WM_PAINT:

GetClientRect(hWnd,&rect);

hdc = BeginPaint(hWnd,&ps);

DrawText(hdc,TEXT("this is my first win32 program!"),-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);

EndPaint(hWnd,&ps);

return 0;

case WM_DESTROY:

PostQuitMessage(0);

break;

}

return DefWindowProc(hWnd,wMsg,wParam,lParam);

}

三 一个完整的样例程序

#include <windows.h>

LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPWSTR lpCmdLine, int nCmdShow) {

WNDCLASS wc;

HWND hWnd;

MSG msg;

// Register application main window class.

wc.style = 0; // Window style

wc.lpfnWndProc = MainWndProc; // Callback function

wc.cbClsExtra = 0; // Extra class data

wc.cbWndExtra = 0; // Extra window data

wc.hInstance = hInstance; // Owner handle

wc.hIcon = NULL, // Application icon

wc.hCursor = LoadCursor (NULL, IDC_ARROW);// Default cursor

wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);

wc.lpszMenuName = NULL; // Menu name

wc.lpszClassName = TEXT("MyClass"); // Window class name

if (RegisterClass (&wc) == 0) return -1;

// Create main window.

hWnd = CreateWindowEx(WS_EX_NODRAG, // Ex style flags

TEXT("MyClass"), // Window class

TEXT("Hello"), // Window title

// Style flags

WS_VISIBLE | WS_CAPTION | WS_SYSMENU,

CW_USEDEFAULT, // x position

CW_USEDEFAULT, // y position

CW_USEDEFAULT, // Initial width

CW_USEDEFAULT, // Initial height

NULL, // Parent

NULL, // Menu, must be null

hInstance, // Application instance

NULL); // Pointer to create

// parameters

if (!IsWindow (hWnd)) return -2; // Fail code if not created.

// Standard show and update calls

ShowWindow (hWnd, nCmdShow);

UpdateWindow (hWnd);

// Application message loop

while (GetMessage (&msg, NULL, 0, 0)) {

TranslateMessage (&msg);

DispatchMessage (&msg);

}

// Instance cleanup

return msg.wParam;

}

//======================================================================

// MainWndProc - Callback function for application window

//

LRESULT CALLBACK MainWndProc (HWND hWnd, UINT wMsg, WPARAM wParam,

LPARAM lParam) {

PAINTSTRUCT ps;

RECT rect;

HDC hdc;

switch (wMsg) {

case WM_PAINT:

// Get the size of the client rectangle

GetClientRect (hWnd, &rect);

hdc = BeginPaint (hWnd, &ps);

DrawText (hdc, TEXT ("Hello Windows CE!"), -1, &rect,

DT_CENTER | DT_VCENTER | DT_SINGLELINE);

EndPaint (hWnd, &ps);

return 0;

case WM_DESTROY:

PostQuitMessage (0);

break;

}

return DefWindowProc (hWnd, wMsg, wParam, lParam);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: