也不能算是心得吧,在学习过程中掌握了一些处理ListBox的方法,所以做下记录.
在LISTBOX中如果在CreateWindow时使用的是WS_VSCROLL,则LISTBOX会有垂直的滚动条.
一般来说你可以向滚动条发送以下的消息:
LB_INSERTSTRING 插入字符串
LB_ADDSTRING 添加字符串
LB_DELETESTRING 删除字符串
LB_RESETCONTENT 清空LISTBOX
LB_SETCURSEL 设置当前选择项
LB_GETCURSEL 得到当前选择项 通过GetCurSel()可以获得同样的效果
LB_GETTEXT 得到字符串
LB_GETTEXTLEN 得到字符串长度
LB_GETCOUNT 得到项数
以下是LISTBOX的通知码,也就是当用户对LISTBOX进行操作时系统会发送给窗口消息队列的通知
LBN_SELCHANGE 改变选择项目时
LBN_DBLCLK 双击选项
LBN_SELCANCEL .......
LBN_SETFOCUS 得到焦点
LBN_KILLFOCUS 失去焦点
这些消息的处理都已经是定死的,如果想自己处理这些消息,就必须将窗口子类化
LRESULT CALLBACK ListBoxProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_VSCROLL:
switch(LOWORD(wParam))
{
case SB_LINEDOWN:
MessageBox(NULL,_T("fff"),NULL,MB_OK);
break;
........
}
break;
}
return CallWindowProc(oldProc,hWnd,message,wParam,lParam);
}
在主窗口CREATE的消息里加上
oldProc=(WNDPROC)SetWindowLong(hwndListBox,GWL_WNDPROC,(long)ListBoxProc);
其中oldProc是LISTBOX原来的处理函数 ;
在看下我们自己写的处理函数中的最后句.因为只处理了SB_LINEDOWN消息,所以我们必须将其他的消息交给原来的处理函数做处理
wParam=MAKELONG(SB_THUMBTRACK,iVscrollPos);
SendMessage(hwndListBox,WM_VSCROLL,wParam,lParam);
你也可以这样向LISTBOX发送消息,这样原来的消息处理函数就会把LISTBOX的滚动条移动到iVscrollPos的位置