0

我使用 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 和 NON Unicode 应用程序使用相同的 Windows.Common-Controls 主程序吗?

4

1 回答 1

2

LVCFMT_FIXED_WIDTH需要 CommCtrl v6,它最容易通过清单启用。但是 CommCtrl v6 不仅限于 Unicode 窗口,正如您所发现的(我在几个使用 ANSI 窗口的遗留应用程序中使用 CommCtrl v6,它工作正常),所以为什么微软将#pragma's 限制为仅 Unicode 构建,我不知道。

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

于 2019-04-09T05:44:05.390 回答