怎么实现多列列表框?

sc_valentine21 2009-08-09 02:05:30
正如列表框listbox,一行一行插入数据,然后显示出来。现在要实现能够多列显示,需要怎么做。
如果不用MFC控件,而用API来编写,要怎么才能做到呢?形如:

第一项 | 第二项 | 第三项
第四项 | 第五项 | 第六项
。。。。。。。。。。。。。。。
...全文
460 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sc_valentine21 2009-08-10
  • 打赏
  • 举报
回复
怎么会实现不了呢?正如一般List
insert一个item,假如第一行,则会在rect1区域画,第二行就会在rect2区域画,要是我在Draw item的时候,就将rect1设置为第一行的宽度1/3,其他不变,然后第二个item的rect2区域设置为rect1的右边,以此类推第三项,然后换行,继续。。。。
这样不就实现了:
-------------------------
第一项 | 第二项 | 第三项
。。。。。。。。。。。。。。。
??????????????????????????
MoXiaoRab 2009-08-09
  • 打赏
  • 举报
回复
楼主的数据格式要求恐怕连ListView都满足不了
schlafenhamster 2009-08-09
  • 打赏
  • 举报
回复
//
HWND CreateListView(HINSTANCE hInstance, HWND hwndParent)
{
DWORD dwStyle;
HWND hwndListView;
BOOL bSuccess = TRUE;

dwStyle = WS_TABSTOP | WS_CHILD | WS_BORDER | WS_VISIBLE | LVS_REPORT;
// LVS_AUTOARRANGE | LVS_OWNERDATA;

hwndListView = CreateWindowEx( WS_EX_CLIENTEDGE, // ex style
WC_LISTVIEW, // class name defined in commctrl.h
NULL, // window text
dwStyle, // style
0, // x position
200, // y position
200, // width
200, // height
hwndParent, // parent
(HMENU)IDC_LISTVIEW, // ID
(HINSTANCE)GetWindowLong(hwndParent, GWL_HINSTANCE), // instance
NULL); // no extra data

if(hwndListView)
{
InitListView(hwndListView);
//
LVITEM lvi;
ZeroMemory(&lvi, sizeof(lvi));
lvi.mask=LVIF_TEXT;//|LVIF_IMAGE;
lvi.cchTextMax=40;
lvi.iSubItem=0;
lvi.pszText="MainItem";
lvi.iItem=0;

int now=ListView_InsertItem(hwndListView,&lvi); //
ListView_SetItemText(hwndListView,now,1,"Column 1");
ListView_SetItemText(hwndListView,now,2,"Column 2");
ListView_SetItemText(hwndListView,now,3,"Column 3");
ListView_SetItemText(hwndListView,now,4,"Column 4");
return hwndListView;
}
else
{
return NULL;
}
}//
//
BOOL InitListView(HWND hwndListView)
{
LV_COLUMN lvColumn;
int i;
TCHAR szString[5][20] = { TEXT("Main Column"),
TEXT("Column 1"),
TEXT("Column 2"),
TEXT("Column 3"),
TEXT("Column 4")};

//initialize the columns
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = 80;
for(i = 0; i < 5; i++)
{
lvColumn.pszText = szString[i];
SendMessage(hwndListView, LVM_INSERTCOLUMN, (WPARAM)i, (LPARAM)&lvColumn);
}
return TRUE;
}
fishion 2009-08-09
  • 打赏
  • 举报
回复
你可以在MSDN里找ListView_
fishion 2009-08-09
  • 打赏
  • 举报
回复
用ListView_InsertColumn
schlafenhamster 2009-08-09
  • 打赏
  • 举报
回复 1
I think what you are looking for is the listview common control, rather than
a listbox. The listbox creates "snaking" columns of data, rather than
columnar data.
schlafenhamster 2009-08-09
  • 打赏
  • 举报
回复
m_hListBox = CreateWindow("LISTBOX,
NULL,
WS_CHILD|LBS_MULTICOLUMN|LBS_USETABSTOPS|WS_BORDER ,
330, 140, 120, 100,
hwnd, (HMENU)(100),
(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
NULL);
SendMessage(m_hListBox,LB_SETCOLUMNWIDTH,60,0);
SendMessage(m_hListBox,LB_ADDSTRING ,0,(LPARAM)"你好\t我也好");//注意"\t"
SendMessage(m_hListBox,LB_ADDSTRING ,0,(LPARAM)"我好\t你也好");
SendMessage(m_hListBox,LB_ADDSTRING ,0,(LPARAM)"他好\t大家好");
ShowWindow(m_hListBox,SW_SHOW);
MoXiaoRab 2009-08-09
  • 打赏
  • 举报
回复
有这么做的必要么
zhuzhenlei 2009-08-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 flyoxs 的回复:]
使用CListCtrl,风格为LVS_REPORT,可实现LZ期望的效果。
直接用Win32 API 写控件有难度,很有难度
[/Quote]
。。
雪影 2009-08-09
  • 打赏
  • 举报
回复
使用CListCtrl控件的LVS_REPORT属性时,就可以显示多列的。
使用纯API些有些麻烦,你可以参考MFC对CListCtrl代码自己封装一个list ctrl
flyoxs 2009-08-09
  • 打赏
  • 举报
回复
使用CListCtrl,风格为LVS_REPORT,可实现LZ期望的效果。
直接用Win32 API 写控件有难度,很有难度

15,979

社区成员

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

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