MiniGUI由飞漫公司于1998年为嵌入式平台开发的基于framebuffer图像库,至今以发展的非常完善!目前大致可以分为三种模式:

1.MiniGui-Threads,运行在MiniGui-Threads的程序可以再不同的线程中建立多个窗口,但是所有的窗口在一个进程或者地址空间中运行。
适用范围:uC/OS-ll,eCos,VxWorks,pSOS等无内存单元cpu的系统(Linux和uClinux上也可)
 2.MiniGui-Standalone,可以以独立进程的方式运行,不需要多线程和多进程的支持。
 适用范围:功能单一的应用场合,如uClinux的嵌入式产品
 3.MiniGui-Processes,和MiniGui-Threads相反,每个进程是独立的进程,每个进程可以有多个窗口。

然后其中MiniGui-Processes模式应用颇为广泛!

MiniGui是基于消息驱动的图像化编程,比如一个创建一个主窗口,那么MiniGui会为这个进程创建一个消息队列,当一个事件被触发以后会被转化成消息发送到这个消息队列当中,然后执行响应的过程函数进行处理。下面一个个经典的HelloWorld例子来讲解!

好了看完代码来分析一下,做个win32图像编程的很容易上手!

大概步骤:

1.首先是定义窗口对象CreateInfo;

2.初始化工作,设置CreateInfo的一些属性和对应的过程函数等;

3.创建主窗口CreateMainWindow(&CreateInfo);

4.显示窗口ShowWindow(hMainWnd, SW_SHOWNORMAL);

5.消息轮询,从消息队列中获取消息以及消息响应;

编译选项:gcc -o hello helloworld.c -lminigui -ljpeg -lpng -lz (如果为Thread模式加上 -lpthread)

********代码********

#include <stdio.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
//#include<minigui/control.h>
/*窗口消息处理*/
static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;//窗口句柄
switch (message) //接受到的消息在这里处理
{
case MSG_PAINT:
hdc = BeginPaint(hWnd);//绘制窗口
TextOut(hdc, 60, 60, "Hello world!");//显示输出
EndPaint(hWnd, hdc);//结束绘图
return 0;
case MSG_CLOSE:
DestroyMainWindow(hWnd);//销毁窗口对象
PostQuitMessage(hWnd);//退出消息循环
return 0;
}
/*当接收到的消息没有对应的处理过程,则交个下面函数处理*/
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
int MiniGUIMain(int argc, const char* argv[])
{
MSG Msg;//消息数据结构体文章末尾给出
HWND hMainWnd;//窗口句柄
MAINWINCREATE CreateInfo;//窗口结构体,绘图等用到
#ifdef _MGRM_PROCESSES
JoinLayer(NAME_DEF_LAYER , "helloworld" , 0 , 0);//MiniGui-Processes模式下用到
#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;
/*设置主窗口函数,所有发往该窗口的消息有该函数处理*/
CreateInfo.MainWindowProc = HelloWinProc;
/*设置主窗口位置: 左上角(0,0)*/
CreateInfo.lx = 0;
CreateInfo.ty = 0;
/*设置主窗口位置: 右下角(320,240)*/
CreateInfo.rx = 240;
CreateInfo.by = 320;
/*设置主窗口背景颜色*/
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))//GetMessage函数文章末尾分析
{
/*把击键消息转换成MSG_CHAR消息,然后直接发送窗口过程函数*/
TranslateMessage(&Msg);
/*调用消息处理窗口过程函数(回调函数),处理完返回函数此函数*/
DispatchMessage(&Msg);
}
/*清理工作*/
MainWindowThreadCleanup(hMainWnd);
return 0;
}
#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif

*********************************

GetMessage(&Msg,hMainWnd)函数从应用程序中取出消息
Msg:消息结构体(用获取的消息填充)
hMainWnd:要获取消息的主窗口句柄
GetMessage返回值分析:
 0:获得的消息为MSG-QUIT,将导致消息循环终止,其他返回非0

消息结构体原型:

typedf struct _MSG
{
HWND hwnd;//消息发往的窗口句柄
int message;//消息标示符,每个消息对应一个整数,在window.h头文件中有预定义
WPARAM wParam;//一个32位的消息参数,其含义跟消息不同而不同
LPARAM lParam;//一个32的消息参数,其含义取决于消息的类型
unsigned int time;//消息放入消息队列的时间
#ifndef LITE VERSION
void * pAdd;
#endif
}MSG,*PMSG;

