选择显示字体大小

embedded visual c++开发入门

  任何一个学过编程的朋友都对hello不会陌生,但这次的这个和以前的不太一样,它是一个特别的程序,不是在功能上,是在思想上。这是一个非常经典的程序,本不想列出这个程序,但这是wince编程的典型框架,写出它可以让我们对wince的程序有一个很直观的认识。还有一个重要的原因是,这个例子程序给出了一个新的代码风格,和以前的win32程序有所不同,我十分欣赏这种代码的或者说程序结构,因此便再一次将这个程序写出。不过我做了一些小小的变动。主要的目的:

  1、了解wince程序的结构和原理

  2、欣赏并学习一种非常优美的代码风格

  3、了解使用evc编写wince程序的方法(介绍ide)

  打开embedded vc++选择新建。



  怎么样界面和vc6差不多吧。我们选择wce pocket pc 2002 application,在项目名称处输入helloce,检查cpus是否选中了arm和x86。这个应该根据你的开发环境有所不同。就我而言,首先要在pc机上进行调试,然后编译成适合我使的应用程序,我的ppc是arm cpu所以我需要wce x86和wce arm,至于其它的例如mips或sh我并没有考虑。(如果你要开发商用软件或者想让更多的人使用你的程序,你应该考虑更多种类的cpu。)好进行下一步:



  我们选择一个空的项目。单击完成。好了我们看到evc已经为我们建立了一个应用程序框架,当然在这个例子,它是空的。不过我们也可以在目录下找到下图显示的几个文件。



  好我们向我们的项目中添加一个头文件helloce.h和一个helloce.c文件。它们被我列在下面:你可以直接拷贝,不过需要注意一些讨厌的格式(例如空格)造成的编译错误。不过最好的办法是手工的输入,它们并不算长。

//======================================================================
// header file:helloce.h
//======================================================================
// 返回元素的数量,主要用于搜索消息列表
#define dim(x) (sizeof(x) / sizeof(x[0]))
//----------------------------------------------------------------------
//数据类型定义
//
struct decodeuint { //消息和消息函数的关联结构
 uint code;
 lresult (*fxn)(hwnd, uint, wparam, lparam); //这里用到了函数指针
};
struct decodecmd { //菜单和处理函数的关联结构
 uint code;
 lresult (*fxn)(hwnd, word, hwnd, word); //这里用到了函数指针
};

//----------------------------------------------------------------------
#define idc_cmdbar 1 // 命令条id

//----------------------------------------------------------------------
// 函数原型
//
int initapp (hinstance); //初始化应用函数原型
hwnd initinstance (hinstance, lpwstr, int); //初始化实例函数原型
int terminstance (hinstance, int); //实例终止函数原型
// 窗口处理函数原型
lresult callback mainwndproc (hwnd, uint, wparam, lparam);
// 消息句柄
lresult docreatemain (hwnd, uint, wparam, lparam);
lresult dopaintmain (hwnd, uint, wparam, lparam);
lresult dohibernatemain (hwnd, uint, wparam, lparam);
lresult doactivatemain (hwnd, uint, wparam, lparam);
lresult dodestroymain (hwnd, uint, wparam, lparam);

//======================================================================
// helloce - helloce.c
//======================================================================
#include <windows.h>
#include <commctrl.h>
#include "helloce.h"
//----------------------------------------------------------------------
// 全局数据
//
const tchar szappname[] = text ("helloce");
hinstance hinst; // 程序的实例句柄
//主窗口过程函数的消息映射表用到decodeuint结构
const struct decodeuint mainmessages[] = {
 wm_create, docreatemain,
 wm_paint, dopaintmain,
 wm_hibernate, dohibernatemain,
 wm_activate, doactivatemain,
 wm_destroy, dodestroymain,
};

