分类:
2006-11-06 13:40:53
HelloWorld程序分析
木木 wangzitan@163.com
大凡学习高级语言程序设计的人接触的第一个程序就是HelloWorld程序了:
比如c的HelloWorld:
/*
** helloworld.c: Sample program for C
** The first C application.
** Copyright (C) 2004 Feynman Software.
** author:木木
** Date:2005/7/1
** License: GPL
*/
void main()
{
printf(“Hello world!\n”);
}
的确,Helloworld程序我们走如计算机软件开发的大门,下面我们主要针对MiniGUI下的Helloworld进行分析。目的在于让大家明白MiniGUI下的图形界面应用程序的结构,从而进入MiniGUI的大门。同样的道理,这是入门性质的文章,您要是高手请不要在这里浪费时间。
在我们分析Helloworld.c前我们下分析下一个最简单的Window窗口。
大家可以看到,该窗口有个标题条(最顶上蓝色区域),在标题条中一个tittle(helloworld)也一个系统按钮(×)用于关闭程序。标题条下面是客户区(灰色区域)大家可以在改区域绘图、添加按钮(比如“确定”按钮)、或者子窗口。在GUI程序中几乎所有的窗口元素都可以理解为一个窗口,像图中的“确定”按钮,它是属于主窗口的一个子窗口。当然该主窗口可能还有好多其他的元素,如:菜单、工具栏、状态栏等。
好了让我们进入主题吧(好开心哦)。
我们打开飞漫科技的Helloworld.c。(该文件在那里呢??)
为了方便讲解我把该源文件进行修改:
/*
** $Id: helloworld.c,v 1.25 2005/02/01 09:42:31 clear Exp $
**
** Listing 2.1
**
** helloworld.c: Sample program for MiniGUI Programming Guide
** The first MiniGUI application.
**
** Copyright (C) 2004 Feynman Software.
**
** License: GPL
**
** Last Edited by Mumu
*/
#include
#include
/*木木注释:以上为包含标准库*/
#include
#include
#include
#include
#include
#include
/*木木注释:以上为包含MiniGUI库*/
#define IDC_CTRL1 100 /*木木注释:定义一个控件当然你也可以不需要它*/
int InitWindow(HWND hWnd); /*木木注释:自定义一个窗口初始化函数,你也可以不需要它而直接在消息处理中*/
/*木木注释:进入消息循环中*/
static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
switch (message) {
case MSG_CREATE:
/*当窗口创建时该消息产生,您可以在这里尽心窗口初始化,比如添加控件*/
InitWindow(hWnd);
break;
case MSG_PAINT:
/*当绘制窗口时该消息产生,您可以添加些绘图函数,我们“Hello world ”就是在这里实现。*/
hdc = BeginPaint (hWnd);//得到绘图设备
TextOut (hdc, 125, 50, "hell 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[])//main函数对应Windows的WinMain和c中main
{
MSG Msg;//定义消息
HWND hMainWnd;//生成主窗口句柄
MAINWINCREATE CreateInfo;//定义主窗口结构
#ifdef _LITE_VERSION//预处理:判断是否Lite版本
SetDesktopRect(0, 0, 1024, 768);
#endif
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;//设置主窗口风格
CreateInfo.dwExStyle = WS_EX_NONE;//设置主窗口扩展风格
CreateInfo.spCaption = "First App";//设置主窗口标题
CreateInfo.hMenu = 0; //设置主窗口菜单
CreateInfo.hCursor = GetSystemCursor(0); //设置主窗口鼠标光标
CreateInfo.hIcon = 0; //设置主窗口图标
CreateInfo.MainWindowProc = HelloWinProc; //设置主窗口消息处理函数过程
CreateInfo.lx = 0; //设置主窗口位置x坐标
CreateInfo.ty = 0; //设置主窗口位置y坐标
CreateInfo.rx = 320; //设置主窗口宽度
CreateInfo.by = 240; //设置主窗口高度
CreateInfo.iBkColor = COLOR_lightwhite; //设置主窗口客户区背景色
CreateInfo.dwAddData = 0; //设置主窗口的附加数据,通常不需要
CreateInfo.hHosting = HWND_DESKTOP; //设置主窗口的托管窗口,通常为桌面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;
}
int InitWindow(HWND hWnd)//自定义的初始化窗口函数,在MSG_CREATE处理中调用,当然你可以把下面代码直接方到MSG_CREATE消息处理下面。但是代码可读性就不是很好了
{
static HWND hChildWnd1;//定义控件的窗口句柄,任何控件都是窗口
hChildWnd1=CreateWindow("BUTTON","OK",WS_CHILD|WS_VISIBLE,IDC_CTRL1,200,180,40,25,hWnd,0);//建立一个标题为“OK”的按钮
return 0;
}
#ifndef _LITE_VERSION
#include
#endif
现在我们注释完了整个程序,相信你对各个函数、语句有了初步的了解了,下面我们分析下整个程序的框架。
一个窗口就是一个数据结构,在主函数中设置好这个结构后就可以通过CreateWindow函数把他“画”在屏幕上。“画”完之后等待用户的输入,比如键盘按下、鼠标点击了或者用户移动窗口、改变窗口大小等。这些都是“事件”,每当有事件产生,系统会给该窗口一个对应于该“事件”的“消息”,“消息”也是一个结构体,它包含了“事件”发生的时间、位置、以及类型等信息。窗口有一个“消息”队列,每产生一个新的消息就放在该队列的最后,窗口还对应一个消息处理函数,它不停的充队列中取出消息,按照消息进行分类处理,一直到收到MSG_CLOSE消息则退出。并销毁掉窗口。
整个流程入下图:
MiniGUI开发基础教程(二)
在VC下编译运行MiniGUI程序
“哈哈,我用MiniGUI作的是Linux下的应用程序,怎么可以在VC下编译运行呢,木木脑子没坏吧?”
我虽然木了点但是脑子没坏哦~~~请看:
一、 下载开发环境:
首先到(飞漫软件MiniGUI官方)下载minigui-dev-1.6-win32.rar软件包。把它解压后。
把原来的HelloWorld删除或者改名。
二、 建立工程
使用VC的【文件|新建】菜单,选“工程”标签,选择win32 console application 工程类型。输入文件名HelloWorld,选择工作路径为您解压后了路径,比如您解压后放在F:\BOOK\minigui\minigui-dev-1.6.2-for-win32\目录下,那么工程的保存路径应为F:\BOOK\minigui\minigui-dev-1.6.2-for-win32\HelloWorld。如图:
按确定后选择An empty project。如图
按下Finish即可。
三、 输入源代码
1、新建立文件输入代码,可以复制上文中的源代码。保存明为helloWorld.c。
2、使用菜单【project | add to project | files 】打开对话框,选择我们刚才建立的helloWorld.c
按下OK即可。
四、 工程设置
使用菜单【project | seting】或按下Alt+F7设置工程。
1、选择C/C++页面选择category选项中的Prerocessor,在Additional include directories下面输入:../include,../include/pthread-win32,如下图:
2、选择Linux页面,选择Category为General选项。
在Object/library modules:下面的编辑框后面添加minigui.lib pthreadVC1.lib两个库。
3、选择Category为input选项。在Additional library path下输入:“../lib”如图:
现在就设置OK啦,很辛苦吧?
五、 编译工程
现在就可以编译工程了,使用VC的工具:具体方法参考VC使用手册。
六、 运行
要运行工程先要把我们解压后的目录下的wvfb.exe运行起来。如图
然后运行HelloWorld。使用VC的工具栏。
如图:
木木该不是骗人吧?怎么没有HelloWorld窗口呢??
不是了,每骗大家,看看wvfb.exe的界面吧……
哈哈,我们的Hello world窗口显示出来了。
七、 调试
调试方法和VC调试别的程序以一样的,你不会??555我没办法了,学学VC吧~~
八、 总结
现在您也可以在VC下作MiniGUI应用程序啦,虽然有些限制,不过还挺好用的,特别适合像我这样比较讨厌Linux的Xwindows界面而比较属性VC的人,心痒痒了吗?自己动手吧~~
欢迎大家和我交流,共同学习
木木,QQ:63321560(验证信息请输入:嵌入式系统开发)别的不可不加哦
MSN:
E-Mail:wangzitan@163.com
我们公司主要作嵌入式系统开发平台工具的――SldView IDE,支持ARM平台ucLinux、Linux内核、驱动、应用程序的开发调试。很好用哦。到 下载免费版哦。