【问题标题】:GUI - unable to add columns to a ListViewGUI - 无法将列添加到 ListView
【发布时间】:2021-09-04 16:12:18
【问题描述】:

我想向 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), 0, &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, nullptr, 0, 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, 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, 0, 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

【问题讨论】:

  • 您的对话框资源似乎定义了一个列表框,而不是列表视图。它们是不同的控件。
  • @JonathanPotter,更新了它。它是“标识符 x 未定义”。
  • @JonathanPotter 是的。需要是“SysListView32”类型的CONTROL,并且(IIRC)需要LVS_REPORT 样式。
  • @JonathanPotter,是的,这是我可以使用的所有控件i.imgur.com/5GwWOcO.png。我只看到列表框和列表控件。它只需要看起来像问题中的图像。
  • 我在LVCF_ 宏和ListView_InsertColumn 下也有一些红色的曲线,但经过几次重建后它们(最终)消失了。看起来 IntelliSense 很笨。

标签: c++ winapi visual-c++


【解决方案1】:

如 cmets 中所述,您在资源脚本中定义的控件是 ListBox,而不是 ListView。对于后者,您需要使用带有"SysListView32" 控件类的通用CONTROL 语句(这可以作为“列表控件”对象从可视资源编辑器中插入,其“视图”属性设置为“报告”)。 注意:如果没有 LVS_REPORT 样式,您无法向控件添加列。

以下是您拥有的对话资源的建议替换:

IDD_MAIN DIALOGEX 0, 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, 0, 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,
                29, 44, 235, 56
END

所做的更改,您的程序将在调用 ListView_InsertColumn 期间崩溃/挂起,因为您在 mask 的成员中指定了 LVCF_WIDTHLVCF_IMAGE 标志LVCOLUMN 结构,但没有为这些标志提供有效数据。我不能只是为你“发明”一个图像,但是,对于一些“虚拟”文本值(以及一个额外的列,为了更好的衡量标准),这里有一些“固定”代码的建议:

    switch (Message) {
        case WM_INITDIALOG: {
            wchar_t c0txt[] = L"abc-0";
            LVCOLUMNW col;
            col.mask = LVCF_TEXT | LVCF_WIDTH;// | LVIF_IMAGE;
            col.cx = 40;
            col.pszText = c0txt;
            ListView_InsertColumn(GetDlgItem(hWnd, IDC_LIST2), 0, &col);
            // Add another column...
            wchar_t c1txt[] = L"xyz-1";
            col.mask = LVCF_TEXT | LVCF_WIDTH;// | LVIF_IMAGE;
            col.cx = 80;
            col.pszText = c1txt;
            ListView_InsertColumn(GetDlgItem(hWnd, IDC_LIST2), 1, &col);
            return TRUE;
        }

当使用 上述更改构建您的代码时,我得到一个包含两列的列表视图控件:

【讨论】:

  • 谢谢!它按预期工作!顺便说一句,是否可以使其响应,例如 C# 中的“锚和停靠”属性。基本上在我调整大小时向右缩放。
  • @nop 不确定 - 可以尝试在 VS 资源编辑器中尝试使用“动态布局”组中的属性(样式、网格线等还有很多其他属性)。
猜你喜欢
  • 1970-01-01
  • 2011-03-25
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
相关资源
最近更新 更多