【问题标题】:Win32 API ListView Creation (C++)Win32 API ListView 创建 (C++)
【发布时间】:2012-12-08 09:33:20
【问题描述】:

我想用 C++ 创建一个 ListView。 到目前为止我的代码:

InitCommonControls(); // Force the common controls DLL to be loaded.
HWND list;

// window is a handle to my window that is already created.
list = CreateWindowEx(0, (LPCSTR) WC_LISTVIEWW, NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_SHOWSELALWAYS | LVS_REPORT, 0, 0, 250, 400, window, NULL, NULL, NULL);

LVCOLUMN lvc; 
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 0;
lvc.pszText = "Title";
lvc.cx = 50;
lvc.fmt = LVCFMT_LEFT;
ListView_InsertColumn(list, 0, &lvc);

但如果我编译并执行代码,只会显示一个空白窗口。编译器:Windows 7 (x86) 上的 MinGW。

谁能帮我正确显示列表视图?

【问题讨论】:

标签: c++ winapi mingw win32gui


【解决方案1】:

这里是使用 Windows API 和 C 编写的 ListView control 的原始 MSDN 示例代码的链接。 它在 VC++ 2010 中编译。

【讨论】:

  • 如何将样式更改为 windows 7 设计?
  • 究竟什么是“Windows 7 设计”?你指的是视觉主题吗?您需要提供 ComCtrl32 v6 清单来启用它。除非您想利用 ComCtrl32 v6 中引入的新功能,否则代码中没有任何变化。
  • @das_j 您可以添加以下编译器指令来启用它:#pragma comment(linker,"\"/manifestdependency:type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
  • 请注意,在 Visual Studio 2013+ 中,您需要将 #define _CRT_SECURE_NO_WARNINGS#define _CRT_NONSTDC_NO_DEPRECATE 添加到 LISTVIEW.C 的顶部才能按原样运行此代码。或者,您可以将sprintf 替换为sprintf_s,将strcmpi 替换为_strcmpi
【解决方案2】:

WC_LISTVIEWW(注意末尾的额外 W)是 wchar_t*,但您将其类型转换为 char*。只有在未定义 UNICODE 时才会编译,从而使通用 CreateWindowEx() 映射到 CreateWindowExA()。这意味着您正在尝试使用 CreateWindowEx() 的 Ansi 版本创建一个 Unicode 窗口。那是行不通的。

您需要:

  1. 使用泛型WC_LISTVIEW,使其匹配泛型CreateWindowEx(),并去掉类型转换:

    list = CreateWindowEx(..., WC_LISTVIEW, ...);
    
  2. 继续使用WC_LISTVIEWW,但改为调用CreateWindowExW()

    list = CreateWindowExW(..., WC_LISTVIEWW, ...);
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多