在Pocket Outlook中,可以看到一个名为"Letter Strip"的控件,它允许用户通过点击九个字母区域中的一个来选择或查找列表中的信息。Pocket Outlook实现的行为是查找所有以给定字母开头的记录。如果用户想要选择同一组中的另一个字母,只需再次点击相同的区域,控件就会循环遍历所有三个字母。
这是一个在MFC中实现的"快速且简陋"的控件。它之所以如此简陋,是因为导航条的图像是通过远程缩放获取的位图。希望这不会侵犯版权...
至于"控件"本身,它是一个派生自CWnd的类,使用位图进行绘制。如所见,这意味着控件不是自包含的,因为它依赖于外部提供的位图资源ID(很容易解决这个问题)。
要使用CLetterStrip类,只需要包含头文件,并创建窗口,使用如下代码:
BOOL Create(DWORD dwStyle, CPoint pt, CWnd *pParentWnd, UINT nID);
例如:
dwStyle = WS_CHILD | WS_VISIBLE;
m_wndStrip.Create(dwStyle, CPoint(0, 0), pParentWnd, ID_LETTERSTRIP);
当用户点击导航条时,它会计算出合适的字母,并将其报告给父窗口,发送一个ON_COMMAND消息。处理通常是这样的:
ON_COMMAND(ID_LETTERSTRIP, OnLetterStrip)
在处理命令时,可以像这样查询选定的字母:
TCHAR szLetter[2] = {0, 0};
szLetter[0] = m_wndStrip.GetOption();
这是一个非常简单的控件实现。正如之前所说,它不是自包含的,这可能是个麻烦。通过MFC调用报告选定的字母。在未来的版本中,窗口将支持一个消息来返回选定的字母。控件没有提供积极的反馈(就像Pocket Outlook中的那样)。可以包括一个声音消息,但一个真正不错的特性是提供即时的视觉反馈。这将通过以不同的颜色绘制选定的字母来实现。嗯,这意味着放弃位图的胡说八道,绘制整个东西(然后它也将是自包含的)。最后,这还没有在对话框中测试过。