我的一亩地

辛勤劳动啊

IT博客 首页 新随笔 联系 聚合 管理
  5 Posts :: 1 Stories :: 2 Comments :: 0 Trackbacks
也不能算是心得吧,在学习过程中掌握了一些处理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的位置
posted on 2007-06-12 14:43 SFY 阅读(3951) 评论(1)  编辑 收藏 引用 所属分类: C,C++,C#

Feedback

# re: ListBox中的滚动条 2007-07-18 19:21 幻灭
向CListCtrl控件发送滚动条消息失败.
如:
::SendMessage(GetDlgItem(IDC_LIST1),WM_VSCROLL,MAKELONG(SB_THUMBTRACK,m_nPos),NULL);
其中m_nPos指定位置值.
请问是什么原因  回复  更多评论
  

只有注册用户登录后才能发表评论。