相关疑难解决方法(0)

防止RTL TListView镜像复选框和/或图形

我正在尝试从右到左显示ListView的列.这已经被问及并回答了.但问题是关于图标和复选框.当我使用ListView RTL时SetWindowLong,它也会反映图形和复选框,这是不需要的.我可以使用编辑工具镜像图形,困扰但可行,但我不知道如何处理复选框.

在此输入图像描述

我认为他们两个都有相同的原因,所以我搜索了它并在Microsoft Docs中找到了一篇关于RTL布局的完整文章.在" 按设备上下文激活镜像"部分中,它指出了图形问题.它建议改变DC的布局样式LAYOUT_RTLLAYOUT_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)

delphi winapi listview gdi+ right-to-left

3
推荐指数
1
解决办法
165
查看次数

标签 统计

delphi ×1

gdi+ ×1

listview ×1

right-to-left ×1

winapi ×1