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;
}
posted @ 2010-07-06 20:33  姜戏◥⊙▲⊙◤郎  阅读(446)  评论(0编辑  收藏  举报