这两天为解决PPC Today界面的显示问题着实费了不少脑筋。主要有三个问题:
1. 点击条目后高亮显示,点击其他条目后取消高亮显示问题。
2. 按上下键选择条目后,条目不高亮显示的问题。
3. 由于Today界面中的条目字体大小是按照系统设置的,是可变的,因此就遇到一个获取系统字体大小的问题。
前两个问题的高亮显示,是依靠标志位来绘制的,获取到条目被选中后,就置标志位为TRUE,否则置为FALSE,然后会进行重绘。重绘时,依靠标志位来判断是否需要高亮绘制条目。获取条目的颜色使用的是TODAYM_GETCOLOR消息,通过发送这个消息,可以获取条目的普通和高亮的颜色。
关于按上下键选择。MSDN Online上说,会触发WM_TODAYCUSTOM_USERNAVIGATION事件。但是,我在做时,并没有触发该事件。后来发现,该事件的触发条件与TODAYLISTITEM中的dwSelectability设置有关,具体可参照
http://www.codeguru.com/cpp/w-p/ce/pocketpc/article.php/c9269__1/。具体做法是在WM_TODAYCUSTOM_QUERYREFRESHCACHE事件中截获TODAYLISTITEM结构体,并将其中的dwSelectability设置为2。TODAYLISTITEM的参数意义见下表:
Value Name and Type |
Description |
DWORD: Type |
Custom Items must have Type = 4 |
DWORD: Enabled |
0 or 1; 1 causes Today panel to show your component; nevertheless, the user can control it via the Today applet in the Control Panel |
DWORD: Options |
if equals 1, the "Options" button in the Today applet will be enabled |
SZ: DLL |
Pull path to your component |
DWORD : Selectability |
New feature in Win Mobile 2003 SE; allows receiving additional notifications Values are used as follows:
- 0 or does not exist—component cannot be selected at all
- 1—selections are manages automatically. In other words, your component will receive messages like WM_LBUTTONXXX
- 2—the Today screen will send notification messages to your component when the user sets/releases focus or presses navigation keys
|
对于上下键选择,需要注意的是,处理完WM_TODAYCUSTOM_USERNAVIGATION事件后,需要返回FALSE,以使系统进行其他操作,否则,再按上下键就不会上下移动。
关于字体大小的设置,处理源代码如下:
1LOGFONT lf;
2memset(&lf,0,sizeof(LOGFONT));
3int iFontSizePixel;
4SHGetUIMetrics(SHUIM_FONTSIZE_PIXEL,&iFontSizePixel, sizeof(iFontSizePixel), NULL);
5lf.lfHeight = -iFontSizePixel;
6HFONT hNewFont = CreateFontIndirect(&lf);
7HGDIOBJ hOldFont = SelectObject(hdc, hNewFont);
8
9DrawText(hdc , theApp.m_strBarText , theApp.m_strBarText.GetLength() ,
10 &rect , DT_VCENTER | DT_LEFT | DT_INTERNAL);
Selectability参数被设置为2后,需要处理WM_TODAYCUSTOM_ACTION消息,来启动程序。