在将桌面应用程序的控件移植到Windows CE平台时,开发者需要考虑多种因素,包括操作系统的差异、API的兼容性以及用户交互方式的变化。本文将讨论如何将一个颜色选择器控件移植到Windows CE(特别是PocketPC2002版本),并保持与桌面版本的兼容性。
移植过程中,使用了预处理器宏 _WIN32_WCE 来实现代码在eVC++ 3.0和VC++ 6.0之间的透明编译。通过这种方式,可以在不同的开发环境中编译相同的代码,而不需要做太多的修改。
为了确保CE版本和桌面版本的兼容性,通过预编译指令 _WIN32_WCE 来控制不同平台下的行为。例如,在CE版本中,弹出窗口是静态分配的,因为CE不支持WM_NCDESTROY消息,这使得动态删除弹出窗口变得不可能。为了解决这个问题,添加了一些属性设置方法。
在PocketPC2002上,用户交互方式与桌面环境有所不同。例如,CE版本不支持鼠标事件WM_MOUSEMOVE来选择颜色,因为CE没有鼠标支持。因此,用WM_LBUTTONDOWN事件来替代,并且处理代码保持不变。
在PocketPC 2002的MFC中,CColorDialog类不被支持。虽然可以使用内置的ChooseColor API,但结果并不理想(具体见源代码中的注释)。因此,将按钮文本从“选择颜色”更改为“取消”。
为了改善用户体验,修改了CColourPopup的OnKillFocus处理器,允许弹出窗口在失去焦点时关闭。这是一个重要的改进,因为它允许用户在完成颜色选择后,通过点击其他地方来关闭弹出窗口。
代码已在PocketPC2002平台上进行了测试,并在eVC++ 3.0的Level 3级别下编译,没有出现错误或警告。
2003年2月6日:修改了CColourPopup的OnKillFocus处理器,以便在失去焦点时允许弹出窗口关闭。
通过上述步骤,成功地将颜色选择器控件移植到了Windows CE平台,并确保了与桌面版本的兼容性。这个过程涉及到对用户交互方式的调整、对不支持控件的处理以及对焦点行为的改进。通过这些努力,为用户提供了一个在不同平台上都能良好工作的应用程序。
以下是代码示例,展示了如何在Windows CE上实现颜色选择器控件的基本框架:
// 预处理器宏定义,用于区分平台
#ifdef _WIN32_WCE
// Windows CE平台特有的代码
#else
// 桌面平台的代码
#endif
// 静态分配的弹出窗口
class CColourPicker {
// ...
};
// 处理颜色选择的事件
void OnColourSelect() {
// ...
}