1. 首页
  2. 移动开发
  3. 其他
  4. wince编程第三版(中文高清晰).pdf

wince编程第三版(中文高清晰).pdf

上传者: 2018-12-25 16:35:55上传 PDF文件 73.6MB 热度 69次
wince编程第三版(中文高清晰).pdf虽然 Windows cl和 Windows的其它版本之间确实存在差异,但不应该夸大这种差异。编写 Windows ce应用程序依然是编与 Windows应用程序。有同样的消息循环,同样的窗∏,大部分情况下,具有同样的资源和控件ε差异并不会掩盖相同的地方。匈牙利命名方式是重要的相同点之一。匈牙利命名方法自从 Charles petzold写《 Windows程序设计》一书开始,大部分 Windows程序都采用了匈才利命名方法,这是一种传统和良好的命名方法。这种编程风格是Charles simony i多年前在微软发明的,它给程序里每个变量用1到2个字母的前缀来表示变量的类型。例如,命名为Nue的宇符串数组应该命名为s厶Naue,前缀sz表示变量类型是以0做终止符的字符串。匈牙利命名法的价值在于极人的提高了源程序的可读性。其它的程序员,或者你看一段代码,不应该重复的看变量声明来判定变量的类型。表1-1列出了变量典型的匈牙利前缀。表11变量的匈牙利前缀变量类型匈牙利前缀Integer1 o nWord(16-bit)Double word(32-bit unsignedLong(32-bit signed)CharstringZPointerLong pointerpHandlehWindow handlehwndStruct size你可以看到 Windows早期的一些痕迹。1或者长指针,在 Intel16位编程模式下,指针分位短指针(16位偏移)和长指针(附加偏移段)。其它前缀由类型的缩写构成。例如,刷子的句柄通常是hbr。前级可以是组合的,就像1psz,指出一个以0结尾的长指针。 Windows apl中大部分结构是采用匈牙利表示法来给它们的域命名的。本书通篇使用这种命名法。我鼓励你在你的程序里用这种命名方法1-3.第一个 Windows ce程序说了这么多,就让我们起看下你的第个 Windows Ce程序吧。列表1-1显示了Hell1—为 WindOws ce写的一个简单的 Hello orld应用程序Listing1-1: Hello1,一个简单的 Windows应用程序Hellol. cppfinc lude windows. hint WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstanceLPWSTR lpCmdLine, int nCmdShow)(rinf ("Hello World\n)return o如您所见,除了程序入口点外,代码看上去十分类似经典的 Kernighan和 Ritchie版程序。在注释之后,有一行代码#inc ludewindows. h这个文件包含了一组文件,它们中定义了 Windows api及其用到的结构和常量程序的入口点是本程序和标准C程序之间最大的差别。作为C标准入口int main(char **argv, int argc的替代品, Windows ce通过标准 Windows入门点注1int WINAPI WinMain (HINSTANCE hIns Lance, HINSTANCE hPrevInstanceLPWSTR lpCmdLine, int nCmdShow构建程序环境。WindOws ce在一些方面不同于桌面版的 Window。第1个參数, hInstance为其它应用程序指明具程序实例,也为需要验证这个EXE的 Windows ApⅠ函数提供了程序实例。参数 hPrevInstance是从旧的Win16API( Windows3.1及更早的系)遗留下来的。包括 Windows ce在内的所有Win32操作系统中, hPrev instance始终是0,可以忽略掉。参数 IpCmdlinc指向一个 Unicode字符串,包含了命令行文本。从微软 WindowsCE浏览器启动的应用程序没有命令行参数,但在某些情况下,例如当系统自动启动一个程序时,系统包含一个命令行参数来说明程序为什么被启动。参数lp( molina是 WindOws ce与XP出现差异的情况之一,在 Windows ce里,命令行字符串是 Unicode字符串,在其它版本的 Windows里,命令行字符串总是 ASCII的最后一个参数, nCmdShow,指叨了程序主窗口的初始状态。父进程,通常是浏览器传递这个参数到程序里。它对应用程序如何配置主窗口给出了说明。该参数可能公规定窗口最初显示成图标( SH SHOWMINIMIZ),或者显示最大亿( SW SHOWMAXIMIZED)来複盖整个桌面,或者显示为普通( SW RESTORE)大小来表明窗口按标准可变大小方式显示在屏幕上。其它值规定窗口初始状态对用户不可见,或者规定窗口可见但不能成为活动窗口。在 Windows ce里,这个参数的值被限制成3个状态:普通( SW SHOW)、隐藏( SW HIDE)和‖激活显示( SW SHOWNOACTIVATI)。除非应用稈序需要强制它的窗口预先确定状态,在:稈序主窗口被创建后,这个值是不加修改,只是简单的传递给 ShowWindow函数的。行是这个应用程序唯的功能行:printf( Hello World\n)WindOws ce支持大部分标准C库,包括 printf, getchar等等。这一行有趣的地方在丁它不像 WindOws ce其它任何地方,这个串不是 Unicode而是ANSl。下面是对这个现象的合理解释:对于用ANSI标准编的C标准厍, print f和诸如strcpy等其它字符串库函数用的是ANSI字符串。当然, Windows ce支持这些标准函数的 Unicode版,例如 printf, getwchar;和 wAsPy。最后,用 return0;结束程序。其它进程可以用Win32API函数 GetExitCodeProcess获取返回值。构建第一个应用程序要在你的系统上从头创建 Hello1,可以启动 MS evo艹+,在[File]菜单上选择[新建]创建一个新工程。当看到新T程的对话框,可以明显的看到 Wince编程与标准Win32编程的变化。你有机会选择在图1-1中所显示的各种平台。对于非MFC或ATL工程,首选是 WCE POCkel pc应用(用于 Pocket po)和WCE应用(用于其它 Windows ce系统)。您还可以选择辽当的目标CPU。例如,选择Win32(WCEMIFI)来为使用 MIFS CPU的 Windows c平台编泽程序。无论是何种目标设备都要确保选择wE模拟器。这样你就冋以在用Ⅺ卜的模拟器中运行例子程序了。图1-1平台列表使eVC++能够面向不同的 Windows ce平台。接下来,eWC艹+会询问您是否想创建一个空的工程、一个简单程序或者一个HellWorld应用。对本书里所有的例子,都选择空工程。这样倣是为了避免代码向导可例子添加任何额外的代码。在[ile]菜单选择[New, Hello1.cp创建新文件。当为 Hello1创建或从CD复制了合适的源文件,选择win32(WCEx86em) Debug作为目标平台,之后 build这个程序。这一步会编译源代码,如果没有编译错误的话,系统自动启动模拟器,并把EKE程序放到模拟器文件系统里,接下来你可以启动 Hello1。如果你在 Windows98或M系统下,模拟器系统能够公显示一个错误信息,因为模拟器只能在Win2000或Ⅻ下运行。如果你冇 WindOws ce系统,比如 Pocket pc(PPC),把PPC连接到PC上,方法和同步PC的内容到PPC一样。打开微软 ActiveSync,建立PPC和PC的链接。为了 Windows ce设备能够运行,虽然 Activesync链接并不是必须的,但我发现计它运行可以为开发环境和 WindOws ce系统之间建立一个更稳定的链接但PC和 Windows ce设备之间的链接成功和运行,切换回eVC艹+,选择合逗的目标设备(如适合 iPaq Pocket PC的win32[ WCE ARMI Debug)进行编译和rebuild。和为模拟器创建程序一样,如果没有错误,cVC艹+自动下载编译程序到远程设备上。程序要么被放到对象存储的根目录上,要么放在 windowsstart菜单目中运行该程序要在嵌入式 Windows ce设备H/PC上运行le1lol,单山手持式PC的 My computer图标,找刭根目录下的文件,之后双击应用程序图标启动程序。要在 Pocket pc上运行程序,从设备的 start菜单选择程厅就可以了。因为eYC++已经把程序下载到 windows\ start菜单所在的目录了。这种方式下,下载的应用程序自动显示在 Start菜单里。有问题?如果在 Pocket pe上点击图标或开始桨单选择 Hello程序,似乎没什么反应在手持式PC上,程序似乎只是刷新了一下屏幕。这是因为程序启动、写到控制台并结束了。除非你从个已经创建的控制台启动程序,否则 Windows ce会在Hello1执行 printf语句时,创建一个掉制台窗口,并目在 Hello1结束的时候自动关闭控制台。在 Pocket pc上,应用程序可以运行,但 Pocket pc并不为诸如 printf之类的输出提供控制台显示的功能。通过把驱动程序 console.d1放到 Pocket pc的Windows目录里,可以为 Pocket pc增加控制台支持。驱动程序从驱动程序接口获取输入,创建屏幕窗口,打印输岀字符串。控制台启动程斥可以从手持式P和嵌入式阪本的 WindOws ce获得。注1:虽然从技术上可以改变入口点原型来匹配C的标准入口点,但通常不值得这么床烦的。1-4, Hello2既然已经有了基础,那么是时候把ll-1lo升级一下,至少应该让人可以看见它。因为很多 Windows ce系统没有控制台驱动程序,He112创建一个消息框而不是用 printf来显示“ Hello ce”文字。 Hello2的程序如下表1-2所示:列表1-2: Hello2,使用 Message box函数的简单应用程序Hello2. cpp*include windows hnt WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstanceLPWSTR lpCmdLine, int nCmdShow)MessageBox(NULL, TEXT ("Hello World"), TEXT ("He11o2")MB OK)rcturn编译并运行 Hello2,可以看到如图1-2所示的小窗口图如图标wua圈 tmin Pinet F四回运行在 Windows ce桌面的He1lo2替代 printf的 MessageBox函数为 Hollo2提供了2个特性。第一个也是最明显的一个就是它创建一个窗口,并在上面显示 lello World"文本。第二个特性是Messagebox函数直到用户关闭消息窗口才会返回。这允许 Hello2一直保持运行,宜到用户关闭窗口。Messagebox函数原型如下:int MessageBox (HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINTuType)第1个参数是顶层窗口的句柄,它是消息窗口的父窗口。目前我们把这个参数置为MULL,因为 Hello2还没有任何其它窗口。第2个参数是准备显示在窗口里的文亍。注意传入的字符串是用仼EXI宏包裹的,确保它能够编译成 Unicode版本第个参数 IpCapt.ion是显示在窗口标题栏的文字。最后一个参数Type是一系列标志位,规定消息框如何显示在屏幕上。标志位规定了消息框中按扭的数量和类型,规定了图标的类型以及消息框窗口的风格设置表1-2列出了 Windows ce下有效的标志位表12:默认标志位标志位按钮或者图标用于按钮N6 OKOK and CancelNB ETRYCAACELRetry and CancelMB YES:NOYes and NoMB YESNOCAACELYes. No, and CancelWB ABORTRETRVIGNOREAbort, Retry, and Ignore用于图标4B ICOWEACLAMATION. MB ICONWARNINGExclamation pointMB ICOWTNFORMATION, MB ICONASTERISK Lower case i within a circleWE /COUES770Quest ion markWB YESOYes and No4B ICOWS TOP, HB ICONERROR, MB ICOWHAND Stop signMR DEFBUTTONTfirst but tonWB DEFBLTTON2Second buttonAB DEFbl7T0N3Third buttonFor Window StylesHB SETFUREGROLADBring the message box to theforeground.AB OPMUSTMake the mcssagc box thotopmost window.MessageBox的返回值指出用户按了哪个按扭。返回值如下:DOK button pressed1OvEsYes button pressedNo button pressedIDCANCELCancel button pressed or esc key pressedL DABORTAbort button pressedRetry hutton pressedI/GARAI gnore but ton pressed此时值得注意的是,如果你调试和重新编译这个程序,它不会被再次下载到目标设备上的,因为程序早先的版本仍然正在∏标系统上运行。换句话说,当您在e艹中启动一个新的 build时,您要确保 Hello2没有运行在远程系统上,否则编译过程里的自动下载过程就会失败。如果发生这种情況,关闭应用程序,选择eV(+里[ pdat e Remot e File]菜单命令去下载新的编译后的文件。dello2展示了一个简单的窗口,但窗冂只能按 MessageBox函数允许的形式进行配置。如何显小一个完全由程序配置的窗口呢?在我们这样做之前,对 Windows应用程序如何工作的做一个快速浏览是必要的。1-5. Windows应用程序剖析基于 Windows的编程远不同于基于S-Ds或Unix的编程。只要是程序需要,任何时候基丁Ws-D0S或Unix的程序都可以使月gee-或utc风格的函数从键盘读取字符并写到屏幕上。这是MS-DS或lnix程序所使用的典型的"Pu11”(拉)风格,这神风格是面冋过程的,而一个 Windows程序,则使用"Push"(推)模式在这种模式下,必须编写程序来响应来白操作系统的通知,比如一个键被压下去了或者收到一个重绘屏幕的命令windσws应用程序并不从操作系统请求输入,而是由操作系统通知应用程序输入产生了。操作系统通过发送消息、( mcs3agcs)给应用程序窗口来完成这些通知。所有窗口都是窗口类的具体实例。在进一步深入之前,让我们先确保理解这拦术语窗口类窗口是屏幕上的一个区域,除了特殊情况,基本上都是矩形。窗口有一些基本参数,比如位置参数—x,y和z(窗口在屏幕其它窗口之上或者之下)一可视性以及层次关系一窗口与系统桌面形成父子窗口关系,系统桌面也是一个窗口每个被创建的窗口都是窗口类的一个具体实例。窗口类是一个模板,为该类的所有窗口定义了许多共同属性。换句话说,属于同一个类的窗口有同样的属性。这些具亨的属性屮最重要的是窗口过程。窗口过程窗口类里窗口过程中的代码定义了同一个类里所有窗口的行为。窗口过程处理发到窗口的所有通知和请求。这些通知,要么是捰作系统发给窗口,告诉窗口有事件发生,窗口必须回应,要么是其他窗口发来的,向该窗口查询信息。这些通知是以消息的形式发送的。消息实际就是对窗口过程的一次调用,带有参数指出通知或者查询的种类。当有事件发生,例如窗口被移动、被改变大小或有键被按下去等,就会发送消息。标识消息的值由 Windows定义。应用程序使用预定义好的常量,例如 WM CREATE和 WM MOVE,来表示消息。因为有很多消息可被发送,所以当窗口类对某个消息没有特姝处堐的必要时, Windows提供了一个默认处理函数来处理传递这些消息。消息生命周期计我们回头一会,看一下 Windows是如何协调发到系统里各个窗口的各种消息的。windωws监视系统的所有输入,例如键盘、鼠标、触摸屏以及其亡可以产生影响窗口的事件的硬件。当事件发生后,消息就被构成并定向给特定的侒口Windows没有直接调用窗口过程,而是加了一个中间步骤。消息被放到拥有该窗口的应用程序的消息队列里了。当应用程序准备接收消息的吋候,它把消息从队列甲取出来,并告诉 Windows发送该消息到应用程序适当的窗口上你可能会认为这个过程中涉及许多中间步骤,那么你是对的。就让我们分解一下这个过程吧。1、当事件发生, Windows就构成个消息并放到拥有目的窗凵的应用程序的消息队列里。和在XP里一样,在 Windows ce中,每个应用程序有自己单独的消息队列[1](这与 Windows3.1及更早的 Windows版本不同,那时具有唯一一个系统范围内的消息队列)。事件发生及构成一个消息都要比应用程序处理它们的速度快。虽然煋序最好能快速响应或者用户希望看到应用程序快速响应,但是队列允许应用程序按自己的速率处理消息。消息队列允许 Windows在运做中设置一个通知并继续完成其它任务,而不是仅仅限制在只响应收刭消息的这个应用程序。2、应用程序把消息从消息队列中移出来,并回调 Windows来分派消息。似乎很奇怪应用程序从队列里获得消息却只是简单的回调 Windows来处理这个消息,对这种方式,解释如下:应用程序从队列里获取消息,这使得应用程序在请求Windows把消息分派到相应窗冂之前,可以预处理这些消息。许多情况下,应用程序会调用 Windows里不同的函数来处理具体的各种消息。3、 Windows分发消息,更确切的说,是 Windows调用相应的窗口过程。没有让应用程序直接调用窗口过程,而是问接调用,这允许 Windows协调这个窗口过程的调用与系统里的其它事件。虽然此刻消息并不在力外一个队列里,但 Windows在调用窗口过程之前,可能需要做一些预处理。但无论如何,这种调度方式减少了应用程序的责任,不用程序去决定适当的目的窗口,而是由 Windows负责了。4、窗口过程处理消息。所有的窗口过程都有相同的调用参数:被调用的窗口实例的句柄、消息参数、两个普通参数,包含与消息相关的数据。窗口过程用窗口句柄区分窗口的每个实例。消息参数,指明窗口必须响应的事件。两个普通包含与消息相关的数据。例如, WM MOVE消息指出窗口将被移动,其中一个普通参数指冋一个包含窗□新坐标的结构。注:技术上, WindOws ce应用程序的每个线浧粼有一个消息队列。稍后我将在本书里讨论线程。1-6.e1lo3回顾的够多了,是时候做一个完整的 Windows应用程序一He1lo3了。虽然 Hello3的整个程序文件以及书中全部例子都可以在附书光盘里找到,但我还是建议,对于初期的例子,您应当避免简单的从CD上装载工程文件,而是应该手工输入整个例子。通过这种略微有些枯燥的上作,你会体会到标准Win32程序与 WindowsCE程序之间在开发过程的不同以及在程序上的细微差别清单1-3给出了 Hello3的全部源代码清单1-3:程斤 Hello3Hellos. cpp#inc lude windows, h>// For all that Windows stuffLRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain (IIINSTANCE hInstance, IIINSTANCE hPrevInstanceLPWSTR lpCmdLine, int nCmdShow)ANDCLASS WCHWND hWndMSG msgRegister app/icat ion main window classWC。S0stywC. lprnWndProc MairWnndProci Callback /unctionwc. cbCisextra od Extra class datawC.cbWndExtra =0:A Ertra window datawe hInstance hInstanceOwNer handlerC hIcon NULL// Application icanwC, hCursor= LvauCursor(NULL, IDC ARROW); / Delault cursorwC.hbrBackground =(HBRUSH) GetStockObject (WHITE BRUSH)wC. lpszMenuName NULLy Menu nameC. lpszClassNane= TEXT ("My Class")∥Fwido 'lass anleif (RegisterClass (&wc)==0)return -1/ Create main windowhWnd Create WindowExWS EX NODRAG∥ Ex style flagsTEXT(" MyClass"),∥∥ indow classTEXT("Hello")// Window titleWS VISIBLE WS CAPTION WS SYSMENUCW USEDEFAULT,r pOSItIOnCW USEDEFAULTy pOSITiO/CW USEDEFAULT/ Initiai widthCW USEDEFAULT,// Initiai heightNULL/ ParentNULL// Menu, must be nu11hInstance7 Application ins tanceNULL)// Pointer to createl parametersif ( IsWindcw(hWnd)) rcturn -2:// Fail code if not crcatcd// Standard show and update callsShowWindow(hWnd, nCmdShow)UpdateWindow (hWnd// Application message loopwhile(GetMessage (&msg, NULL, 0,0))ITrans lat eMes sage (&msg);DispatchMessage(msg)Instance cleanupreturn msg. pAran;
下载地址
用户评论
码姐姐匿名网友 2018-12-25 16:35:55

有一定的参考价值

码姐姐匿名网友 2018-12-25 16:35:55

还是不错的,里面有一些需要的东西。

码姐姐匿名网友 2018-12-25 16:35:55

不错 ,正是我要找的

码姐姐匿名网友 2018-12-25 16:35:55

挺好的,正需要这东西