使用WIN32 SDK如何能选中LISTVIEW控件的一行都高亮显示?

loepin 2010-06-05 10:45:08
在win32 SDK下,单击listview控件的时候只有第一列(主项目)可以被高亮显示,而其它列(子项目)没有高亮显示。查看一些文章说是用ListView_SetItemState函数可以解决,我测试这个函数,可是还是没有解决到。
我的代码如下,想让第二行全高这显示

case WM_CREATE:
{
hlistview = CreateWindowEx(NULL,_T("SysListView32"),NULL,LVS_REPORT | WS_CHILD |WS_VISIBLE,
0,0,200,200,hwnd,NULL,instance,NULL);
InsertColumn();
InitListView();



ListView_SetItemState(hlistview,1,LVIS_SELECTED ,LVIS_SELECTED);

return (0);
} break;

请指教。
...全文
948 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhou1xp 2010-06-05
  • 打赏
  • 举报
回复
LVN_ITEMACTIVATE
#if (_WIN32_IE >= 0x0400)
lpnmia = (LPNMITEMACTIVATE)lParam;
#else
lpnm = (LPNMHDR)lParam;
#endif

在初始化的时候处理这个消息看看
loepin 2010-06-05
  • 打赏
  • 举报
回复
1楼,使用你说的ListView_SetExtendedListViewStyle(),运行后只是增加了网格线,没有使第二行全选中并高亮显示。我现在想程序一运行,LISTVIEW中第二行就处于被选中状态,并是高亮显示的。
以下我的全部代码,请高手运行一下。


#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#include "tchar.h"
#include "commctrl.h"
#pragma comment(lib,"comctl32.lib")

#define WINDOW_CLASS_NAME "WINCLASS"

HWND hlistview;
HINSTANCE instance;

TCHAR listindex[] = _T("%d");
TCHAR listcont1[] =_T("房间%d");
TCHAR listcont2[] =_T("电器%d");
TCHAR listcont3[] =_T("汽车%d");
TCHAR listcont4[] =_T("飞机%d");

void InsertColumn()
{
LV_COLUMN lvc;
lvc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
lvc.fmt=LVCFMT_CENTER;
lvc.pszText ="序号";
lvc.cx = 100;
SendMessage(hlistview,LVM_INSERTCOLUMN,0,(LPARAM)&lvc);


lvc.pszText = "实例1";
lvc.cx = 150;
SendMessage(hlistview,LVM_INSERTCOLUMN,1,(LPARAM)&lvc);

lvc.pszText = "实例2";
SendMessage(hlistview,LVM_INSERTCOLUMN,2,(LPARAM)&lvc);

lvc.pszText = "实例3";
SendMessage(hlistview,LVM_INSERTCOLUMN,3,(LPARAM)&lvc);

lvc.pszText = "实例4";
SendMessage(hlistview,LVM_INSERTCOLUMN,4,(LPARAM)&lvc);
}

void InitListView()
{

int i=0;
int j=0;
CHAR buffer[20];

for(i=5;i>0;i--)
{
LV_ITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.iItem = 0;
lvi.iSubItem = 0;
wsprintf(buffer,listindex,(i));
lvi.pszText =buffer;

SendMessage(hlistview,LVM_INSERTITEM,0,(LPARAM)&lvi);

lvi.iSubItem++;
wsprintf(buffer,listcont1,(i));
lvi.pszText =buffer;
SendMessage(hlistview,LVM_SETITEM,0,(LPARAM)&lvi);

lvi.iSubItem++;
wsprintf(buffer,listcont2,(i));
lvi.pszText =buffer;
SendMessage(hlistview,LVM_SETITEM,0,(LPARAM)&lvi);

lvi.iSubItem++;
wsprintf(buffer,listcont3,(i));
lvi.pszText =buffer;
SendMessage(hlistview,LVM_SETITEM,0,(LPARAM)&lvi);

lvi.iSubItem++;
wsprintf(buffer,listcont4,(i));
lvi.pszText =buffer;
SendMessage(hlistview,LVM_SETITEM,0,(LPARAM)&lvi);

}

}

LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hprevinstance,

PSTR szcmdLine, int icmdshow)

{

HWND hwnd;
MSG msg;
WNDCLASSEX winclass;
InitCommonControls();
instance=hinstance;

winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL,IDC_ARROW);
winclass.hbrBackground= GetStockObject(WHITE_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName= WINDOW_CLASS_NAME;
winclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);

if(!RegisterClassEx(&winclass))
return (0);

if(!(hwnd = CreateWindowEx(NULL,
WINDOW_CLASS_NAME,
"WinFormPrj",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
240,262,
800,500,
NULL,
NULL,
hinstance,
NULL)))
return (0);



while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return(msg.wParam);

}




LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{

switch(msg)
{
case WM_CREATE:
{
hlistview = CreateWindowEx(NULL,_T("SysListView32"),NULL,LVS_REPORT | WS_CHILD |WS_VISIBLE,
0,0,200,200,hwnd,NULL,instance,NULL);
InsertColumn();
InitListView();

//SendMessage(hlistview,LVM_SETTEXTCOLOR,0,(LPARAM)RGB(0,0,0));
//SendMessage(hlistview,LVM_SETBKCOLOR,0,(LPARAM)RGB(0,0,0));
//SendMessage(hlistview,LVM_SETTEXTBKCOLOR,0,(LPARAM)RGB(0,0,0));

//ListView_SetItemState(hlistview,1,LVIS_SELECTED ,LVIS_SELECTED);

ListView_SetExtendedListViewStyle(hlistview,1,LVIS_SELECTED ,LVS_EX_FULLROWSELECT);

return (0);
} break;

case WM_SIZE:
{
MoveWindow(hlistview,0,0,LOWORD(lparam),HIWORD(lparam),TRUE);
//调用MoveWindow来改变列表视图控件的大小使得它覆盖整个的客户区
} break;


case WM_DESTROY:
{
PostQuitMessage(0);
return (0);
} break;

default:break;
}
return (DefWindowProc(hwnd,msg,wparam,lparam));
}


loepin 2010-06-05
  • 打赏
  • 举报
回复
2楼,我是在SDK中做的,不是用MFC的。。。
zhou1xp 2010-06-05
  • 打赏
  • 举报
回复
DWORD dwStyle = list1.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
//dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
list1.SetExtendedStyle(dwStyle);
直接在CListCtrl中设置
fishion 2010-06-05
  • 打赏
  • 举报
回复
ListView_SetExtendedListViewStyle(....,LVS_EX_FULLROWSELECT)
loepin 2010-06-05
  • 打赏
  • 举报
回复
解决了...


SetFocus(hlistview); //获得焦点

ListView_SetItemState(hlistview,0,LVIS_SELECTED,LVIS_SELECTED); //使第一行处于选择中状态

ListView_SetExtendedListViewStyle(hlistview,LVS_EX_FULLROWSELECT); //设置整行选择风格

loepin 2010-06-05
  • 打赏
  • 举报
回复
使用该方法可行ListView_SetExtendedListViewStyle(hlistview,LVS_EX_FULLROWSELECT);

现在想知道为什么用
ListView_SetItemState(hlistview,1,LVIS_SELECTED ,LVIS_SELECTED);
却不行呢????

15,980

社区成员

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

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