/*
*   helloworld.c 的开始所包括的四个头文件<minigui/common.h>、<minigui/minigui.h>、
*   <minigui/gdi.h> 和 <minigui/window.h> 是所有的MiniGUI 应用程序都必须包括的头文件:
*/
#include <stdio.h>
#include <minigui/common.h>       //包括MiniGUI 常用的宏以及数据类型的定义。
#include <minigui/minigui.h>  //包含了全局的和通用的接口函数以及某些杂项函数的定义。
#include <minigui/gdi.h>      //包含了 MiniGUI 绘图函数的接口定义。
#include <minigui/window.h>       //包含了窗口有关的宏、数据类型、数据结构定义以及函数接口声明。
//使用预定义控件的MiniGUI 应用程序还必须包括另外一个头文件— —<minigui/control.h>:
//control.h 包含了 libminigui 中所有内建控件的接口定义。
/*
*在helloworld.c 程序中,窗口过程是名为HelloWinProc 的函数。窗口过程函数可以由程序员任意命名,
*CreateMainWindow 函数根据MAINWINCREATE 结构类型的参数中指定的窗口过程创建主窗口。
*窗口过程的4 个参数与MSG 结构的前四个域是相同的。
*第一个参数hWnd 是接收消息的窗口的句柄,它与CreateMainWindow 函数的返回值相同,
*该值标识了接收该消息的特定窗口。
*第二个参数与MSG 结构中的message 域相同,它是一个标识窗口所收到消息的整数值。
*最后两个参数都是32 位的消息参数,它提供和消息相关的特定信息。
*/
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);
}
/*  MiniGUI 程序的入口点为MiniGUIMain
*   参数argc 和argv 与C 程序main
*   函数的参数argc 和argv 的含义是一样的,分别为命令行参数个数和参数字符串数组指针。
*/
int MiniGUIMain (int argc, const char* argv[])
{
MSG Msg;                                            //消息数据结构体文章末尾给出
HWND hMainWnd;                                      //窗口句柄
MAINWINCREATE CreateInfo;                           //窗口结构体,绘图等用到
#ifdef _MGRM_PROCESSES                              //JoinLayer 是MiniGUI-Processes 模式的专有函数,因此包含在 _MGRM_PROCESSES
JoinLayer(NAME_DEF_LAYER , "helloworld" , 0 , 0); //的条件编译中。在 MiniGUI-Processes 运行模式下,每个MiniGUI 客户端程序在调用其它
#endif                                              //MiniGUI 函数之前必须调用该函数将自己添加到一个层中(或创建一个新层)
/*
如果程序是 MiniGUI-Processes 服务器端,你应该改为调用 ServerStartup:
if (!ServerStartup (0 , 0 , 0)) {
fprintf (stderr,
"Can not start the server of MiniGUI-Processes: mginit.\n");
return 1;
}
*/
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;  //设置主窗口风格,这里把窗口设为初始可见的,并具有边框和标题栏。
CreateInfo.dwExStyle = WS_EX_NONE;                         //设置主窗口的扩展风格,该窗口没有扩展风格
CreateInfo.spCaption = "HelloWorld";                     //设置主窗口的标题为“HelloWorld”。
CreateInfo.hMenu = 0;                                      //设置主窗口的主菜单,该窗口没有主菜单
CreateInfo.hCursor = GetSystemCursor(0);                   //设置主窗口的光标为系统缺省光标。
CreateInfo.hIcon = 0;                                      //设置主窗口的图标,该窗口没有图标。
CreateInfo.MainWindowProc = HelloWinProc;                  //设置主窗口的窗口过程函数为HelloWinProc,所有发往该窗口的消息由该函数处理。
/*设置主窗口在屏幕上的位置,该窗口左上角位于(0, 0),右下角位于(320, 240)。*/
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 240;
CreateInfo.by = 180;
CreateInfo.iBkColor = COLOR_lightwhite;                        //设置主窗口的背景色为白色,PIXEL_lightwhite 是MiniGUI 预定义的象素值。
CreateInfo.dwAddData = 0;                                  //设置主窗口的附加数据,该窗口没有附加数据。
CreateInfo.hHosting = HWND_DESKTOP;                            //设置主窗口的托管窗口为桌面窗口
hMainWnd = CreateMainWindow (&CreateInfo);                 //创建和显示主窗口
if (hMainWnd == HWND_INVALID)                             //判读窗口句柄是否为有效的句柄
return -1;
/*ShowWindow的第一个参数为所要显示的窗口句柄,第二个参数指明显示窗口的方式(显示还是隐藏)SW_SHOWNORMAL说明要显示主窗口,并把它置为顶层窗口。
调用ShowWindow 函数才能把所创建的窗口显示在屏幕上。*/
ShowWindow(hMainWnd, SW_SHOWNORMAL);
while (GetMessage(&Msg, hMainWnd)) {    //在调用ShowWindow 函数之后,主窗口就会显示在屏幕上。和其它GUI 一样,现在是
TranslateMessage(&Msg);             //进入消息循环的时候了。MiniGUI 为每一个MiniGUI 程序维护一个消息队列。在发生事件之
DispatchMessage(&Msg);              //后,MiniGUI 将事件转换为一个消息,并将消息放入目标程序的消息队列之中。应用程序现
}                                       //在的任务就是执行如下的消息循环代码,不断地从消息队列中取出消息,进行处理:
/*
1.Msg 变量是类型为MSG 的结构,MSG 结构在window.h 中定义如下:
typedef struct _MSG
{
HWND hwnd;
int message;
WPARAM wParam;
LPARAM lParam;
unsigned int time;
#ifndef _LITE_VERSION
void* pAdd;
#endif
} MSG;
typedef MSG* PMSG;
2.GetMessage 函数调用从应用程序的消息队列中取出一个消息:
GetMessage( &Msg, hMainWnd);
该函数调用的第二个参数为要获取消息的主窗口的句柄,第一个参数为一个指向MSG
结构的指针,GetMessage 函数将用从消息队列中取出的消息来填充该消息结构的各个域
3.只要从消息队列中取出的消息不为MSG_QUIT,GetMessage 就返回一个非0 值,消息
循环将持续下去。MSG_QUIT 消息使GetMessage 返回0,导致消息循环的终止。
TranslateMessage (&Msg);
4.TranslateMessage 函数把击键消息转换为MSG_CHAR 消息,然后直接发送到窗口过程函数。
DispatchMessage (&Msg);
DispatchMessage 函数最终将把消息发往该消息的目标窗口的窗口过程,让它进行处理,
*/
/*程序退出
用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个MSG_CLOSE 消息。
helloworld 程序在收到MSG_CLOSE 消息时调用DestroyMainWindow 函数销毁主窗口,并
调用PostQuitMessage 函数在消息队列中投入一个MSG_QUIT 消息。当GetMessage 函数
取出MSG_QUIT 消息时将返回0,最终导致程序退出消息循环。
程序最后调用MainWindowThreadCleanup 清除主窗口所使用的消息队列等系统资源并
最终由MiniGUIMain 返回。
*/
MainWindowThreadCleanup (hMainWnd);
return 0;
}
#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif

