一、 实验目的
1.了解Microwindows 基本结构。
2.了解Microwindows 的两套API 调用及绘图原理。
3.写一个基于Microwindows API的窗口应用程序。
4.练习使用Nano-X API 进行基本图形绘制。(参考函数手册)
二、实验内容
启动Nano-X 服务器,在屏幕上绘制一个主窗口,在主窗口上绘制直线,矩形,圆,椭圆以及填充上颜色的矩形,圆和椭圆。
三、预备知识
1.掌握在linux 开发环境中编写和调试程序的基本过程。
2.了解ARM 应用程序的框架结构。
3.了解microwindows 运行环境的编译,安装和配置。
四、实验设备及工具(包括软件调试工具)
硬件:SZ7207G ARM 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。
软件:PC 机操作系统redhat linux 9.0+ minicom+ linux 开发环境
五、实验步骤
1.进入ARM开发环境,或者进入模拟环境。
2.打开一个文件编辑器,键入以下代码,“//”及其后的内容为人为加入的注释内容:
#include <windows.h> //Microwindows的API声明
LRESULT CALLBACK wproc(HWND,UINT,WPARAM,LPARAM); //声明过程函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow) //32位程序进入点
{
static char szAppName[]="Microwindows Application!";
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = (WNDPROC)wproc;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hInstance =0;
wndclass.hIcon =0;
wndclass.hCursor =0;
wndclass.hbrBackground =(HBRUSH)GetStockObject(LTGRAY_BRUSH);
wndclass.lpszMenuName =NULL;
wndclass.lpszClassName = szAppName;
RegisterClass(&wndclass); //以上是设定一个窗口类,设定窗口属性,并注册
hwnd=CreateWindowEx(0L,
szAppName,
"China",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
200, 200, NULL, NULL, NULL, NULL);
//创建一个窗口
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd); //显示、更新窗口。
while (GetMessage(&msg,NULL,0,0)) { //进入消息循环
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK wproc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{ //窗口过程处理函数,当有消息发产生,则该函数被自动调用。并对相就消息//进行处理。
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (iMsg) {
case WM_CREATE:
break;
case WM_PAINT: //不同重类的消息。
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
DrawText(hdc, "The People's Republic of China!", -1, &rect,
DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}
return (0);
}
3.编译,在开发环境下的终端里键入下面的命令:
arm-linux-gcc -o mircowindows1 mircowindows1.c -I. -I/home/Micro/microwindows/src/include -I/usr/local/arm/2.95.3/arm-linux/include -I/usr/include -Wall -Wpointer-arith -O3 -ggdb -L/usr/X11R6/lib -lX11 -L/home/Micro/microwindows/src/lib -lmwin -lmwinlib -lmwengine -lmwdrivers -lmwfonts -lmwin -lmwimages -lm /usr/lib/libjpeg.a
由于Microwindows使用到许多的库过程,因此其命令行很长,gcc的参数意义也在前面的实验当中陈述过,你查看相应实验文档。
4.microwindows1 文件加入到根系统文件(rootfs.img)
将实验二中的rootfs.img复制到/home/Macro/armfile文件夹中,新建basicfs文件夹,在终端中进入/home/Macro/armfile,运行如下命令:
mount –o loop rootfs.img basicfs
把microwindows1 文件放入/home/Macro/armfile/ basicfs/usr/microwin/ref/bin。先进入/home/Macro/armfile/ basicfs/usr/microwin/ref/bin目录下执行如下命令。
cp /home/Micro/armfile/microwindows1 ./
umount basicfs
gzip rootfs.img
5.产生rootfs.img.gz文件,下载到开发板上,看是否能正确执行,也可以在模拟环境中检验。(提示:在开发板中有一个终端,进入到相应的目录,执行刚才下载的文件。
#cd /usr/microwin/bin
#./microwindows1
六、实验结果
七、实验思考
1.对比Microwindows API与Nano-X API的不同,及其开发模式之间的区别。你比较倾向于哪种模式的开发方式。
2.了解Microwindows的层次结构,及Nano-X的动行方式,有助于我们写出更好的程序,如果你有兴趣,你可以研究两者的源代码。
3.对于每一个程序,你可以写一个对应的Makefile文件来管理你的工程文件。熟悉Makefile的写作,有助于你减少枯燥的重复性工作,使你代码书写的工作,变得轻松而有趣。