minigui[基础篇][1]——第一个helloword程序
1.源码
#include <stdio.h> //c库函数
#include <minigui/common.h> //minigui常用的宏和定义
#include <minigui/minigui.h> //minigui通用的函数和杂项的函数
#include <minigui/gdi.h> //绘图函数接口定义
#include <minigui/window.h> //窗口相关的宏 数据结构 数据类型 以及接口函数的说明
//消息过程处理函数
static int HelloWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
switch (message) {
case MSG_PAINT: //绘图消息 比如说ShowWindow这个函数调用时会这个消息
hdc = BeginPaint (hWnd);//获取绘图上下文
TextOut (hdc, 60, 60, "Hello world!");//将文本输出到屏幕上
EndPaint (hWnd, hdc);//释放绘图上下文
return 0;
case MSG_CLOSE://关闭消息 像用户点击右上角图标后会发送该消息
DestroyMainWindow (hWnd);//销毁窗口本身用户创建出来的内存等等
PostQuitMessage (hWnd); //将MSG_QUIT消息投放到消息队列中
return 0;
}
return DefaultMainWinProc (hWnd, message, wParam, lParam);//默认的消息处理函数
}
//像main一样的程序入口点
int MiniGUIMain (int argc, const char* argv[])
{
MSG Msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;
#ifdef _MGRM_PROCESSES //进程模式下加入层的概念
JoinLayer (NAME_DEF_LAYER , "helloworld" , 0 , 0);
#endif
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;//可见 有标题栏 有边框
CreateInfo.dwExStyle = WS_EX_NONE; //无扩展风格
CreateInfo.spCaption = "HelloWorld"; //标题栏文本
CreateInfo.hMenu = 0; //无菜单
CreateInfo.hCursor = GetSystemCursor (0); //系统默认光标
CreateInfo.hIcon = 0; //无图标 像windows窗口左上角的那个小图标
CreateInfo.MainWindowProc = HelloWinProc; //默认窗口处理函数
CreateInfo.lx = 0; //左上x left x
CreateInfo.ty = 0; //左上y top y
CreateInfo.rx = 240;//右下x right x
CreateInfo.by = 180;//右下y bottom y 这四个值可表示一个矩形 左上坐标(0,0) w=240 h=180的矩形
CreateInfo.iBkColor = COLOR_lightwhite; //背景颜色 白色
CreateInfo.dwAddData = 0; //窗口数据 无
CreateInfo.hHosting = HWND_DESKTOP; //托管窗口是桌面
hMainWnd = CreateMainWindow (&CreateInfo); //创建一个窗口 用户程序资源+系统资源
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow (hMainWnd, SW_SHOWNORMAL);//显示一个窗口
//消息循环队列
while (GetMessage (&Msg, hMainWnd)) {//从消息队列中获取消息
TranslateMessage (&Msg); //将键盘消息转换为字符消息
DispatchMessage (&Msg); //将消息发送给消息处理函数
}
MainWindowThreadCleanup (hMainWnd); //回收窗口的资源 像消息队列+系统资源等等
return 0;
}
#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif
2.流程框图
注:创建窗口并不意味着显示窗口 创建窗口只意味着在内存中存在 并没有在显示屏上显示
所以要显示屏幕 利用hdc在屏幕上显示出来
3.消息的类图
4.minigui的3种模式
MiniGUI-Threads 线程模式 ---可以在不同的线程中建立多个窗口,但所有的窗口在一个进程或者地址空间
在文件这种模式利用的宏:MiniGUI-Threads: _MGRM_THREADS
操作系统: uC/OS-II eCos VxWorks pSOS Linux uClinux
MiniGUI-Processes 进程模式 --- 每个程序是独立的进程,每个进程也可以建立多个窗口
宏:MiniGUI-Processes: _MGRM_PROCESSES 和 _LITE_VERSION
操作系统:嵌入式linux
MiniGUI-Standalone 独立模式 --- 既不需要多线程也不需要多进程的支持
MiniGUI-Standalone:_MGRM_STANDALONE 和(_LITE_VERSION 以及 _STAND_ALONE)
5.关于minigui学习
因为minigui资料少 但它是基于类win32API编程
所以可以到网上找一些相关资料 WIN32API 学习和minigui一些概念类似
同时推荐一本讲GUI框架的书
《精通嵌入式Linux编程 --- 构建自己的GUI环境》李玉东 李玉萍编著