第一个helloworld.c实例相关推荐

  1. 用python写helloworld_Python基于Tkinter的HelloWorld入门实例

    Python基于Tkinter的HelloWorld入门实例 本文实例讲述了Python基于Tkinter的HelloWorld入门实例.分享给大家供大家参考.具体分析如下: 初学Python,打算做 ...

  2. Android HIDL第一个HelloWorld demo

    原址 写在前面 程序员有个癖好,无论是学习什么新知识,都喜欢以HelloWorld作为一个简单的例子来开头,咱们也不例外. OK,咱这里都是干货,废话就不多说啦,学习HIDL呢咱们还是需要一些准备工作 ...

  3. SDK Instrumentation创建一个Note的实例

    除了高层框架如Robotium的solo,我们也可以直接调用SDK底层的提供的Instrumentation的API来实现如前几篇文章描述的创建一个note的功能.总所周知之Robotium就是基于I ...

  4. 静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例。

    静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例. 非静态方法可以访问类中的任何成员,而静态只能访问类中的静态成员. C# code class A { int x; static int ...

  5. 深入实践Spring Boot1.3.2 一个简单的实例

    1.3.2 一个简单的实例 Spring Boot的官方文档中提供了一个最简单的Web实例程序,这个实例只使用了几行代码,如代码清单1-3所示.虽然简单,但实际上这已经可以算作是一个完整的Web项目了 ...

  6. zynq学习02 新建一个Helloworld工程

    http://www.cnblogs.com/Rmumu/p/5705502.html http://www.cnblogs.com/151009-on-the-way/p/5777848.html ...

  7. ​iOS 9音频应用播放音频之第一个ios9音频实例2

    ​iOS 9音频应用播放音频之第一个ios9音频实例2 ios9音频应用关联 iOS9音频应用中对于在主视图上添加的视图或控件,在使用它们时必须要与插座变量进行关联.ios9插座变量其实就是为主视图中 ...

  8. iOS 9音频应用播放音频之第一个ios9音频实例

    iOS 9音频应用播放音频之第一个ios9音频实例 第一个ios9音频实例 为了让开发者可以对上面的内容有更加深入的了解,本节将实现播放音频的第一个实例.在此实例中会涉及到项目的创建.界面设计.关联以 ...

  9. 学习spring2--跟我一起学Spring 3(3)–使用Spring开发第一个HelloWorld应用

    http://www.importnew.com/13246.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 -首页所有文章资讯Web架构基础技 ...

最新文章

  1. python小工具封装_python接口自动化(二)——封装需要用到的工具类
  2. java B2B2C源码电子商城系统:服务消费(基础)
  3. 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听
  4. 事件相机特征跟踪-EKLT方法
  5. opencms常用标签
  6. Android之内存管理-内存监测-内存优化
  7. 库存管理-历史库存和收发存系列-俄罗斯库存报表J3RFLVMOBVED1
  8. 1.2 UML带来了什么(学习笔记)
  9. 大数据WEB阶段 Js常用的页面操作
  10. el-table中合并行加入图标
  11. kernel笔记——进程调度
  12. 安卓短信加密_发短信控制车辆!苹果发布ios14,手机可作车钥匙
  13. typora高亮_用Typora实现写作排版一体化
  14. SharePoint 2013 中的新增功能(与开发有关)
  15. Mysql 高负载排查思路
  16. 计算机网络教室建设方案,计算机网络教室设计方案汇总.doc
  17. Python小数整数输出
  18. 原创【歌词类】绘流年
  19. Photoshop学习(十六):利用蒙版合成图像
  20. 教你炒股票25:每日解盘

热门文章

  1. 基于Open WebRTC Toolkit(OWT)的8K全景视频低延时直播系统
  2. 观察:谁能拯救视频平台的高昂带宽成本?
  3. 2019 WAIC | 腾讯张正友:人工智能的热与酷
  4. go context之WithDeadline的使用
  5. go 随机数是重复的
  6. go WaitGroup 简单示例
  7. Hadoop权威指南 _01前言感悟
  8. 如何设计第三方账号登陆?
  9. leetcode 347. Top K Frequent Elements | 347. 前 K 个高频元素(大根堆)
  10. 【Python】count()方法:统计字符串出现的次数