产品说明:
WinCE编程基础 2 Windows CE编程基础 §1 Hello Windows CE §2 屏幕绘画 §3 输入:键盘,鼠标和触摸屏 §4 窗口,控件和菜单 §5 公共控件和Windows CE §6 对话框和属性表 3 §1 Hello Windows CE §1.1 第一个WinCE程序:Hello1 §1.2 Hello1的升级:Hello2 §1.3 Windows 应用程序剖析 §1.4 一个完整的WinCE 应用程序:Hello3 §1.5 HelloCE 4 First Windows CE Application --Hello Windows CE Hello1.cpp #include "windows.h" // Program entry point intWINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, intnCmdShow) { printf("Hello World\n"); return 0; } 5 First Windows CE Application --Hello Windows CE #include "windows.h" 这个文件包含了一组文件,它们中定义了 Windows API及其用到的结构和常量. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) 程序的入口点,不同于标准C程序,参数含义如 下: 6 First Windows CE Application --Hello Windows CE -hInstance 为其它应用程序指明具体程序实例,也为需要验证这个EXE的 Windows API函数提供了程序实例. - hPrevInstance 是从旧的Win16 API(Windows 3.1及更早的系统)遗留下来的. 包括Windows CE在内的所有Win32 操作系统中, hPrevInstance始终是0,可以忽略. - lpCmdLine 指向一个Unicode字符串,包含了命令行文本. 从微软Windows CE浏览器启动的应用程序没有命令行参数,但 在某些情况下,例如当系统自动启动一个程序时,系统包含一 个命令行参数来说明程序为什么被启动. 7 First Windows CE Application --Hello Windows CE -nCmdShow 指明了程序主窗口的初始状态.(最大化,最小化,活 动等) 由父进程,通常是浏览器传递这个参数到程序里. Windows CE里,这个参数的值被限制成3个状态:普 通(SW_SHOW),隐藏(SW_HIDE)和非激活 显示(SW_SHOWNOACTIVATE). 除非应用程序需要强制它的窗口预先确定状态,在程 序主窗口被创建后,这个值是不加修改,只是简单 的传递给ShowWindow函数的. 8 First Windows CE Application --Hello Windows CE printf("Hello World\n"); Windows CE支持大部分标准C库,包括 printf,getchar等. return 0; 用return结束程序. 9 First Windows CE Application --Hello Windows CE 构建第一个应用程序 在VS2005中,创建编辑,编译上述程序 运行该程序 VS2005自动启动模拟器,并把EXE程序放到模拟器文件系统里运行 问题 运行了吗 运行了!程序启动,写到控制台,结束.除非你从一个已经创建的控制台启 动程序,否则Windows CE会在Hello1执行printf语句时,创建一个控制台 窗口,并且在Hello1结束的时候自动关闭控制台. 在Pocket PC上,应用程序可以运行,但Pocket PC并不为诸如printf之类的 输出提供控制台显示的功能.通过把驱动程序console.dll放到Pocket PC 的Windows 目录里,可以为Pocket PC增加控制台支持.驱动程序从驱 动程序接口获取输入,创建屏幕窗口,打印输出字符串.控制台启动程 序可以从手持式PC和嵌入式版本的Windows CE获得. 10 §1 Hello Windows CE §1.1 第一个WinCE程序:Hello1 §1.2 Hello1的升级:Hello2 §1.3 Windows 应用程序剖析 §1.4 一个完整的WinCE 应用程序:Hello3 §1.5 HelloCE 11 upgrade Hello1 :Hello2 升级Hello1,用一个消息框来替代Hello1中的printf Hello2.cpp #include "windows.h" // Program entry point intWINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, intnCmdShow) {MessageBox(NULL,TEXT("HelloWorld"),TEXT("Hello2"),MB_OK); return 0; } 12 upgrade Hello1 :Hello2 4 A JE > Hello2¨^ , V /,X 0k ~ printf,XMessageBox DHello2 oZ2 (M ~ 1 0k ¨Jü M6/ Hello World [ ~ 1' MessageBox D,¨*üGK`#\C0k ! E¤ ~E A Hello2 ,¨- E > ¨,¨*üGK`0k ~ 13 upgrade Hello1 :Hello2 MessageBox函数原型如下: int MessageBox (HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); -第1个参数是顶层窗口的句柄,它是消息窗口的父窗口. Hello2里为NULL,因为Hello2还没有任何其它窗口. -第2个参数是准备显示在窗口里的文字.注意传入的字 符串是用TEXT宏包裹的,确保它能够编译成Unicode 版本. -第3个参数lpCaption是显示在窗口标题栏的文字. -最后一个参数uType是一系列标志位,规定消息框如何 显示在屏幕上.标志位规定了消息框中按扭的数量和 类型,规定了图标的类型以及消息框窗口的风格设置. 14 MessageBox函数在Windows CE下 有效的标志位 标志位按钮或者图标 用于按钮 MB_OK OK MB_OKCANCEL OK and Cancel MB_RETRYCANCEL Retry and Cancel MB_YESNO Yes and No MB_YESNOCANCEL Yes, No, and Cancel MB_ABORTRETRYIGNORE Abort, Retry, and Ignore 15 MessageBox函数在Windows CE下 有效的标志位 用于图标 MB_ICONEXCLAMATION, MB_ICONWARNING Exclamation point MB_ICONINFORMATION, MB_ICONASTERISK Lower case i within a circle MB_ICONQUESTION Question mark MB_YESNO Yes and No MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND Stop sign MB_DEFBUTTON1 First button MB_DEFBUTTON2 Second button MB_DEFBUTTON3 Third button 用于窗口风格: MB_SETFOREGROUND Bring the message box to the foreground. MB_TOPMOST Make the message box the topmost window. 16 MessageBox的返回值 - MessageBox的返回值指出用户按了哪个按扭.返回 值如下: IDOKOK button pressed IDYESYes button pressed IDNONo button pressed IDCANCELCancel button pressed or Esc key pressed IDABORTAbort button pressed IDRETRYRetry button pressed IDIGNOREIgnore button pressed 17 §1 Hello Windows CE §1.1 第一个WinCE程序:Hello1 §1.2 Hello1的升级:Hello2 §1.3 Windows 应用程序剖析 §1.4 一个完整的WinCE 应用程序:Hello3 §1.5 HelloCE 18 Windows 应用程序剖析 Windows程序使用"Push"(推)模式编程. 在这种模式下,必须编写程序来响应来自 操作系统的通知,比如一个键被压下去了 或者收到一个重绘屏幕的命令. Windows应用程序并不从操作系统请求输 入,而是由操作系统通知应用程序输入产 生了.操作系统通过发送消息(messages) 给应用程序窗口来完成这些通知.所有窗 口都是窗口类的具体实例. 19 Windows 应用程序剖析 几个概念 窗口类 窗口是屏幕上的一个区域,一般是矩形.窗口有 一些基本参数,比如位置参数x,y和z(窗口在 屏幕其它窗口之上或者之下),可视性以及层 次关系等. 每个被创建的窗口都是窗口类的一个具体实例.窗口 类是一个模板,为该类的所有窗口定义了许多共同 属性.换句话说,属于同一个类的窗口有同样的属 性.这些共享的属性中最重要的是窗口过程. 20 Windows 应用程序剖析 窗口过程 窗口过程定义了同一个类里所有窗口的行为.窗口过程 处理发到窗口的所有通知和请求.这些通知,要么是 操作系统发给窗口,告诉窗口有事件发生,窗口必须 回应,要么是其他窗口发来的,向该窗口查询信息. 这些通知是以消息的形式发送的.消息实际就是对窗口 过程的一次调用,带有参数指出通知或者查询的种类. 当有事件发生,例如窗口被移动,被改变大小或有键 被按下去等,就会发送消息. 标识消息的值由Windows定义.应用程序使用预定义好 的常量,例如WM_CREATE和WM_MOVE,来表示消 息.因为有很多消息可被发送,所以当窗口类对某个 消息没有特殊处理的必要时,Windows提供了一个默 认处理函数来处理传递这些消息. 21 Windows 应用程序剖析 消息生命周期 Windows是如何协调发到系统里各个窗口的各种消息 的 Windows监视系统的所有输入,例如键盘,鼠标,触摸 屏以及其它可以产生影响窗口的事件的硬件.当事件 发生后,消息就被构成并定向给特定的窗口. Windows没有直接调用窗口过程,而是加了一个中间步 骤.消息被放到拥有该窗口的应用程序的消息队列里 了.当应用程序准备接收消息的时候,它把消息从队 列里取出来,并告诉Windows发送该消息到应用程序 适当的窗口上. 具体步骤为: 22 Windows 应用程序剖析 1,当事件发生,Windows就构成一个消息并放到拥有目的 窗口的应用程序的消息队列里. 和在XP里一样,在Windows CE中,每个应用程序有自己单独的消 息队列(在Windows3.1及更早的Windows版本中,只有唯一一个 系统范围内的消息队列).事件发生及构成一个消息都要比应用 程序处理它们的速度快.消息队列允许Windows在运做中设置一 个通知并继续完成其它任务,而不是仅仅限制在只响应收到消息 的这个应用程序. 2,应用程序把消息从消息队列中移除出来,并回调 Windows来处理消息. 应用程序从队列里获取消息,这使得应用程序在请求Windows把消 息分派到相应窗口之前,可以预处理这些消息.许多情况下,应 用程序会调用Windows里不同的函数来处理具体的各种消息. 23 Windows 应用程序剖析 3,Windows处理消息,更确切的说,是Windows调用相应 的窗口过程. 没有让应用程序直接调用窗口过程,而是间接调用,这允许 Windows协调这个窗口过程的调用与系统里的其它事件.虽然此 刻消息并不在另外一个队列里,但Windows在调用窗口过程之 前,可能需要做一些预处理.不管怎样,这种调度方式减少了应 用程序的责任,不用程序去决定适当的目的窗口,而是由 Windows负责了. 4,窗口过程处理消息. 所有的窗口过程都有相同的调用参数:被调用的窗口实例的句柄, 消息参数,两个普通参数,包含与消息相关的数据. 窗口过程用窗口句柄区分窗口的每个实例.消息参数,指明窗口必 须响应的事件.两个普通包含与消息相关的数据.例如, WM_MOVE消息指出窗口将被移动,其中一个普通参数指向一个 包含窗口新坐标的结构. 24 §1 Hello Windows CE §1.1 第一个WinCE程序:Hello1 §1.2 Hello1的升级:Hello2 §1.3 Windows 应用程序剖析 §1.4 一个完整的WinCE 应用程序:Hello3 §1.5 HelloCE 25 一个完整的WinCE应用程序 首先,必须要声明一个WinMain()函数. 在这个入口点函数中,需要按顺序做下面几件事: -用RegisterClass函数登记一个独一无二的 Class -用CreateWindowEx函数创建一个主窗口 -进入一个"消息循环",直到收到WM_QUIT消息 -从WinMain函数返回 其次,在主窗口的窗口过程中处理消息. 26 一个完整的WinCE应用程序:Hello3 #include // For all that Windows stuff LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { WNDCLASS wc; HWND hWnd; MSG msg; // Register application main window class. wc.style = 0;// Window style wc.lpfnWndProc = MainWndProc;// Callback function wc.cbClsExtra = 0;// Extra class data wc.cbWndExtra = 0;// Extra window data wc.hInstance = hInstance;// Owner handle wc.hIcon = NULL,// Application icon wc.hCursor = LoadCursor (NULL, IDC_ARROW);// Default cursor wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszMenuName = NULL;// Menu name wc.lpszClassName = TEXT("MyClass"); // Window class name if (RegisterClass (&wc) == 0) return -1; 27 一个完整的WinCE 应用程序:Hello3 // Create main window. hWnd= CreateWindowEx(WS_EX_NODRAG, // Ex style flags TEXT("MyClass"), // Window class TEXT("Hello"), // Window title // Style flags WS_VISIBLE | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT, // x position CW_USEDEFAULT, // y position CW_USEDEFAULT, // Initial width CW_USEDEFAULT, // Initial height NULL,// Parent NULL,// Menu, must be null hInstance, // Application instance NULL);// Pointer to create // parameters if (!IsWindow(hWnd)) return -2; // Fail code if not created. 28 一个完整的WinCE 应用程序:Hello3 // Standard show and update calls ShowWindow (hWnd, nCmdShow); UpdateWindow(hWnd); // Application message loop while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } // Instance cleanup return msg.wParam; } 29 一个完整的WinCE 应用程序:Hello3 // MainWndProc - Callback function for application window LRESULT CALLBACK MainWndProc (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; RECT rect; HDC hdc; switch (wMsg) { case WM_PAINT: GetClientRect (hWnd, &rect); // Get the size of the client rectangle hdc = BeginPaint (hWnd, &ps); DrawText (hdc, TEXT ("Hello Windows CE!"), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); EndPaint (hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); break; } return DefWindowProc (hWnd, wMsg, wParam, lParam); } 30 一个完整的WinCE 应用程序:Hello3 Hello3有着相同的入口点--WinMain.但是 因为Hello3创建了自己的窗口,所以它必须 为主窗口注册一个窗口类,创建窗口并且 提供一个消息循环来为窗口处理消息. 下面从这四个方面详细描述 注册窗口 创建窗口 消息循环 窗口过程 31 一个完整的WinCE 应用程序:Hello3 注册窗口类 在WinMain中,Hello3为主窗口注册了窗口类. 注册一个窗口类只是简单的填充一个描述窗口类的结构并调用 RegisterClass函数.RegisterClass和WNDCLASS结构定义如下: ATOM RegisterClass (const WNDCLASS *lpWndClass); typedef struct _WNDCLASS { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; } WNDCLASS; Hello3 中的相关代码: wc.style = 0; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL, wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("MyClass"); if (RegisterClass (&wc) == 0) return -1; 32 一个完整的WinCE 应用程序:Hello3 --结构WNDCLASS域含义 给WNDCLASS结构各个域赋的值为Hello3主窗口的所有实例定义了 行为表现. Style 为窗口设置了类的风格.在Windows CE中,类风格被限制为: - CS_GLOBALCLASS 表示类是全局的.这个标志只是出于兼容性才提供的,因为Windows CE中所有 窗口类都是进程级全局类. - CS_HREDRAW 告诉系统如果窗口改变了水平大小,就强制重画窗口. - CS_VREDRAW 告诉系统如果窗口改变了垂直大小,就强制重画窗口. -CS_NOCLOSE 如果[关闭]按钮出现在标题栏上,则使其失效. - CS_PARENTDC 让窗口使用父窗口的设备环境变量 - CS_DBLCLKS 允许[双击]通知(Windows CE下敲击两次为双击)传递给父窗口 33 一个完整的WinCE 应用程序:Hello3 --结构WNDCLASS域含义 lpfnWndProc 分配的是窗口的窗口过程的地址.因为 该域定义为指向窗口过程的指针,所 以在源代码中,必须在域被设置之 前,定义该过程的声明.否则,编译 器类型检查时会警告该行. cbClsExra 允许程序员为类结构增加额外的空间来 存储只有应用程序才知道的类特定数 据. cbWndExtra 更加便于使用,这个域为Windows内部 结构增加空间,该结构负责维护窗口 每个实例的状态. 不要在窗口结构本身里存储大量的数 据,应用程序应该存储一个指向应用 程序特定结构的指针,该结构包含窗 口每个实例的数据.在Windows CE 里,cbClsExtra和cbWndExtra域必 须是4字节的倍数. Hello3 中的相关代码: wc.style = 0; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL, wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("MyClass"); if (RegisterClass (&wc) == 0) return -1; 34 一个完整的WinCE 应用程序:Hello3 --结构WNDCLASS域含义 hInstance 设置为程序的实例句柄,该句柄指明拥有 窗口的进程. hIcon 设置为窗口默认图标的句柄,但在 Windows CE中并不支持该域,所以该 域应该设置为NULL. (在Windows CE中,会在类的第一个窗 口被创建后设置类的图标.对于 Hello3,没有图标提供,并且与其它 Windows版本不同,Windows CE中没 有任何预定义图标用于装载.) hCursor 除非应用程序是为带鼠标的Windows CE 系统设计的,否则hCursor域应该设置 为NULL. 如果系统不支持光标,调用LoadCursor (IDC_ARROW) 函数会返回NULL. Hello3 中的相关代码: wc.style = 0; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL, wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("MyClass"); if (RegisterClass (&wc) == 0) return -1; 35 一个完整的WinCE 应用程序:Hello3 --结构WNDCLASS域含义 hbrBackground 规定Windows CE如何画窗口背景. Windows用这个域中指定的刷子brush (一个小的预定义的像素数组)来画 窗口背景.Windows CE提供许多预 定义的刷子,你可以用 GetStockObject函数来装载.如果 hbrBackground域是NULL,窗口必须 处理WM_ERASEBKGND消息,重画 窗口背景. lpszMenuName 必须设置为NULL,因为Windows CE不 直接支持有菜单的窗口.在Windows CE中,菜单由主窗口创建的命令工具 条,命令带或菜单条控件提供. lpszClassName 设置为程序员定义的字符串,用于为 Windows指明类的名字. Hello3用的是"MyClass"做为类名. Hello3 中的相关代码: wc.style = 0; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL, wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("MyClass"); if (RegisterClass (&wc) == 0) return -1; 36 一个完整的WinCE 应用程序:Hello3 --结构WNDCLASS域含义 整个WNDCLASS结构被 填充后,RegisterClass 函数被调用,并用指向 WNDCLASS结构的指 针作为唯一的参数.如 果函数成功,一个标记 窗口类的值被返,如果 失败,函数返回0. Hello3 中的相关代码: wc.style = 0; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL, wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("MyClass"); if (RegisterClass (&wc) == 0) return -1; 37 一个完整的WinCE 应用程序:Hello3 创建窗口 用CreateWindow或CreateWindowEx函数调用. CreateWindowEx的原型如下: HWND CreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, intx, inty, intnWidth, intnHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); 各参数含义如下: Hello3 中的相关代码: hWnd = CreateWindowEx(WS_EX_NODRAG, TEXT("MyClass"), TEXT("Hello"), WS_VISIBLE | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAUL T, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (!IsWindow (hWnd)) return -2; 38 一个完整的WinCE 应用程序:Hello3 --CreateWindowEx参数 dwExStyle 扩展风格标志位.Windows CE能够支持的扩展风格标志如下: - WS_EX_TOPMOST窗口置顶 - WS_EX_WINDOWEDGE窗口有凸起的边框 - WS_EX_CLIENTEDGE窗口有凹陷的边框 - WS_EX_STATICEDGE静态窗口具有3D外观 - WS_EX_OVERLAPPEDWINDOW是WS_EX_WINDOWEDGE 和 WS_EX_CLIENTEDGE两个风格的组合 - WS_EX_CAPTIONOKBUTTON在标题栏上有OK按钮 - WS_EX_CONTEXTHELP在标题栏上有帮助按钮 - WS_EX_NOACTIVATE点击窗口时,窗口不成为活动窗口 - WS_EX_NOANIMATION当窗口创建的时候,顶层窗口没有弹出矩 形,在任务条上也没有按钮. - WS_EX_NODRAG防止窗口被移动 参数dwExStyle是CreateWindowEx和CreateWindow之间唯一有差别的地方. CreateWindow只是简单的将dwExStyle设置为0并调用CreateWindowEx 而已. 39 一个完整的WinCE 应用程序:Hello3 --CreateWindowEx参数 lpClassName 是实例化窗口所使用的窗口类的名字. 在Hello3里,类名是MyClass,也就是用RegisterClass 注册的类的名字. lpWindowName 用做窗口文本.在Windows其它版本里,它是用做标准 窗口标题栏里的文字.文字使用TEXT宏,确保字符串 在Windows CE下可以转换成Unicode. Hello3 中的相关代码: hWnd = CreateWindowEx(WS_EX_NODRAG, TEXT("MyClass"), TEXT("Hello"),WS_VISIBLE | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NU LL, NULL, hInstance, NULL); if (!IsWindow (hWnd)) return -2; 40 一个完整的WinCE 应用程序:Hello3 --CreateWindowEx参数 dwStyle 风格标志规定了窗口的初始风格.风格标志即用于系统里所有相关 窗口的普通风格,也用于特定类的风格,比如按钮类或者列表框 类的风格.在这种情况下,我们需要指定的就是用WS_VISIBLE 标志来指明窗口在创建时可视. x,y,nWidth,nHeight 这四个参数指定了窗口初始位置和大小. 因为Wimdows CE下大部分应用程序都是全屏窗口,所以每一个大 小和位置域都使用CW_USEDEFAULT标志作为默认值.在 Windows CE当前版本里,默认值创建的窗口,其大小覆盖整个屏 幕. 注意不要为Windows CE设备假设任何特殊的尺寸,因为不同的实现 有不同的屏幕尺寸. Hello3 中的相关代码: hWnd = CreateWindowEx(WS_EX_NODRAG, TEXT("MyClass"), TEXT("Hello"),WS_VISIBLE | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,N ULL, NULL, hInstance, NULL); if (!IsWindow (hWnd)) return -2; 41 一个完整的WinCE 应用程序:Hello3 --CreateWindowEx参数 hWndParent 父窗口句柄.因为是顶层窗口,所以父窗口域设置为NULL. hMenu 菜单域.菜单域也设置为NULL,因为Windows CE不支持顶层窗口菜单. hInstance 是传递给程序的实例句柄.窗口创建中实例句柄总会用的上,实例句柄是在 程序开始时就被存储的. lpParam 是一个指针,在WM_CREATE消息期间,用于在CreateWindow调用时传递 数据给窗口过程. 本例中,没有额外数据需要传递,所以该参数设置为NULL. 如果创建窗口成功,CreateWindow返回刚创建的窗口的句柄,如果 函数调用期间有错误发生,则返回0. Hello3 中的相关代码: hWnd = CreateWindowEx(WS_EX_NODRAG, TEXT("MyClass"), TEXT("Hello"), WS_VISIBLE | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NU LL, NULL, hInstance, NULL); if (!IsWindow (hWnd)) return -2; 42 一个完整的WinCE 应用程序:Hello3 ShowWindow函数修改窗口状态,使其同 传给WinMain的参数nCmdShow中给的状 态一致. UpdateWindow函数则强制Windows发送 WM_PAINT消息给刚创建窗口的应用程序. Hello3 中的相关代码: ShowWindow (hWnd, nCmdShow); UpdateWindow (hWnd); 43 一个完整的WinCE 应用程序:Hello3 消息循环 主窗口创建后,WinMain进入消息循环,这是每个Windows 应用程 序的心脏.Hello3的消息循环定义如下: while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } 该循环很简单:调用GetMessage函数,从应用程序消息队列中获取 下一个消息. 如果没有消息可用,则调用进入等待期
参数资料:
|
WinCE编程基础WinCE编程基础
|
|