ACLLib 分析

来源:互联网 发布:mac 迅雷 下载速度 编辑:程序博客网 时间:2024/06/14 19:49
在基于C语言的窗口创建过程中,遵循设计窗口、注册窗口、创建窗口、显示和更新窗口、消息循环及窗口过程函数六个步骤。
不同于传统的C语言编程,在基于窗口的程序中,通常入口是WinMain() 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){MSG          msg;WNDCLASSA     wndclass;    g_hInstance = hInstance;g_hWnd = NULL;    g_keyboard = NULL;g_mouse = NULL;g_timer = NULL;wndclass.style         = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;wndclass.lpfnWndProc   = WndProc;wndclass.cbClsExtra    = 0;wndclass.cbWndExtra    = 0;wndclass.hInstance     = hInstance;wndclass.hInstance     = hInstance;wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION);wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);wndclass.lpszMenuName  = NULL;wndclass.lpszClassName = g_wndClassName;if (!RegisterClassA(&wndclass)){MessageBoxA(NULL, "This program requires Windows NT!", g_libName, MB_ICONERROR);return 0;}Setup();ACL_ASSERT(g_hWnd,"You must call \"initWindow(...)\" in Main()");while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage (&msg);DispatchMessage (&msg);}return msg.wParam;}

整个WinMain()函数可以包含上诉所说的前五大部分,以下分别说明:
1、设计窗口

程序开始定义了一个WNDCLASSA的结构体变量,其形式如下:

typedef struct tagWNDCLASSA {        UINT        style;        WNDPROC     lpfnWndProc;    int         cbClsExtra;    int         cbWndExtra;    HINSTANCE   hInstance;    HICON       hIcon;    HCURSOR     hCursor;    HBRUSH      hbrBackground;    LPCSTR      lpszMenuName;    LPCSTR      lpszClassName;}WNDCLASSA;

其中包括窗口的类型、窗口过程函数、光标、图标、窗口背景、窗口类名等等,详见MSDN:点击打开链接
2、注册窗口

RegisterClassA(const WNDCLASS* lpWndClass)函数注册窗口。

3、创建窗口

CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)函数创建指定的窗口原点、长、宽、窗口类等的窗口。

4、显示及更新窗口

创建完窗口后,我们就可以调用ShowWindow(HWND hWnd, int nCmdShow)UpdateWindow(HWND hWnd)显示和更新窗口。

5、消息循环

定义消息结构体MSG变量msg,通过GetMessage()或者PeekMessage()来接收消息,然后由TranslateMessage()将按键消息转换成字符消息,放到线程消息队列中,由DispatchMessage()函数将消息传递给窗口过程函数。

其中窗口过程函数作如下说明:在设计窗口类时,有一成员变量lpfnWndProc用来指定窗口过程函数的地址,我们用赋予函数名。

其过程函数形式如下:

LRESULT CALLBACK WindowProc(        HWND hwnd,        UINT uMsg,        WPARAM wParam,        LPARAM lParam);

其中hwnd 代表所属窗口句柄,uMsg 表示消息,后面两个参数是消息的附加参数。


在使用ACLLib创建窗口时,我们只需要写一个Setup()函数,调用initWindow()初始化窗口,这样用户就可以定义自己所规划的窗口。

同时,通过initConsole()函数,程序也打开了console,方便程序读入和反馈信息等。

对于具体的程序界面设计及相应事件响应,调用相应的函数即可。

具体例程、配置方式和源文件和头文件下载网站:点击打开链接

0 0
原创粉丝点击