http://p.blog.csdn.net/images/p_blog_csdn_net/fishtangjinfu/378290/o_f.bmp

一、 实验目的

  1.了解Microwindows基本结构。

2.了解Microwindows的两套API调用及绘图原理。

3.写一个基于Microwindows的窗口应用程序,并在其上显示图片。

二、实验内容

1.掌握Microwindows应用程序开发的过程。

2.了解Microwindows的消息处理机制。

3.掌握Microwindows API的使用。

三、预备知识

1.掌握在linux开发环境中编写和调试程序的基本过程。

2.了解ARM应用程序的框架结构。

3.了解microwindows运行环境的编译,安装和配置。

四、实验设备及工具(包括软件调试工具)

硬件:SZ7207GARM嵌入式开发板、PCPentumn500以上,硬盘10G以上。

软件:PC机操作系统redhat linux 9.0minicomlinux开发环境

五、实验步骤

1.进入ARM开发环境,或者模拟环境。

2.打开一个文件编辑器,键入以下代码,“//”及其后的内容为人为加入的注释内容:

#include <windows.h>

#include <wintern.h>           //包含MwSetDesktopWallpaper的声明

#include <wintools.h>

 

extern MWIMAGEHDR image_car8;

 

#define APPCLASS      "test"

 

LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wp,LPARAM lp);

LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT uMsg,WPARAM p,LPARAM lp);

//声明过程函数

int

RegisterAppClass(void)

{

      WNDCLASS wc;

      wc.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW;

      wc.lpfnWndProc = (WNDPROC)WndProc;

      wc.cbClsExtra = 0;

      wc.cbWndExtra = 0;

      wc.hInstance = 0;

      wc.hIcon = 0;

      wc.hCursor = 0;

      wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);

      wc.lpszMenuName = NULL;

      wc.lpszClassName = APPCLASS;

      RegisterClass( &wc);

      return 1;

}   //独立出来的一个窗口注册过程

 

HWND

CreateAppWindow(void)

{

      HWND  hwnd;

      int  width, height;

      RECT    r;

      static int nextid = 0;

      GetWindowRect(GetDesktopWindow(), &r);

      width = height = r.right / 2;

      hwnd = CreateWindowEx(WS_EX_LAYERED, APPCLASS,

             "Microwindows Image Application!",

             WS_OVERLAPPEDWINDOW | WS_VISIBLE,

             CW_USEDEFAULT, CW_USEDEFAULT,

             width, height,

             NULL, (HMENU)++nextid, NULL, NULL); //创建窗口

      return hwnd;

}

//独立出来的窗口创建过程

LRESULT CALLBACK

WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)

{

      PAINTSTRUCT    ps;

      HWND         sibwp;

      HDC             hdcMem;

      HBITMAP            hbmp, hbmpOrg;

      HBRUSH             hbr;

      RECT           rc;

      extern int mwpaintSerial;

  

      switch(msg) {

      case WM_ERASEBKGND:

             return 1;

      

      case WM_PAINT:

             mwforceNCpaint = TRUE;

 

             ++hwnd->unmapcount; 

             SendMessage(rootwp, WM_PAINT, 0, 0);

             for(sibwp=hwnd->siblings; sibwp; sibwp=sibwp->siblings)

                    SendMessage(sibwp, WM_PAINT, 0, 0);

             --hwnd->unmapcount;

 

             for(sibwp=hwnd->parent->children; sibwp != hwnd;

                                                sibwp=sibwp->siblings)

                    if(sibwp->paintSerial != mwpaintSerial)

                          PostMessage(sibwp, WM_PAINT, 0, 0);

 

             BeginPaint(hwnd, &ps);

             GetClientRect(hwnd, &rc);

 

             hdcMem = CreateCompatibleDC(ps.hdc);

             hbmp = CreateCompatibleBitmap(hdcMem, rc.right, rc.bottom);

             hbmpOrg = SelectObject(hdcMem, hbmp);

 

             hbr = (HBRUSH)GetClassLong(hwnd, GCL_HBRBACKGROUND);

             FillRect(hdcMem, &rc, hbr);

             SelectObject(hdcMem, GetStockObject(DEFAULT_GUI_FONT));

             SetBkMode(hdcMem, TRANSPARENT);

#define TEXTSTRING "Microwindows Application For Image"

             TextOut(hdcMem, 0, 20, TEXTSTRING, strlen(TEXTSTRING));

             BitBlt(ps.hdc, 0, 0, rc.right, rc.bottom, hdcMem, 0, 0,

                    MWROP_BLENDCONSTANT | 100 ); //混和,使产生透明效果

             DeleteObject(SelectObject(hdcMem, hbmpOrg));

             DeleteDC(hdcMem);

 

             EndPaint(hwnd, &ps);

             break;

 

      default:

             return DefWindowProc( hwnd, msg, wp, lp);

      }

      return( 0);

}

 

int WINAPI

WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,

      int nShowCmd)

{

      MSG msg;

      mwERASEMOVE = FALSE;

      RegisterAppClass();

      MwSetDesktopWallpaper(&image_car8);

      UpdateWindow(GetDesktopWindow());

      CreateAppWindow();

      CreateAppWindow();

      CreateAppWindow();//创建多个窗口

      while( GetMessage(&msg, NULL, 0, 0)) { //进入消息循环

             TranslateMessage(&msg);

             DispatchMessage(&msg);

      }

      return 0;

}

3.编译,在开发环境下的终端里键入下面的命令:

arm-linux-gcc -o microwindows2 microwindows2.c -I. -I/home/Micro/microwindows/src/include -I/usr/local/arm/3.4.1/arm-linux/include -I/usr/include/ -Wall -Wpointer-arith -O3 -ggdb -L/usr/X11R6/lib -L/home/Micro/microwindows/src/lib -lmwin -lmwinlib -lmwengine -lmwdrivers -lmwfonts -lmwin -lmwimages -lm /usr/lib/libjpeg.a

4.同实验四、三、4

5.编译成功后,下载到开发板上,看是否能正确执行,也可以放到模拟开发环境中检验——如果你建立了模拟开发环境。(提示:在开发板中有一个终端,进入到相应的目录,执行刚才下载的文件。

六、实验结果

七、实验思考

1.对比于Nano-X实验中显示图片的程序,它们之间有什么不同?

2.如果你写过基于WindowsSDK的程序,再与Microwindows的程序结构相比较,你发现了什么有趣的现象?研究一下Nano-X的程序结构,你又发现了什么?

3.除了本书中提供的范例,你能不能使用API写一个自己的程序?观查Nano-X的部分API,以及部分FLNX的源代码,你能不能发现三者之间有什么关系?(提示:在Nano-X,及FLNX中,都是通过调Microwindows的中层及上层接口实现的。)


版权声明:本文为fishtangjinfu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。