//======================================================================
// 程序的入口
int winapi winmain (hinstance hinstance, hinstance hprevinstance,
lpwstr lpcmdline, int ncmdshow) {
 msg msg;
 int rc = 0;
 hwnd hwndmain;
 // 初始应用
 rc = initapp (hinstance);
 if (rc) return rc;
  // 初始化实例
  hwndmain = initinstance (hinstance, lpcmdline, ncmdshow);
  if (hwndmain == 0)
   return 0x10;
  // 应用程序消息循环
  while (getmessage (&msg, null, 0, 0)) {
   translatemessage (&msg);
   dispatchmessage (&msg);
  }
  //实例清除
  return terminstance (hinstance, msg.wparam);
 }
 //----------------------------------------------------------------------
 // 应用程序初始化函数
 //
 int initapp (hinstance hinstance) {
  wndclass wc;
  //注册应用程序的主窗口类
  wc.style = 0; // 窗口样式
  wc.lpfnwndproc = mainwndproc; // 回调函数
  wc.cbclsextra = 0; // 扩展的类数据
  wc.cbwndextra = 0; // 扩展的窗口数据
  wc.hinstance = hinstance; //实例句柄
  wc.hicon = null, // 图标
  wc.hcursor = null; // 鼠标
  wc.hbrbackground = (hbrush) getstockobject (white_brush);
  wc.lpszmenuname = null; //菜单
  wc.lpszclassname = szappname; //窗口类的名字

  if (registerclass (&wc) == 0) return 1;
   return 0;
  }
  //----------------------------------------------------------------------
  //初始化实例
  //
  hwnd initinstance (hinstance hinstance, lpwstr lpcmdline,
  int ncmdshow) {
   hwnd hwnd;
   // 存储程序实例句柄到全局变量
   hinst = hinstance;
   // 建立主窗口
   hwnd = createwindow (szappname, // 窗口类
    text("你好蜥蜴"), //窗口标题
    ws_visible, //样式
    cw_usedefault, // x坐标
    cw_usedefault, // y 坐标
    cw_usedefault, // 初始宽度
    cw_usedefault, // 初始高度
    null, // 父窗口
    null, //菜单,必须为null,wince窗口不支持菜单。
    hinstance, // 实例
    null); //建立参数的指针,用于wm_crate消息期间。
  // 如果不能建立主窗口返回失败
  if (!iswindow (hwnd)) return 0;
   // 显示和更新窗口函数
   showwindow (hwnd, ncmdshow);
   updatewindow (hwnd);
   return hwnd;
  }
 //----------------------------------------------------------------------
 // terminstance -程序清除
 //
 int terminstance (hinstance hinstance, int ndefrc) {
  return ndefrc;
 }
 //======================================================================
 // 下面是主窗口的消息处理函数
 //
 //----------------------------------------------------------------------
 // mainwndproc - 主过程函数,这是一个回调函数
 //
 lresult callback mainwndproc (hwnd hwnd, uint wmsg, wparam wparam,
 lparam lparam) {
  int i;
  //搜索消息列表,如果编写了对应的函数来处理这个消息则调用这个函数
  for (i = 0; i < dim(mainmessages); i++) {
   if (wmsg == mainmessages[i].code)
    return (*mainmessages[i].fxn)(hwnd, wmsg, wparam, lparam);
  }
  return defwindowproc (hwnd, wmsg, wparam, lparam); //没有编写对应的函数则调用默认的
 }
 //----------------------------------------------------------------------
 // docreatemain - 处理窗口建立(wm_create)消息的函数.
 //
 lresult docreatemain (hwnd hwnd, uint wmsg, wparam wparam,
 lparam lparam) {
  hwnd hwndcb;
  // 建立命令条.
  hwndcb = commandbar_create (hinst, hwnd, idc_cmdbar);
  // 添加退出按钮到命令条上
  commandbar_addadornments (hwndcb, 0, 0);
  return 0;
 }
 //----------------------------------------------------------------------
 // dopaintmain - 处理窗口重画(wm_paint)消息的函数
 //
 lresult dopaintmain (hwnd hwnd, uint wmsg, wparam wparam,
 lparam lparam) {
  paintstruct ps;
  rect rect;
  hdc hdc;
  // 调整客户区域的大小并考虑命令条的高度
  getclientrect (hwnd, &rect);
  rect.top += commandbar_height (getdlgitem (hwnd, idc_cmdbar));
  hdc = beginpaint (hwnd, &ps);
  drawtext (hdc, text ("你好晕倒的蜥蜴!"), -1, &rect, //被改成了中文
  dt_center dt_vcenter dt_singleline);
  endpaint (hwnd, &ps);
  return 0;
 }
 //----------------------------------------------------------------------
 // dohibernatemain - 处理窗口挂起消息(wm_hibernate)的函数,这是wince独有的消息,目的//是将内存的使用量将到最小.
 //
 lresult dohibernatemain (hwnd hwnd, uint wmsg, wparam wparam, lparam lparam) {
  // 如果窗口不是活动的,则取消命令条,释放内存
  if (getactivewindow () != hwnd)
   commandbar_destroy (getdlgitem (hwnd, idc_cmdbar));
   return 0;
 }
 //----------------------------------------------------------------------
 // doactivatemain - 处理窗口激活(wm_activate)消息的函数
 //
 lresult doactivatemain (hwnd hwnd, uint wmsg, wparam wparam, lparam lparam) {
  hwnd hwndcb;
  // 如果窗口正处在活动状态而没有命令条则建立它
  if ((loword (wparam) != wa_inactive) && (getdlgitem (hwnd, idc_cmdbar) == 0)) {
   // 建立命令条
   hwndcb = commandbar_create (hinst, hwnd, idc_cmdbar);
   // 添加退出按钮到命令条
   commandbar_addadornments (hwndcb, 0, 0);
  }
  return 0;
 }
 //----------------------------------------------------------------------
 // dodestroymain - 处理窗口销毁(wm_destroy)消息函数.
 //
 lresult dodestroymain (hwnd hwnd, uint wmsg, wparam wparam, lparam lparam) {
  postquitmessage (0);
  return 0;
 }




 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons