用一个 CListCtrl 显示数据库的记录内容,共需要显示100多万条。使用 CListCtrl 的虚拟窗口功能后,完成任务。但有“小”问题,就是当执行菜单“全部选择”的功能时,由于记录条目太多了,导致频繁调用函数SetItemSate(),执行太慢了(大约5分钟)。怎么改进那?
发现用键盘(HOME, Shift + END)实现全部选择的功能,效果很好,速度很快。于是我用程序调用函数 keybd_event()模拟这个功能。效果不错,哈哈~~~~
测试人员报告:“有的计算机上,这个功能很好;有的计算机上根本就不执行”。啊?于是开始除“虫”。...... 终于找到问题啦,原来使用不同品牌的键盘,其默认的 NUM LOCK 状态不一样,导致模拟键盘动作 HOME,SHIFT + END 没有正常执行。于是,在程序中增加了函数调用 GetKeyState()进行NUM键盘状态的判断。效果不错,哈哈~~~~
测试人员报告:“用菜单命令执行,这个功能很好;用Ctrl + A加速键执行(为方便用户使用,这个加速键对应菜单的命令)有的时候好用,有的时候不好用,BUG出现的很随机”。啊?于是开始除“虫”。...... 咋找呀?这么个随机的BUG。......哈,我猜到啦~~~~。在用加速键执行的时候,有可能操作人的手指还没有离开 Ctrl 键那,于是导致执行的不是 HOME,而是Ctrl+Home,不是Shift + End,而是Ctrl + Shift + End,My god!!!没完没了的 BUG ,与大家分享。下面是改进后的代码。
cList.SetFocus();
DWORD nCount = cList.GetItemCount();
if(::GetKeyState(VK_NUMLOCK) & 1)
{
keybd_event(VK_NUMLOCK,0,0,0);
keybd_event(VK_NUMLOCK,0,KEYEVENTF_KEYUP,0);
}
if(::GetKeyState(VK_CONTROL) & 1)
{
keybd_event(VK_CONTROL,0,0,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
}
keybd_event(VK_HOME, 0, 0 ,0);
keybd_event(VK_HOME, 0, KEYEVENTF_KEYUP,0);
int nItem = -1;
POSITION pos=cList.GetFirstSelectedItemPosition();
if(pos) nItem=cList.GetNextSelectedItem(pos);
if(0 != nItem)
{
if(::GetKeyState(VK_CONTROL) & 1)
{
keybd_event(VK_CONTROL,0,0,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
}
keybd_event(VK_HOME, 0, 0 ,0);
keybd_event(VK_HOME, 0, KEYEVENTF_KEYUP,0);
}
keybd_event(VK_LSHIFT, 0, 0 ,0);
keybd_event(VK_END,0, 0 ,0);
keybd_event(VK_END, 0, KEYEVENTF_KEYUP,0);
keybd_event(VK_LSHIFT, 0, KEYEVENTF_KEYUP,0);