如何解决GUI - 无法向 ListView 添加列
我想向 ListView 控件添加列。您可以看到我在下面使用 ListView_InsertColumn
尝试过的内容,但是我得到“标识符 x 未定义”。它应该在 CommCtrl.h
中,但我不知道出了什么问题。我看到有些人改用 CListView_InsertColumn
。不知道有什么区别。
#include <Windows.h>
#include "resource.h"
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#pragma comment(linker,"/SUBSYstem:WINDOWS")
#include <CommCtrl.h> // LV_COLUMN and ListView_x
INT_PTR CALLBACK DialogProc(HWND hWnd,UINT Message,WParaM wParam,LParaM lParam)
{
switch (Message)
{
case WM_INITDIALOG:
LVCOLUMNW col;
col.mask = LVCF_TEXT | LVCF_WIDTH | LVIF_IMAGE;
col.cx = 40;
ListView_InsertColumn(GetDlgitem(hWnd,IDC_LIST2),&col);
return TRUE;
case WM_NCDESTROY:
PostQuitMessage(0);
return FALSE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
DestroyWindow(hWnd);
break;
default:
break;
}
break;
default:
return FALSE;
}
return TRUE;
}
int WINAPI WinMain(
_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR lpCmdLine,_In_ int nShowCmd
)
{
UNREFERENCED_ParaMETER(hPrevInstance);
UNREFERENCED_ParaMETER(lpCmdLine);
HWND hWnd = CreateDialogParamW(hInstance,MAKEINTRESOURCEW(IDD_MAIN),nullptr,&DialogProc,0);
if (!hWnd)
{
MessageBoxW(nullptr,L"Dialog Creation Failed!",L"Error!",MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
MSG msg;
while (GetMessageW(&msg,0))
{
TranslateMessage(&msg);
dispatchMessageW(&msg);
}
return msg.wParam;
}
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUdio_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUdio_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US
#pragma code_page(1252)
#ifdef APSTUdio_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUdio_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUdio_INVOKED
GUIDELInes DESIGNINFO
BEGIN
IDD_MAIN,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,302
TOPMARGIN,7
BottOMMARGIN,169
END
END
#endif // APSTUdio_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_MAIN DIALOGEX 0,309,176
STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBox | WS_MAXIMIZEBox | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Test"
FONT 8,"MS Shell Dlg",400,0x1
BEGIN
LISTBox IDC_LIST2,29,44,235,56,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
END
/////////////////////////////////////////////////////////////////////////////
//
// AFX_DIALOG_LAYOUT
//
IDD_MAIN AFX_DIALOG_LAYOUT
BEGIN
0
END
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUdio_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUdio_INVOKED
解决方法
正如评论中提到的,你在资源脚本中定义的控件是一个ListBox,而不是一个ListView。对于后者,您需要使用具有 CONTROL
控件类的通用 "SysListView32"
语句(这可以从可视化资源编辑器作为“列表控件”对象插入,其“视图” " 属性设置为 "报告")。 注意:如果没有 LVS_REPORT
样式,您将无法向控件添加列。
以下是您拥有的对话资源的建议替代品:
IDD_MAIN DIALOGEX 0,309,176
STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Test"
FONT 8,"MS Shell Dlg",400,0x1
BEGIN
//LISTBOX IDC_LIST2,29,44,235,56,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_LIST2,"SysListView32",LVS_REPORT | LVS_SORTASCENDING | WS_VSCROLL | WS_TABSTOP,56
END
仅进行了更改,您的程序将在调用 ListView_InsertColumn
期间崩溃/挂起,因为您已在LVCF_WIDTH
结构的 LVCF_IMAGE
成员,但没有为这些标志提供有效数据。我不能只是为你“发明”一个图像,但是,有一些“虚拟”文本值(和一个额外的列,为了更好的衡量),这里有一些“固定”代码的建议:
mask
在使用只是上述更改构建代码时,我得到一个包含两列的列表视图控件:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。