第一个helloworld.c实例

来源:互联网 发布:小鹰电视直播软件 编辑:程序博客网 时间:2024/05/21 09:20
/* *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_PROCESSESJoinLayer(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_VERSIONvoid* 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
原创粉丝点击