因为工作需要,开始接触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 ;
}