对界面上CListBox的指定项(比如第1,2两项)默认选中,CListBox为多选模式。 在对CListBox做选中和取消选中时,不允许对的默认选中做改变

ccj2326051096 2017-11-28 06:21:49
在打开界面时,对界面上CListBox的指定项(比如第1,2两项)默认选中,CListBox为多选模式。
现在我想要在对CListBox做选中和取消选中时,不允许对CListBox的默认选中做改变,该怎么做呢?
我自己试着在选择操作之后,又手动的对默认选中进行了选中操作,但是显示的效果太差了,请教各位大神帮忙~~~~
...全文
352 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
凌乱哥 2017-11-29
  • 打赏
  • 举报
回复
添加这个函数,判断点击的是哪一项,如果是默认强制选中的项,就直接return就行

void CMyListBox::OnLButtonDown()
{
//先用GetTopIndex、ItemFromPoint等获取点击的是哪一项
    if((index == 0) || (index == 1))
            return;
    CListBox::OnLButtonDown()
}
schlafenhamster 2017-11-29
  • 打赏
  • 举报
回复
5 楼的 是 发现 默认项 没选中 ,则 重置 为 选中。 下面 的 代码 与 默认项 选没选中 无关。

BOOL CxxxxDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if((pMsg->message == WM_LBUTTONDOWN) && (pMsg->hwnd==m_ListBox.m_hWnd))
	{// 
		CRect rc;
		 POINT pt=pMsg->pt;
		 m_ListBox.ScreenToClient(&pt);
		 int all=m_ListBox.GetCount();
		 for(int jj=0;jj<all;jj++)
		 {// hit test
			m_ListBox.GetItemRect(jj,&rc);
//			afxDump << rc << ";" << pt<< "\n";
			if(rc.PtInRect(pt))
			{
				if(jj==DEF_SEL1 || jj==DEF_SEL2) 
				{// no change
					//afxDump << jj << "\n";
					return TRUE;;
				}
			}
		 }
	}
//	
	return CDialog::PreTranslateMessage(pMsg);
}
zgl7903 2017-11-29
  • 打赏
  • 举报
回复
使用 CCheckListBox 有子项使能函数 CCheckListBox::Enable( int nIndex, BOOL bEnabled = TRUE );
schlafenhamster 2017-11-29
  • 打赏
  • 举报
回复
5楼的代码,你试试 没有 ? 怎么就不符合你的 要求 ?
战在春秋 2017-11-29
  • 打赏
  • 举报
回复
涉及到重绘,需要借助OnDrawItem方法和DrawMode.OwnerDrawFixed属性。 还算比较有难度,我手头没有现成代码。 或者可以换一个思路,既然这两项始终要选中,可以将其与其它选项分离,单独用别的控件显示。
ccj2326051096 2017-11-29
  • 打赏
  • 举报
回复
感谢大家的回复 但是大家的回答都不符合我想要的 问题还没有解决 帖子我先关闭了
ccj2326051096 2017-11-28
  • 打赏
  • 举报
回复
@fight_in_dl 你好 那我想请问对于一个CListBox,对于他的某一项该如何让他不响应鼠标点击呢 而设置背景外观需要重绘控件???
战在春秋 2017-11-28
  • 打赏
  • 举报
回复
可以设置默认项的背景外观,使其突出显示,但并不响应鼠标点击,这样鼠标点不点这两项都没事,仍然保持选中状态。 不响应鼠标点击可以设置其属性为disable,具体可以查阅资料。
ccj2326051096 2017-11-28
  • 打赏
  • 举报
回复
而在二楼中我的代码则是我自己通过在点击事件中通过获取并判断点击项是否为默认选中项,如果是则手动的再将此项设置为选中,但是此种做法会出现选中项先取消高亮再选中,很丑~~所以想问问各位有没有什么好办法
ccj2326051096 2017-11-28
  • 打赏
  • 举报
回复
@schlafenhamster @schlafenhamster @fight_in_dl 感谢各位的回答,但是我想各位误解了我的意思,我现在的问题并不是在初始化的时候对于项的默认选中,和选中项的选中,又或者是多选~~ 我现在的问题是:在初始化界面之后,在进行多项选择的时候对于初始化的默认选中项,不希望进行更改。即:无论是否点击默认的选中项,默认选中项都保持选中状态,即保持高亮
schlafenhamster 2017-11-28
  • 打赏
  • 举报
回复
对话框初始化: #define DEF_SEL1 4 #define DEF_SEL2 5 m_ListBox.SetSel(4); m_ListBox.SetSel(5); ////////////////////////////////////////////////////////////////////////////////////// void CxxxxDlg::OnSelchangeList() { // TODO: Add your control notification handler code here int def1=m_ListBox.GetSel(DEF_SEL1); int def2=m_ListBox.GetSel(DEF_SEL2); if(def1==0) m_ListBox.SetSel(DEF_SEL1); if(def2==0) m_ListBox.SetSel(DEF_SEL2); }
schlafenhamster 2017-11-28
  • 打赏
  • 举报
回复
多选 要用 m_ListBox.GetSelItems(nMaxItems,prgIndex);
战在春秋 2017-11-28
  • 打赏
  • 举报
回复
很惭愧,没看懂需求是什么。 感觉可以在每次打开界面(界面获得焦点)时,设置第1、2项为选中状态。
ccj2326051096 2017-11-28
  • 打赏
  • 举报
回复
这是我现在的测试代码,但是感觉有点丑,将默认项0设定为始终选中 CListBox的Selection属性设置为Multiple void CMyListBox::OnLbnSelchange() { CCListBoxDlg* aa = (CCListBoxDlg*)GetParent(); int Item = this->GetCurSel(); if (Item == 0) { //当前后选项相同时 取消选中 this->SetSel(aa->SelectItem); } }
schlafenhamster 2017-11-28
  • 打赏
  • 举报
回复
得 看你的代码

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