eMbedded Visual C++开发入门

简介: eMbedded Visual C++开发入门 任何一个学过编程的朋友都对HELLO不会陌生,但这次的这个和以前的不太一样,它是一个特别的程序,不是在功能上,是在思想上。

eMbedded Visual C++开发入门

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

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

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

  3、了解使用EVC编写WINCE程序的方法(介绍IDE

  打开eMbedded VC++选择新建。



  怎么样界面和VC6差不多吧。我们选择WCE Pocket PC 2002 Application,在项目名称处输入HelloCE,检查CPUS是否选中了ARMX86。这个应该根据你的开发环境有所不同。就我而言,首先要在PC机上进行调试,然后编译成适合我使的应用程序,我的PPCARM CPU所以我需要WCE X86WCE ARM,至于其它的例如MIPSSH我并没有考虑。(如果你要开发商用软件或者想让更多的人使用你的程序,你应该考虑更多种类的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, //菜单,必须为NULLWINCE窗口不支持菜单。
    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;
 }



目录
相关文章
|
16天前
|
机器学习/深度学习 算法 算法框架/工具
为什么使用C++进行机器学习开发
C++作为一种高性能语言,在某些性能要求极高或资源受限的场景下也具有非常重要的地位。C++的高效性和对底层硬件的控制能力,使其在大规模机器学习系统中发挥重要作用,尤其是当需要处理大数据或实时响应的系统时。
31 3
|
8天前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
11天前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
16天前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
58 1
|
2月前
|
安全 编译器 C++
Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?
这些是Microsoft Visual C++不同版本的Redistributable安装包,用于32位系统,确保相关应用正常运行。它们提供C++运行时环境,简化部署流程,支持第三方库及框架,并确保应用兼容性。定期更新可修复问题并引入新功能。在空间有限或需解决程序冲突时可考虑删除,但需谨慎操作以防影响应用稳定性和兼容性。删除前请确认无应用依赖,并通过控制面板安全卸载。
84 1
Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?
|
1月前
|
编译器 Linux C语言
C++基础入门
C++基础入门
|
2月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
75 2
|
1月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
52 0
|
2月前
|
安全 编译器 C语言
C++入门-数组
C++入门-数组
|
2月前
|
存储 编译器 程序员
C++从遗忘到入门
本文主要面向的是曾经学过、了解过C++的同学,旨在帮助这些同学唤醒C++的记忆,提升下自身的技术储备。如果之前完全没接触过C++,也可以整体了解下这门语言。
下一篇
无影云桌面