zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    vue中封装axios方法
    ajax请求步骤
    angular 封装公共方法
    vue 二级列表折叠面板
    eslint常规语法检
    angular 4 路由变化的时候实时监测刷新组件
    json写入到excel表
    angular4 常用pipe管道
    angular4 在页面跳转的时候传递多个参数到新页面
    easyui 动态加载语言包
  • 原文地址:https://www.cnblogs.com/beauty/p/1772429.html
Copyright © 2011-2022 走看看