Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1419041
  • 博文数量: 430
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4388
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 18:04
文章存档

2013年(1)

2008年(2)

2007年(14)

2006年(413)

分类:

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内核、驱动、应用程序的开发调试。很好用哦。到 下载免费版哦。

阅读(3525) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~