防止 RTL TListView 镜像复选框 and/or 个图形
Prevent RTL TListView from mirroring check boxes and/or graphics
我试图让 ListView 的列从右到左显示。这已经是 asked and answered。但问题是关于图标和复选框。当我使用 SetWindowLong
制作 ListView RTL 时,它也会镜像图形和复选框,这是不需要的。我可以用编辑工具镜像图形,麻烦但可行,但我不知道如何处理复选框。
我认为他们两个都有相同的原因,所以我搜索了一下,在 Microsoft Docs. In Activating Mirroring per Device Context 部分找到了一篇关于 RTL 布局的整篇文章,它指出了图形问题。它建议使用 LAYOUT_RTL
和 LAYOUT_BITMAPORIENTATIONPRESERVED
标志更改 DC 的布局样式。
这是我结合文章中建议的方法和上面提到的答案实现的功能:
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;
但这并没有改变任何东西。我试过屏蔽它们中的任何一个,改变它们的顺序并改变不同的地方来调用它,但没有成功。
现在的问题是,如何使 ListView 的列从右到左显示,而不镜像图形或复选框?
我使用的是 Win10 x64 和 Delphi 2010。
如果你想重现问题,这里是我的 delphi 代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ImgList, StdCtrls, CommCtrl, ShellAPI;
type
TForm1 = class(TForm)
ListView1: TListView;
ImageList1: TImageList;
ListView2: TListView;
Button1: TButton;
Label1: TLabel;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Label1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
LAYOUT_RTL = 1;
LAYOUT_BTT = 2;
LAYOUT_VBH = 4;
LAYOUT_ORIENTATIONMASK = LAYOUT_RTL or LAYOUT_BTT or LAYOUT_VBH;
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;
procedure TForm1.Button1Click(Sender: TObject);
begin
MakeRTL(ListView_GetHeader(ListView1.Handle));
MakeRTL(ListView1.Handle);
end;
procedure TForm1.FormActivate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ListView1.Items.Count - 1 do
begin
ListView1.Items[I].Checked := True;
ListView2.Items[I].Checked := True;
end;
end;
procedure TForm1.Label1Click(Sender: TObject);
begin
ShellExecute(0, 'open', 'https://icons8.com/icons/set/check', '', '', SW_SHOWNORMAL);
end;
end.
dfm:
object Form1: TForm1
Left = 0
Top = 0
BiDiMode = bdLeftToRight
Caption = 'Form1'
ClientHeight = 169
ClientWidth = 353
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
ParentBiDiMode = False
OnActivate = FormActivate
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 277
Top = 128
Width = 47
Height = 26
Cursor = crHandPoint
Alignment = taCenter
Caption = 'graphics by Icons8'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = [fsUnderline]
ParentFont = False
WordWrap = True
OnClick = Label1Click
end
object ListView1: TListView
Left = 8
Top = 8
Width = 250
Height = 73
Checkboxes = True
Columns = <
item
Caption = 'Cap'
Width = 100
end
item
Caption = 'Sub1'
Width = 100
end>
Items.ItemData = {
03620000000200000000000000FFFFFFFFFFFFFFFF01000000FFFFFFFF000000
00054900740065006D00310005500072006F007000310001000000FFFFFFFFFF
FFFFFF01000000FFFFFFFF00000000054900740065006D00320005500072006F
0070003200FFFFFFFF}
LargeImages = ImageList1
SmallImages = ImageList1
TabOrder = 0
ViewStyle = vsReport
end
object ListView2: TListView
Left = 8
Top = 87
Width = 250
Height = 73
Checkboxes = True
Columns = <
item
Caption = 'Cap'
Width = 100
end
item
Caption = 'Sub1'
Width = 100
end>
Items.ItemData = {
03620000000200000000000000FFFFFFFFFFFFFFFF01000000FFFFFFFF000000
00054900740065006D00310005500072006F007000310001000000FFFFFFFFFF
FFFFFF01000000FFFFFFFF00000000054900740065006D00320005500072006F
0070003200FFFFFFFF}
SmallImages = ImageList1
TabOrder = 1
ViewStyle = vsReport
end
object Button1: TButton
Left = 264
Top = 8
Width = 75
Height = 25
Caption = 'RTL'
TabOrder = 2
OnClick = Button1Click
end
object ImageList1: TImageList
ColorDepth = cd32Bit
DrawingStyle = dsTransparent
Left = 272
Top = 40
Bitmap = {
494C0101020008003C0010001000FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000001000000001002000000000000010
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000618062C0E3E0E741557159F1557159F0E3F0E730617062B0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000001456149E218A
21FE218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF218A21FE1455149C00000000000000000000000000000000000000000107
010D145814A1218A21FE218B21FF218B21FF218B21FF218B21FF218A21FE1557
159F0207020C0000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218A21FD218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF218B21FF218921FC000000000000000000000000000000000107010D1B71
1BCF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF1A701ACE0207020C00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF218B21FF218B21FF155915A4208520F4218B21FF218B21FF218B21FF218B
21FF218B21FF218B21FF00000000000000000000000000000000165816A2218B
21FF218B21FF218B21FF155915A4208520F4218B21FF218B21FF218B21FF218B
21FF218B21FF1456149E00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF218B21FF124E128F000100010929094B208720F8218B21FF218B21FF218B
21FF218B21FF218B21FF00000000000000000000000005160528218A21FD218B
21FF218B21FF114A1187000000000722073E208520F4218B21FF218B21FF218B
21FF218B21FF218A21FD05150526000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF114A1187000000000D3B0D6C010901110722073E208520F4218B21FF218B
21FF218B21FF218B21FF0000000000000000000000000F430F7B218B21FF218B
21FF114A1187000000000D3B0D6C010901110722073E208520F4218B21FF218B
21FF218B21FF218B21FF0F410F78000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF1A6B
1AC400000000114A1187218B21FF1B6F1BCC010901110722073E208420F3218B
21FF218B21FF218B21FF0000000000000000000000001557159F218B21FF1A6B
1AC400000000114A1187218B21FF1B6F1BCC010901110722073E208420F3218B
21FF218B21FF218B21FF1456149E000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF196919C1218B21FF218B21FF218B21FF1B6F1BCC010901110722073E2084
20F3218B21FF218B21FF0000000000000000000000001456149E218B21FF218B
21FF196919C1218B21FF218B21FF218B21FF1B6F1BCC010901110722073E2084
20F3218B21FF218B21FF1456149D000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF1A691AC00006000B0925
0944208620F6218B21FF0000000000000000000000001044107C218B21FF218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF1A6F1ACB010901110722
073E208420F3218B21FF10421079000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF1A6F1ACB0310
031E1B711BD0218B21FF0000000000000000000000000519052D218A21FE218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF1A6F1ACB0310
031E1B711BD0218A21FE0617062B000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF2087
20F8218B21FF218B21FF00000000000000000000000000000000165E16AC218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF2087
20F8218B21FF155C15A800000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218A21FD218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF218B21FF218921FC00000000000000000000000000000000020902101B72
1BD1218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF1B711BD00108010F00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000001456149E2188
21F9218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF218821F91455149C00000000000000000000000000000000000000000209
0210165E16AD218B21FF218B21FF218B21FF218B21FF218B21FF218A21FE165D
16AB0108010F0000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000061A062F10471082155915A4155915A4114611810519052E0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000424D3E000000000000003E000000
2800000040000000100000000100010000000000800000000000000000000000
000000000000000000000000FFFFFF0000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000}
end
end
您的调用没有效果的原因是您检索到的设备上下文根本没有以任何方式使用。您应该怀疑这一点,因为在您当前的设计中,您甚至无法调用 ReleaseDC
和 DC 泄漏。
当系统通过发送绘画消息触发绘画时,所有绘画都在绘画周期内完成。您可以拦截消息以修改要使用的设备上下文的布局 - VCL 设计允许您先检索上下文。
下面是您的完整示例代码相应修改,使用插入器 class 修改列表视图的消息处理。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ImgList, StdCtrls, CommCtrl, ShellAPI;
type
TListView = class(comctrls.TListView)
protected
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
end;
TForm1 = class(TForm)
ListView1: TListView;
ImageList1: TImageList;
ListView2: TListView;
Button1: TButton;
Label1: TLabel;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Label1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
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);
begin
SetWindowLong(Handle, GWL_EXSTYLE,
GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYOUTRTL);
InvalidateRect(Handle, nil, True);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MakeRTL(ListView_GetHeader(ListView1.Handle));
MakeRTL(ListView1.Handle);
end;
procedure TForm1.FormActivate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ListView1.Items.Count - 1 do
begin
ListView1.Items[I].Checked := True;
ListView2.Items[I].Checked := True;
end;
end;
procedure TForm1.Label1Click(Sender: TObject);
begin
ShellExecute(0, 'open', 'https://icons8.com/icons/set/check', '', '', SW_SHOWNORMAL);
end;
{ TListView }
const
LAYOUT_RTL = 1;
LAYOUT_BITMAPORIENTATIONPRESERVED = 8;
procedure TListView.WMPaint(var Message: TWMPaint);
var
Layout: DWORD;
PS: TPaintStruct;
begin
Message.DC := BeginPaint(Handle, PS);
Layout := GetLayout(Message.DC);
if (Layout and LAYOUT_RTL) <> 0 then
SetLayout(Message.DC, Layout or LAYOUT_BITMAPORIENTATIONPRESERVED);
inherited;
EndPaint(Handle, PS);
end;
end.
我试图让 ListView 的列从右到左显示。这已经是 asked and answered。但问题是关于图标和复选框。当我使用 SetWindowLong
制作 ListView RTL 时,它也会镜像图形和复选框,这是不需要的。我可以用编辑工具镜像图形,麻烦但可行,但我不知道如何处理复选框。
我认为他们两个都有相同的原因,所以我搜索了一下,在 Microsoft Docs. In Activating Mirroring per Device Context 部分找到了一篇关于 RTL 布局的整篇文章,它指出了图形问题。它建议使用 LAYOUT_RTL
和 LAYOUT_BITMAPORIENTATIONPRESERVED
标志更改 DC 的布局样式。
这是我结合文章中建议的方法和上面提到的答案实现的功能:
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;
但这并没有改变任何东西。我试过屏蔽它们中的任何一个,改变它们的顺序并改变不同的地方来调用它,但没有成功。
现在的问题是,如何使 ListView 的列从右到左显示,而不镜像图形或复选框?
我使用的是 Win10 x64 和 Delphi 2010。
如果你想重现问题,这里是我的 delphi 代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ImgList, StdCtrls, CommCtrl, ShellAPI;
type
TForm1 = class(TForm)
ListView1: TListView;
ImageList1: TImageList;
ListView2: TListView;
Button1: TButton;
Label1: TLabel;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Label1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
LAYOUT_RTL = 1;
LAYOUT_BTT = 2;
LAYOUT_VBH = 4;
LAYOUT_ORIENTATIONMASK = LAYOUT_RTL or LAYOUT_BTT or LAYOUT_VBH;
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;
procedure TForm1.Button1Click(Sender: TObject);
begin
MakeRTL(ListView_GetHeader(ListView1.Handle));
MakeRTL(ListView1.Handle);
end;
procedure TForm1.FormActivate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ListView1.Items.Count - 1 do
begin
ListView1.Items[I].Checked := True;
ListView2.Items[I].Checked := True;
end;
end;
procedure TForm1.Label1Click(Sender: TObject);
begin
ShellExecute(0, 'open', 'https://icons8.com/icons/set/check', '', '', SW_SHOWNORMAL);
end;
end.
dfm:
object Form1: TForm1
Left = 0
Top = 0
BiDiMode = bdLeftToRight
Caption = 'Form1'
ClientHeight = 169
ClientWidth = 353
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
ParentBiDiMode = False
OnActivate = FormActivate
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 277
Top = 128
Width = 47
Height = 26
Cursor = crHandPoint
Alignment = taCenter
Caption = 'graphics by Icons8'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = [fsUnderline]
ParentFont = False
WordWrap = True
OnClick = Label1Click
end
object ListView1: TListView
Left = 8
Top = 8
Width = 250
Height = 73
Checkboxes = True
Columns = <
item
Caption = 'Cap'
Width = 100
end
item
Caption = 'Sub1'
Width = 100
end>
Items.ItemData = {
03620000000200000000000000FFFFFFFFFFFFFFFF01000000FFFFFFFF000000
00054900740065006D00310005500072006F007000310001000000FFFFFFFFFF
FFFFFF01000000FFFFFFFF00000000054900740065006D00320005500072006F
0070003200FFFFFFFF}
LargeImages = ImageList1
SmallImages = ImageList1
TabOrder = 0
ViewStyle = vsReport
end
object ListView2: TListView
Left = 8
Top = 87
Width = 250
Height = 73
Checkboxes = True
Columns = <
item
Caption = 'Cap'
Width = 100
end
item
Caption = 'Sub1'
Width = 100
end>
Items.ItemData = {
03620000000200000000000000FFFFFFFFFFFFFFFF01000000FFFFFFFF000000
00054900740065006D00310005500072006F007000310001000000FFFFFFFFFF
FFFFFF01000000FFFFFFFF00000000054900740065006D00320005500072006F
0070003200FFFFFFFF}
SmallImages = ImageList1
TabOrder = 1
ViewStyle = vsReport
end
object Button1: TButton
Left = 264
Top = 8
Width = 75
Height = 25
Caption = 'RTL'
TabOrder = 2
OnClick = Button1Click
end
object ImageList1: TImageList
ColorDepth = cd32Bit
DrawingStyle = dsTransparent
Left = 272
Top = 40
Bitmap = {
494C0101020008003C0010001000FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000001000000001002000000000000010
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000618062C0E3E0E741557159F1557159F0E3F0E730617062B0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000001456149E218A
21FE218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF218A21FE1455149C00000000000000000000000000000000000000000107
010D145814A1218A21FE218B21FF218B21FF218B21FF218B21FF218A21FE1557
159F0207020C0000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218A21FD218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF218B21FF218921FC000000000000000000000000000000000107010D1B71
1BCF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF1A701ACE0207020C00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF218B21FF218B21FF155915A4208520F4218B21FF218B21FF218B21FF218B
21FF218B21FF218B21FF00000000000000000000000000000000165816A2218B
21FF218B21FF218B21FF155915A4208520F4218B21FF218B21FF218B21FF218B
21FF218B21FF1456149E00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF218B21FF124E128F000100010929094B208720F8218B21FF218B21FF218B
21FF218B21FF218B21FF00000000000000000000000005160528218A21FD218B
21FF218B21FF114A1187000000000722073E208520F4218B21FF218B21FF218B
21FF218B21FF218A21FD05150526000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF114A1187000000000D3B0D6C010901110722073E208520F4218B21FF218B
21FF218B21FF218B21FF0000000000000000000000000F430F7B218B21FF218B
21FF114A1187000000000D3B0D6C010901110722073E208520F4218B21FF218B
21FF218B21FF218B21FF0F410F78000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF1A6B
1AC400000000114A1187218B21FF1B6F1BCC010901110722073E208420F3218B
21FF218B21FF218B21FF0000000000000000000000001557159F218B21FF1A6B
1AC400000000114A1187218B21FF1B6F1BCC010901110722073E208420F3218B
21FF218B21FF218B21FF1456149E000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF196919C1218B21FF218B21FF218B21FF1B6F1BCC010901110722073E2084
20F3218B21FF218B21FF0000000000000000000000001456149E218B21FF218B
21FF196919C1218B21FF218B21FF218B21FF1B6F1BCC010901110722073E2084
20F3218B21FF218B21FF1456149D000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF1A691AC00006000B0925
0944208620F6218B21FF0000000000000000000000001044107C218B21FF218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF1A6F1ACB010901110722
073E208420F3218B21FF10421079000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF1A6F1ACB0310
031E1B711BD0218B21FF0000000000000000000000000519052D218A21FE218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF1A6F1ACB0310
031E1B711BD0218A21FE0617062B000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218B21FF218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF2087
20F8218B21FF218B21FF00000000000000000000000000000000165E16AC218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF2087
20F8218B21FF155C15A800000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000218A21FD218B
21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF218B21FF218921FC00000000000000000000000000000000020902101B72
1BD1218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF1B711BD00108010F00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000001456149E2188
21F9218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B21FF218B
21FF218821F91455149C00000000000000000000000000000000000000000209
0210165E16AD218B21FF218B21FF218B21FF218B21FF218B21FF218A21FE165D
16AB0108010F0000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000061A062F10471082155915A4155915A4114611810519052E0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000424D3E000000000000003E000000
2800000040000000100000000100010000000000800000000000000000000000
000000000000000000000000FFFFFF0000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000}
end
end
您的调用没有效果的原因是您检索到的设备上下文根本没有以任何方式使用。您应该怀疑这一点,因为在您当前的设计中,您甚至无法调用 ReleaseDC
和 DC 泄漏。
当系统通过发送绘画消息触发绘画时,所有绘画都在绘画周期内完成。您可以拦截消息以修改要使用的设备上下文的布局 - VCL 设计允许您先检索上下文。
下面是您的完整示例代码相应修改,使用插入器 class 修改列表视图的消息处理。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ImgList, StdCtrls, CommCtrl, ShellAPI;
type
TListView = class(comctrls.TListView)
protected
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
end;
TForm1 = class(TForm)
ListView1: TListView;
ImageList1: TImageList;
ListView2: TListView;
Button1: TButton;
Label1: TLabel;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Label1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
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);
begin
SetWindowLong(Handle, GWL_EXSTYLE,
GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYOUTRTL);
InvalidateRect(Handle, nil, True);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MakeRTL(ListView_GetHeader(ListView1.Handle));
MakeRTL(ListView1.Handle);
end;
procedure TForm1.FormActivate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ListView1.Items.Count - 1 do
begin
ListView1.Items[I].Checked := True;
ListView2.Items[I].Checked := True;
end;
end;
procedure TForm1.Label1Click(Sender: TObject);
begin
ShellExecute(0, 'open', 'https://icons8.com/icons/set/check', '', '', SW_SHOWNORMAL);
end;
{ TListView }
const
LAYOUT_RTL = 1;
LAYOUT_BITMAPORIENTATIONPRESERVED = 8;
procedure TListView.WMPaint(var Message: TWMPaint);
var
Layout: DWORD;
PS: TPaintStruct;
begin
Message.DC := BeginPaint(Handle, PS);
Layout := GetLayout(Message.DC);
if (Layout and LAYOUT_RTL) <> 0 then
SetLayout(Message.DC, Layout or LAYOUT_BITMAPORIENTATIONPRESERVED);
inherited;
EndPaint(Handle, PS);
end;
end.