样式为 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 以阻止调整大小。
我使用 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 以阻止调整大小。