我正在尝试从右到左显示ListView的列.这已经被问及并回答了.但问题是关于图标和复选框.当我使用ListView RTL时SetWindowLong,它也会反映图形和复选框,这是不需要的.我可以使用编辑工具镜像图形,困扰但可行,但我不知道如何处理复选框.
我认为他们两个都有相同的原因,所以我搜索了它并在Microsoft Docs中找到了一篇关于RTL布局的完整文章.在" 按设备上下文激活镜像"部分中,它指出了图形问题.它建议改变DC的布局样式LAYOUT_RTL和LAYOUT_BITMAPORIENTATIONPRESERVED标志.
这是我用文章中提出的组合方法和上面提到的答案实现的功能:
const
LAYOUT_RTL = 1;
LAYOUT_BITMAPORIENTATIONPRESERVED = 8;
function GetLayout(DC: HDC): DWORD; stdcall; external 'gdi32.dll';
function SetLayout(DC: HDC; dwLayout: DWORD): DWORD; stdcall; external 'gdi32.dll';
procedure MakeRTL(const Handle: HWND);
var
DC: HDC;
begin
SetWindowLong(Handle, GWL_EXSTYLE,
GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYOUTRTL);
DC := GetWindowDC(Handle);
if DC <> 0 then
SetLayout(DC, GetLayout(DC) or LAYOUT_RTL or LAYOUT_ORIENTATIONMASK);
InvalidateRect(Handle, nil, True);
end;
Run Code Online (Sandbox Code Playgroud)
但它没有改变任何东西.我试图阻止其中任何一个,改变它们的顺序并改变不同的地方来调用它,但没有成功.
现在的问题是,如何使ListView的列从右到左显示,而不镜像图形或复选框?
我正在使用Win10 x64和Delphi 2010.
如果你想重现这个问题,这是我的delphi代码:
unit Unit1; …Run Code Online (Sandbox Code Playgroud)