MiniGUI编程之Helloworld(一)相关推荐

  1. Linux下的Shell编程之Helloworld.sh看过来

    1.编写HelloWorld.sh vim HelloWorld.sh 2.按下i进行编辑 里面的代码如下: #!bin/sh echo "hello world!" 然后Esc退 ...

  2. 玩转手机编程之HelloWorld

    买了个Nokia N73想玩玩手机编程,于是逛了下Nokia 中文讨论区 ,开始HelloWorld之路. 1.搭环境.      Nokia手机开发环境可以是j2me或C++,C++好久没用了复习一 ...

  3. linux C编程之makefile

    linux C编程之makefile 目的:       基本掌握了 make 的用法,能在Linux系统上编程. 环境:       Linux系统,或者有一台Linux服务器,通过终端连接.一句话 ...

  4. Kotlin 元编程之 KSP 全面突破

    什么是元编程 没想到吧,这世上除了元宇宙,还有元编程,如果没有接触过,可能会有点懵,不过没关系,简单的说就是用代码来生成代码.实现元编程的传统常见手段主要是使用 APT注解处理器 + JavaPoet ...

  5. 知无涯,行者之路莫言终 [- 编程之路2018 -]

    零.前言 2017年标签:"海的彼岸,有我未曾见证的风采" 2018年标签:"海的彼岸,吾在征途" 2019年标签:"向那些曾经无法跨越的鸿沟敬上-- ...

  6. 异步编程之Promise(2):探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  7. cyclicbarrier java_Java并发编程之CyclicBarrier和线程池的使用

    原标题:Java并发编程之CyclicBarrier和线程池的使用 下面我们来讲述一下线程池和CyclicBarrier的使用和对比. 一.场景描述 有四个游戏玩爱好者玩游戏,游戏中有三个关卡,每一个 ...

  8. java线程安全的set_Java并发编程之set集合的线程安全类你知道吗

    Java并发编程之-set集合的线程安全类 Java中set集合怎么保证线程安全,这种方式你知道吗? 在Java中set集合是 本篇是<凯哥(凯哥并发编程学习>系列之<并发集合系列& ...

  9. linux c编程之fcntl

    fcntl可实现对指定文件描述符的各种操作,其函数原型如下: int fcntl(int fd, int cmd, ... /* arg */ ); 其中,操作类型由cmd决定.cmd可取如下值: F ...

最新文章

  1. 「文本信息抽取与结构化」详聊文本的结构化「下」
  2. 让Windows下的Tomcat将控制台信息记录到日志
  3. 傅里叶变换函数FFT的使用方法
  4. 热模块替换html,热模块替换启用,但不能正常工作http:// localhost:3000/__ webpack_hmr...
  5. Psych101(part7)--Day7
  6. linux多进程优先级,Linux多线程之优先级
  7. Hyper-V应用指南之3-理解并配置Hyper-V虚拟网络[转]
  8. OpenPose Demo
  9. 查岗神器!如何查看连接过的WiFi记录+详细信息+密码找回
  10. Firefox Pale Moon此连接是不受信任的、无效的安全证书解决办法
  11. xaxis python_在python中绘制xaxis中的多列值
  12. excel怎么从身份证中提取性别?
  13. CRM系统中的线索、客户、联系人、商机
  14. 从金庸小说看古代武侠世界计划生育
  15. JUC多线程并发编程
  16. Windows 10 第七个大版本更新来了,10个全新功能安排得明明白白~
  17. 页面关键字实时搜索查询案例
  18. 【从零开始学Skynet】基础篇(二):了解Skynet
  19. 网站被篡改怎么办?如何防护网站被黑
  20. http://blog.csdn.net/maomi01/archive/2005/11/21/533969.aspx

热门文章

  1. Telltale:看Netflix如何简化应用程序监控体系
  2. Java多线程之8Lock问题解析
  3. CVPR 2019 | 腾讯AI Lab解读六大前沿方向及33篇入选论文
  4. Facebook开源计算机视觉目标检测平台Detectron
  5. ubuntu 允许root用户登陆ssh
  6. 人生最美妙与最残忍的事情是同一件,那就是不能重来
  7. Cloudera maneger登录页面后的操作是什么?
  8. PageHelper分页插件的原理是什么
  9. leetcode 39. Combination Sum | 39. 组合总和(Java)
  10. javaweb异常笔记