GUI学习笔记之一--“Hello world”程序
因为工作需要,开始接触GUI,首先对GUI的运行过程有一个初步的了解。一般是先在程序入口函数fnGUI_AppMain中调用fnGUI_SetDesktopRect 函数来设置桌面,然后定义主窗口的各种属性pCreateInfo,根据设定的属性调用fnGUI_CreateMainWindow 创建主窗口,接着是消息循环传递机制,
while( fnGUI_GetMessage(&Msg, HWND_DESKTOP) )
{
fnGUI_(&Msg);
fnGUI_(&Msg);
}
利用GetMessage检索与HWND窗口有关的消息,利用TranslateMessage转换消息,利用DispatchMessage发送消息,实际就是让接收对象的窗口过程去响应该消息,最后需调用fnGUI_DestroyMainWindow 函数释放该主窗口占用的系统资源和调用fnGUI_MainWindowCleanup 函数将保存指定主窗口属性的空间清空释放。下面是GUI的运行过程:
1)创建GUI 任务,启动GUI 系统的运行。
2)GUI 系统进行初始化
3)进入用户入口函数fnGUI_AppMain,构建用户界面。
4)进入消息循环,等待输入
5)当接收到QUIT 消息时退出消息循环,卸载GUI,销毁GUI 任务
以下是GUI"hello world"程序:
代码
#include <string.h>
//添加头文件
#include "sysGUI.h"
//消息处理函数
T_WORD ControlTestWinProc(T_GUI_HWND hWnd, T_WORD message,
T_GUI_WPARAM wParam, T_GUI_LPARAM lParam)
{
switch (message)
{
case MSG_PAINT:
{
T_GUI_HDC hdc;
T_GUI_Rect rect;
T_WORD x,y;
fnGUI_GetClientRect (hWnd, &rect);
hdc = fnGUI_BeginPaint (hWnd);/*获取作图用的DC*/
/*计算文字显示的起始位置,是相对于hdc所属窗口客户区左上角的坐标*/
x = (rect.right-rect.left)/2;
y = (rect.bottom-rect.top)/2;
x = x - strlen("Hello,world")*fnGUI_GetCharWidth()/2;
fnGUI_TextOut (hdc,x,y,"Hello,World");
fnGUI_EndPaint (hWnd,hdc);
break;
}//主窗口关闭,销毁主窗口自己
case MSG_CLOSE:
fnGUI_DestroyMainWindow(hWnd);
break;
}//将消息交由系统作缺省处理
return fnGUI_DefaultMainWinProc(hWnd, message, wParam, lParam);
}
//构建窗口属性
T_MODULE T_VOID InitCreateInfo(T_GUI_pMainWinCreate pCreateInfo)
{
pCreateInfo->dwStyle = WS_CAPTION | WS_BORDER | WS_MINIMIZEBOX
| WS_MAXIMIZEBOX | WS_VISIBLE;
pCreateInfo->dwExStyle = WS_EX_NONE;
pCreateInfo->spCaption = "the first window";
pCreateInfo->hMenu = 0;
pCreateInfo->hIcon = 0;
//调用消息处理函数
pCreateInfo->MainWindowProc = ControlTestWinProc;
pCreateInfo->lx = 5 ;
pCreateInfo->ty = 5;
pCreateInfo->rx = 154;
pCreateInfo->by = 234;
pCreateInfo->iBkColor = COLOR_LIGHTWHITE;
pCreateInfo->dwAddData = 0;
pCreateInfo->hHosting = HWND_DESKTOP;
}
//程序主入口函数
T_WORD fnGUI_AppMain()
{
T_GUI_Msg Msg;
T_GUI_MainWinCreate CreateInfo;
T_GUI_HWND hMainWnd;
fnGUI_SetDesktopRect (0, 0, 159, 239 );
InitCreateInfo(&CreateInfo);
hMainWnd = fnGUI_CreateMainWindow(&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
while( fnGUI_GetMessage(&Msg, HWND_DESKTOP) )
{
fnGUI_TranslateMessage(&Msg);
fnGUI_DispatchMessage(&Msg);
}//清空释放保存主窗口属性的空间
fnGUI_MainWindowCleanup(hMainWnd);
return 0;
}