样式为 LVCFMT_FIXED_WIDTH 的 CListCtrl 不适用于默认 Windows.Common-Controls

CListCtrl with style LVCFMT_FIXED_WIDTH not working with default Windows.Common-Controls

我使用 LVCFMT_FIXED_WIDTH 样式来防止用户列大小调整。

m_ListCtrl.InsertColumn(0, _gszColumnLabel[0], _gnColumnFmt[0], LVCFMT_FIXED_WIDTH, _gnColumnWidth[0], -1);

我仅通过 hasard 发现,这适用于 Unicode,但不适用于非 Unicode 应用程序。用户仍然可以调整列的大小。

我认为这与 stdafx.h

中的默认 Windows.Common-Controls 清单框架有关
#ifdef _UNICODE
#if defined _M_IX86
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

很遗憾,没有针对非 Unicode 应用程序的默认设置。

如果我也对非 Unicode 应用程序使用相同的清单,它会再次起作用。

但我不确定,这是否是正确的解决方案?我们可以对 Unicode 和非 Unicode 应用程序使用相同的 Windows.Common-Controls mainifest 吗?

LVCFMT_FIXED_WIDTH 需要 CommCtrl v6,它最容易通过清单启用。但是 CommCtrl v6 不仅限于 Unicode windows,正如您所发现的(我在几个使用 ANSI windows 的遗留应用程序中使用 CommCtrl v6,并且它工作正常),那么为什么微软限制 #pragma 只是 Unicode 版本,我不知道。

但是,使用 CommCtrl v6 并不是锁定列大小调整的唯一方法。另一种选择是子类化 ListView 本身(而不是其父级 window!)来处理 HDN_BEGINTRACK 通知,返回 TRUE 以阻止调整大小。