LVIS_FOCUSED和LVIS_SELECTED的区别

本文详细介绍了MFC中列表控件(List View Control)的LVIS_FOCUSED与LVIS_SELECTED两种状态的区别。前者强调当前焦点所在,后者则表示项目被选中。通常情况下,多个项目可以被选中,但焦点只会存在于一个项目上。此外,文章还通过实例说明了这两种状态如何在视觉上体现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MFC中有个列表控件,列表中的item(条目)状态对程序员来说是个很重要的因素。

其中LVIS_FOCUSEDLVIS_SELECTED的状态区别如下:

 

1. 同一个Item可以同时具有LVIS_FOCUSED状态和LVIS_SELECTED状态(只有当鼠标单击选中某个item且悬浮在item上时才会出现这种情况)。

2. 数个item可以同时被selected,但是每次只能有一个itemfocused

3. 而且鼠标点击选中item时只触发一次selected状态,但是每次把鼠标移动到该选中的item上时都会触发focused状态。

 

 

上个栗子,可以很容易看出浅蓝色的itemselected状态,深蓝色的itemselected+focused状态(此时鼠标悬浮在该item上)。


转载自:http://blog.sina.com.cn/s/blog_d8f783c90102w3vt.html















bool SpecialCharacteristic::UpdateFromPanShi(BOOL& isHaveDelete) { vector<HugeRock> Datas; isHaveDelete = FALSE; map<CString, CString>::iterator it; CWaitExe m_waitExe;//进度条 m_waitExe.StartExe(); m_waitExe.SetProgRange(100); CString waitExeStr = L"正在更新数据,请稍等..."; m_waitExe.SetProgPos(0, waitExeStr); CString strApiBody; if (FileMap.size() > 0) { m_waitExe.SetProgPos(10, waitExeStr); int count = 0; for (it = FileMap.begin(); it != FileMap.end(); it++) { CString FileName = it->first; CString Version = it->second; if (count == 0) { strApiBody.Format(L"[{\"drawingCode\":\"%s\", \"drawingVersion\":\"%s\"}]", FileName, Version); } else { CString addBody; addBody.Format(L"{\"drawingCode\":\"%s\", \"drawingVersion\":\"%s\"}", FileName, Version); strApiBody = AddOneJsonData(addBody, strApiBody); } count++; } CString errMsg; BOOL result = GetPanShiApiData(strApiBody, Datas, errMsg); if (!result) { m_waitExe.EndExe(); return false; } } else { strApiBody.Format(L"[{\"drawingCode\":\"%s\", \"drawingVersion\":\"%s\"}]", MdlFileName, MdlVersion); CString errMsg; BOOL result = GetPanShiApiData(strApiBody, Datas, errMsg); if (!result) { m_waitExe.EndExe(); return false; } } m_waitExe.SetProgPos(80, waitExeStr); for (int i = 0; i < Datas.size(); i++) { CString version; if (FileMap.size() > 0) { map<CString, CString>::iterator it = FileMap.find(Datas[i].drawingCode.MakeUpper()); if (it != FileMap.end()) { version = it->second; } } else { version = MdlVersion; } bool found = false; for (int j = 0; j < m_listCtrl.GetItemCount(); j++) { CString code = m_listCtrl.GetItemText(j, 4); if (code == Datas[i].code) { if (m_listCtrl.GetItemText(j, 15) == L"删除特性规格")//删除后在列表中没点删除,磐石又有数据则刷新回来 { m_listCtrl.SetItemText(j, 15, L"获取图纸规格"); } // Update existing row m_listCtrl.SetItemText(j, 1, Datas[i].drawingCode); m_listCtrl.SetItemText(j, 2, version); m_listCtrl.SetItemText(j, 3, Datas[i].nodeName); m_listCtrl.SetItemText(j, 4, Datas[i].code); m_listCtrl.SetItemText(j, 5, Datas[i].name); m_listCtrl.SetItemText(j, 6, Datas[i].version); m_listCtrl.SetItemText(j, 7, Datas[i].statusName); m_listCtrl.SetItemText(j, 8, Datas[i].className); m_listCtrl.SetItemText(j, 16, Datas[i].specification); m_listCtrl.SetItemText(j, 10, Datas[i].drawingLocation); found = true; break; } } if (!found) { // Add new row int ID = m_listCtrl.GetItemCount() + 1; CString StrID; StrID.Format(L"%d", ID); int index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), StrID); m_listCtrl.SetItemText(index, 1, Datas[i].drawingCode); m_listCtrl.SetItemText(index, 2, version); m_listCtrl.SetItemText(index, 3, Datas[i].nodeName); m_listCtrl.SetItemText(index, 4, Datas[i].code); m_listCtrl.SetItemText(index, 5, Datas[i].name); m_listCtrl.SetItemText(index, 6, Datas[i].version); m_listCtrl.SetItemText(index, 7, Datas[i].statusName); m_listCtrl.SetItemText(index, 8, Datas[i].className); m_listCtrl.SetItemText(index, 16, Datas[i].specification); m_listCtrl.SetItemText(index, 10, Datas[i].drawingLocation); m_listCtrl.SetItemText(index, 15, L"获取图纸规格"); m_listCtrl.SetItemText(index, 20, Datas[i].relationNetId); } } m_waitExe.SetProgPos(90, waitExeStr); // Remove row for (int i = 0; i < m_listCtrl.GetItemCount(); i++) { CString code = m_listCtrl.GetItemText(i, 4); bool found = false; for (int j = 0; j < Datas.size(); j++) { if (code == Datas[j].code) { found = true; break; } } if (!found) { m_listCtrl.SetItemState(i, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_listCtrl.SetItemState(i, LVIS_CUT, LVIS_CUT); m_listCtrl.RedrawItems(i, i); m_listCtrl.SetItemText(i, 15, L"删除特性规格"); isHaveDelete = TRUE; } } m_waitExe.SetProgPos(100, waitExeStr); m_waitExe.EndExe(); m_editCtrl.SetTipText(strTipText); GetListData();//更新全局m_Data数据 CString key_count, important_count; GetPanShiSpecialFeatureCount(key_count, important_count); m_showStatic1.SetWindowTextW(key_count);//磐石关键特性数量 m_showStatic2.SetWindowTextW(important_count);//磐石重要特性数量 ComparisonData(TRUE, 1);//对比数据 m_listCtrl.Invalidate(); return true; }逐行解释该代码,并将其转为QT框架
最新发布
08-21
预处理: #include<iostream> #include<ws2tcpip.h> #include<Windows.h> #include<string> #include<vector> #include<CommCtrl.h> #include"resource.h" #include<sstream> #include<functional> #include<unordered_map> #include<cstdint> #include<Richedit.h> #pragma comment(lib,"comctl32.lib") #pragma comment(lib,"ws2_32.lib") #pragma comment(linker, "\"/manifestdependency:type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 初始化: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPeevinstance, LPSTR lpstr, int nCmdShow) { INITCOMMONCONTROLSEX icc; icc.dwSize = sizeof(icc); icc.dwICC = ICC_LISTVIEW_CLASSES; InitCommonControlsEx(&icc); 创建控件: hFriendList=CreateWidget(WC_LISTVIEW, L"", 0, 0, 470, 810, WS_VISIBLE | WS_CHILD | WS_VSCROLL |LVS_REPORT|LVS_SINGLESEL, hwnd, IDC_FRIEND_LIST); ListView_EnableGroupView(hFriendList, TRUE); DWORD dwEstyle = LVS_EX_FULLROWSELECT|LVS_EX_DOUBLEBUFFER; ListView_SetExtendedListViewStyle(hFriendList,dwEstyle); LVCOLUMN lvc{}; lvc.mask = LVCF_WIDTH | LVCF_TEXT; lvc.cx = 470; lvc.pszText =(LPWSTR) L"好友列表"; ListView_InsertColumn(hFriendList, 0, &lvc); 创建分组 static int groupid =1; LVGROUP group = { sizeof(LVGROUP) }; group.mask = LVGF_HEADER | LVGF_GROUPID | LVGF_STATE|LVGF_ALIGN; group.pszHeader = buffer; group.iGroupId = groupid++; group.state = LVGS_NORMAL | LVGS_COLLAPSIBLE; group.stateMask = LVGS_NORMAL | LVGS_COLLAPSIBLE; group.uAlign = LVGA_HEADER_LEFT; int b = ListView_InsertGroup(hFriendList, -1, &group);//这里返回值正常 int a = GetLastError(); LVITEM item{ sizeof(LVITEM) }; item.mask = LVIF_TEXT | LVIF_GROUPID; item.pszText = (LPWSTR)L"nihaoa"; item.iItem = 0; item.state = 0; item.stateMask = LVIS_SELECTED | LVIS_FOCUSED | LVIS_CUT; item.iGroupId = group.iGroupId; int itemindex = ListView_InsertItem(hFriendList, &item); ListView_SetItemPosition(hFriendList, itemindex, -1, -1); ListView_SetColumnWidth(hFriendList, 0, LVSCW_AUTOSIZE_USEHEADER); return group.iGroupId; } 消息处理 case WM_CONTEXTMENU: { index = GreateMyMenu(hFriendList,hwnd, me, wParam, lParam,me2); break; } int GreateMyMenu(HWND Listhwnd, HWND MainHwnd, std::vector<Menu> menu, WPARAM wParam, LPARAM lParam, std::vector<Menu>menu2) { int id=0; if ((HWND)wParam == Listhwnd) { POINT pt = { LOWORD(lParam),HIWORD(lParam) }; ScreenToClient(Listhwnd, &pt); LVHITTESTINFO hit{}; hit.pt = pt; hit.flags = 0; hit.iItem = -1; hit.iGroup =-1;//在这里初始化后 int intx=ListView_HitTest(Listhwnd, &hit); 无论点击哪里,调用后hit.iGroup还是初始化时的值
07-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值