ExCtrls: Add unit ExImgList containing routines for creating a disabled imagelist for TToolbar.DisabledImages, and for recoloring monochrome outline icons. Based on patch by Roland Hahn.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8587 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2022-11-05 22:35:21 +00:00
parent 960452948f
commit ccc4ec4db1
9 changed files with 807 additions and 4 deletions

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<SessionStorage Value="InProjectDir"/>
<Title Value="ImgListEx_Demo"/>
<Scaled Value="True"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
<Icon Value="0"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages>
<Item>
<PackageName Value="ExCtrlsPkg"/>
</Item>
<Item>
<PackageName Value="LCL"/>
</Item>
</RequiredPackages>
<Units>
<Unit>
<Filename Value="ImgListEx_Demo.lpr"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="main.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="MainForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="ImgListEx_Demo"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf3"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,25 @@
program ImgListEx_Demo;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
{$IFDEF HASAMIGA}
athreads,
{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, main
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource:=True;
Application.Scaled:=True;
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

View File

@ -0,0 +1,410 @@
object MainForm: TMainForm
Left = 331
Height = 135
Top = 132
Width = 488
Caption = 'ImgListEx Demo'
ClientHeight = 135
ClientWidth = 488
OnCreate = FormCreate
LCLVersion = '2.3.0.0'
object ToolBar0: TToolBar
Left = 0
Height = 30
Top = 0
Width = 488
AutoSize = True
ButtonHeight = 28
ButtonWidth = 28
Caption = 'ToolBar0'
Images = ImageList1
TabOrder = 0
object ToolButton1: TToolButton
Left = 201
Top = 2
Caption = 'ToolButton1'
ImageIndex = 0
end
object ToolButton2: TToolButton
Left = 229
Top = 2
Caption = 'ToolButton2'
ImageIndex = 1
end
object ToolButton3: TToolButton
Left = 257
Height = 28
Top = 2
Caption = 'ToolButton3'
Style = tbsDivider
end
object ToolButton4: TToolButton
Left = 262
Top = 2
Caption = 'ToolButton4'
ImageIndex = 2
end
object ToolButton5: TToolButton
Left = 290
Top = 2
Caption = 'ToolButton5'
ImageIndex = 3
end
object ToolButton6: TToolButton
Left = 318
Top = 2
Caption = 'ToolButton6'
ImageIndex = 4
end
object ToolButton7: TToolButton
Left = 346
Height = 28
Top = 2
Caption = 'ToolButton7'
Style = tbsDivider
end
object ToolButton8: TToolButton
Left = 351
Top = 2
Caption = 'ToolButton8'
ImageIndex = 5
end
object Label1: TLabel
Left = 1
Height = 15
Top = 2
Width = 200
Caption = ' Normal'
Constraints.MinWidth = 200
end
end
object ToolBar1: TToolBar
Left = 0
Height = 30
Top = 30
Width = 488
AutoSize = True
ButtonHeight = 28
ButtonWidth = 28
Caption = 'ToolBar1'
Images = ImageList1
TabOrder = 1
object ToolButton11: TToolButton
Left = 201
Top = 2
Caption = 'ToolButton1'
ImageIndex = 0
end
object ToolButton12: TToolButton
Left = 229
Top = 2
Caption = 'ToolButton2'
ImageIndex = 1
end
object ToolButton13: TToolButton
Left = 257
Height = 28
Top = 2
Caption = 'ToolButton3'
Style = tbsDivider
end
object ToolButton14: TToolButton
Left = 262
Top = 2
Caption = 'ToolButton4'
ImageIndex = 2
end
object ToolButton15: TToolButton
Left = 290
Top = 2
Caption = 'ToolButton5'
ImageIndex = 3
end
object ToolButton16: TToolButton
Left = 318
Top = 2
Caption = 'ToolButton6'
ImageIndex = 4
end
object ToolButton17: TToolButton
Left = 346
Height = 28
Top = 2
Caption = 'ToolButton7'
Style = tbsDivider
end
object ToolButton18: TToolButton
Left = 351
Top = 2
Caption = 'ToolButton8'
ImageIndex = 5
end
object Label2: TLabel
Left = 1
Height = 15
Top = 2
Width = 200
Caption = ' CreateDisabledImages '
Constraints.MinWidth = 200
end
end
object ToolBar2: TToolBar
Left = 0
Top = 60
Width = 488
AutoSize = True
ButtonHeight = 28
ButtonWidth = 28
Caption = 'ToolBar2'
EdgeBorders = [ebTop, ebBottom]
TabOrder = 2
object ToolButton21: TToolButton
Left = 201
Top = 2
Caption = 'ToolButton1'
ImageIndex = 0
end
object ToolButton22: TToolButton
Left = 229
Top = 2
Caption = 'ToolButton2'
ImageIndex = 1
end
object ToolButton23: TToolButton
Left = 257
Height = 28
Top = 2
Caption = 'ToolButton3'
Style = tbsDivider
end
object ToolButton24: TToolButton
Left = 262
Top = 2
Caption = 'ToolButton4'
ImageIndex = 2
end
object ToolButton25: TToolButton
Left = 290
Top = 2
Caption = 'ToolButton5'
ImageIndex = 3
end
object ToolButton26: TToolButton
Left = 318
Top = 2
Caption = 'ToolButton6'
ImageIndex = 4
end
object ToolButton27: TToolButton
Left = 346
Height = 28
Top = 2
Caption = 'ToolButton7'
Style = tbsDivider
end
object ToolButton28: TToolButton
Left = 351
Top = 2
Caption = 'ToolButton8'
ImageIndex = 5
end
object Label3: TLabel
Left = 1
Height = 15
Top = 2
Width = 200
Caption = ' Recolored ImageList'
Constraints.MinWidth = 200
end
object ColorButton1: TColorButton
Left = 379
Height = 28
Top = 2
Width = 101
BorderWidth = 2
ButtonColorAutoSize = False
ButtonColorSize = 16
ButtonColor = 4227327
Caption = 'New Color'
OnColorChanged = ColorButton1ColorChanged
end
end
object CheckBox1: TCheckBox
Left = 8
Height = 19
Top = 96
Width = 104
Caption = 'Buttons enabled'
Checked = True
OnChange = CheckBox1Change
State = cbChecked
TabOrder = 3
end
object ImageList1: TImageList
Scaled = True
Left = 424
Top = 8
Bitmap = {
4C7A060000001000000010000000E70300000000000078DAED584B6B1441102E
5FD19BF8BA880741F4A288822082E00B0F4645898A0A3E0E8AA20703C6C7FAC2
FC030F2A28060425666766A32B181F880405E36A82B099EC6E44456F2A1E1695
4840CDF855DBB30EB33DBBDDB360503C14DDD35D5F55754D7575757B9E47DE30
53CEA1D37D360D823C49833CA68B17FC364D2CC9431F63C5803C15150378CFD4
E620A6163CDA8F55ECAC448C7D9D4FD14C53FD8524CD02F615E86EDEA27A53BC
6BD36A60EFF439740EFDC618F846E0CFFAADB1FFA45EDF8E18FE17EBF6FD1003
2FFCDE7391C668C49A32FE183BDC7B2FA6EDEDD86375AAD80F7F17DA68BA6B51
33B73CC738B46996A183771D5ACA637E2BF7775D60FF18E343FBCFC87E0D7CD1
24E7C4C91D2ABCC17F2C46E0BD987AFFE387175F8C797614953A9A6924E753EC
B1E5259D162D133916731A797D25B049F03B019B1D908D337D8506FE30E765B4
1DFD6D349589FBD8BF6B806FD23817F6837F33F81B60F72926D9DF8AF17DD5F0
F924CD01EFA5CE4E1ADD6B538689FB58534B2E45B335FFD1831E9BC643CEF95C
925AB80FDD0F0DCEB61DD07730DB4ED320EB26F2CF21D0365DBC3C931EB3DD90
95CE3BD4EDE76B83FCE2C0E65DF0F92690658265FDF079376CEE62BDA02E9DB3
0EFCC7A1F73DE82D745E80FFCE60EC40CE421F633C075989881A722FE63FC1E6
EDA0FB725F6430FE08ED67F8E01EFB95FB68772BD6DB07DE6352D63A7C7F7353
34D74DD20CE8FC0E5BD6FA3642BE5BA6DFA6AF251E9B4E047914B2BF28E2FE09
E80664ECE479F67D40F61E6937DB9F667F96E94FD17CCC6541EFC07744615F42
FA368BFEBC6A39A602A5ABC552542E13E730D6C8FBF9E56D1A1B071FA81FD271
F041AA65BD3AF57FA5F5EAE2A3D6AB8B57AD37CEFDE55FC057FAFFA6FA75E7FE
145E87347464439821C45F7F95F3BAA3928EE01CF39AEE23C379BECF0E8574BA
BAF838FF206EFD5EE37F1DE0FB4CDCB8C23F5D8CB90F5CE3E9E0557124EF5303
B5C475B5B88CD21F1EFF9BF5E31FDCAA243F6EECE8E6856AEF7226EF704CA897
97F86F7190DFC9E4BFC9F15CA42EAE131DBA2AEC420D1FC6F398F4D715552D89
B956DEFB5C9FD9368D0AE3790C324E8A9C063DA1378206293B119259C2876A54
0F7794F501BE0C2817BE1FA9F0C20E9B0A5C9FF3F78B6B3459E6D984624D6578
BFBEC4F88FDE569A80BA6FA1B4A75E718FD8C254368E3A55E4C6142DF0F1F0C9
2AEDB73BDCC57C7CE13A4D1239D7A2A3DAEFBDBF6AD1A1409C64449ED6B85F4A
FFE5B85E0EC8DB28ECC13D495337BF0735FC1EA711F8B6D8A77CFF54D921F462
8DCCC3B1169E7F7399C64919E2CC6139EC5326AEC7D96611DB16B555AA7DF9BE
05BE67A1738CFB4F81DDA0EBE3E7364DC17E5BC4C4FD28BE9F7365247B
}
BitmapAdv = {
4C69020000004C7A060000001800000018000000190700000000000078DAED9A
596C954514C70F2E448D1B98B83D206A341A12B707E342401323C628AE215171
4934516222C495982835B16AB4119707C30371A185FB7DF7D2B248DDC0AB5217
4C6DE9BDED2D855414976240A1D4170AF57AFE5FCFDC4EEFFDD6F9BE5B7DB80F
277732DFDCDFCC9C393373E6CC148B452AD6C457B6ADA233BB6D5ACB32C452D4
64386F533E9FA6EBE3F0853DD86DD1D2EE34BD324E6CEA64D9B7A3914E8CC11F
CA5BD4E0FACDA239657D0A2BFD1ABFC8FC3A37FECE77E918FEF66C45BFFCC4A6
3630C3F04D04AC89E2434F86FA0D35062C7FB1FCD493A67722E9D8471C163385
5D60FBB6929E53CCB5597A583EE739F46515F85FB16CE2FEACE4DFBE2AF0B7B3
34397396E76E15F807B8EDAFF7D8B41863DDBE9E8E4B8AFD8D4DC73AF663D133
CC7F00E92E9BCE4E8A9F5B4DE708FF7EE6DF8074CEA62B139B5F69BA4AF87398
7F89337F6DBA2D41FEED0E3F451733FF74996B19E82B11018B9960DB361DC9E9
5D55581B76815DDBBF03E75992EB7396C7F4F8327ED1D9CF2AF7B843FC9B0DB1
1E675196F794B79CFFD8B459AFC36BEFF2CACFA7E85C677FB2E8B9F2BD8AB977
4A1D9B8CF9EC0B29DFC86DAF851F1266EF8DC1AFFB5FF37DF41F996FD367416B
8D53C68CDF6FE20B4EA46F35D1FC986B457F08BEFB5A11C15F0EE29BE84A67D6
F8357E8D5FC657EB30EF192CAD06FE60ABF35F97F5BA4AE7C7FE30FD16DFB70F
3EBC47DCA037BF924E335D6BF99CB902B10DEEF3860A9D731EBE713DEF1BB16D
9A8C3354C1A21BF9F760EF2A9AAEBE218D3CDEEB6FC2D9AD7D191D6DC0C7B963
1F2727715B5BB82FF55ABFEA91876FE0E7337451649BE3FFE0FC2D75E10CB51B
7D425B39FD1BF42FF631D893A11951F985D57406F30E77B6D0C9C53A3A0236C1
B63D0FE2D807E7E59A680ACAC00E0C7DEB6EF894D287C5CE799CCFFBB073994B
F3383F1763AF7E89FFDF8C7457339D8A3185202D7536A38C299F7574966327EC
B3497F36F2D87EA79D710FA24CDC3808B7F30D8769D36CD814CEFA5CCF9B49C4
5D70EEC63C68B7E9A4D29858F408ECA690A22B12F1996CFA96FBF0B8A4174AEC
E8FB047DB2C7983790CDD251B057B69F61D6CF13099E019731EF006221327F97
230696041B6735E83A97A2E739FDAB33B6365D8E98AC514C1773354D0F61DE30
E30F962D6C2739E4B3EEBB589E129DE531062883B29CFF20CA84D075833AFFB0
EC91FD6D7F3BAF179CFE13EDE63198CECCFD526E8F942DB2CE5EF3D5B345D7AA
D8442143E7C91ADD29791D98AFDCB7F7242EA8F226A32CA77F71DA92A66B7CEC
B045DA714BA9CE343D2D2CAC9F53B7ADA513F8FBEFE20B3C599AEB16DD2A3199
661F3B419C661876A8ADF54B2456B448AB7391B46389CAC37FE46CFDB35F9C1E
827D6334CFD93FB6AA5854A91CA7A54F9DE3ECC2A6BFFD6291FCED6BE9E35C89
3BBDACE2162E76FB85F4A11E65957E107FF0B1F5B9C23FCCBF7B95DEB1567AC4
08774B99BDF21FC4F46E0E586BEEE5723B5876F2F835FAC52DA58E2694C57FB8
FC7C83B521D09FE2B6E771CF61B8F6F89FF946BFFFC3F2B1491D413EAF7CCF88
FE3F895A47487E9DC49947A2D611860F5B15BF7C8DE8AA2B49BE9B54CB4ECACF
1749DB891F3F093B89C90FB49338FC307612871FC64E4CF9613935FEC4F283E2
ADB1F911D69F24F463BA4ED6F8E1E2F1417612C70F09632721FBDEE8C11B198D
6BC43E6F79DD89B5456D33CE812EEF72DCEF5EDCE7D4903ABB7AB475B0A2AD41
FCCA3E0D46B14B89638C788CC140143B75E3B32F3FCBCB8FC0B7B8FC38F72D49
F3B93FD7A15FD5E227B9EE849CD303B90C5D1083DF16709734A0D711951F54B6
3745E73BF14BC4253234C3948FDF0A91D800DAAEFA61CA77D3BDCED1D79224F5
9314DF553F2249F083F69C9A7E42EB6730C86FE0FD69A6A97EB0B7B9ED8F6E76
6DC28FBC1686F491A2FA47A63E5294B82BEBF203489838AA419C789A16279816
8F4793F0F60EEF6E555BE5CECBE197EEC21033C6DB5C2E3B16730CB84F68A229
CCF848B10A29BACC8B8F6F9AAE5B9DBB267F1D4CE571FFA1A487342D576FD8DC
F8F886329ADEDAD13E4F9DD8B4BE14DBB6E8AE71FB929B7EC67CCC7B548C1B6F
B5DD74A5DE514A3BEEAED8F77CF8329FE6977495A6FBF46FB8F363E68FA29315
AEFB6A005FE2D22BD5FDAF1EC3566F9E10DB718BD586E5E39E4CF9ADF0BBB479
F9B6CC7DCF77BE61F8C2DA2CE7EEA55A5E56DAFFA227BF994E91F8FB21A43DF9
CABFE7F547E3F78AEE1F0EF0356795FBCF2EF1EB05D2CF1E8DDF23752E88ED6F
5AF4A8F0BB35FE46D1CFAB09DCC53508EBD3F23CDC0326719728FB5083768739
5BC53775DF37323B45174ADCAF386E9C46EF4EB64B1D6B62F8FAEB84D157BE46
F0B8DC519ADF3C468677A045BFB7CEDAFC1E41F9083A5FA8E62DCEFE5EE57077
29EFEA553B36E01D84E77A9EA14BF5BD02F157BC3D0F7C9B3ED60F251D78FF8A
B33E44DEC2769495698A72AF803B42C47F43F8085B83EEA402F6B499CC7841DE
B3E03E760BE77D883CE65EFD5FBF7FFE17F89EECD64C7A060000002000000020
000000690800000000000078DAED5C698C1455102E34E22DDEE091683C31266A
3C8846D4A089FAC31F468D685430205163040C6822318AC18822A0880644C325
2E333DB38B04252A47242BB0C0C2C2DEC80F8E75D7004230846B6159AB7AAAC7
DADEEE9DD7DDEFF56497FE51999EEED7EFAB57AFAADE55D5EDEDEDD09ED0294F
9605A7D766E0BD5A0B7621B5FBD02E2A436575E33376BB126159EDF84EBBD3F0
986F197CE6C8C100BEDD36D57211A93C027EB90E1EC2E29B92F3A98AAFAB3FC3
EA619D05078A85CFD855F6FF14DC1397AF45DC01CCC326A452BAAEB160705CF8
E83F9F63FC6C5D063EB365918177E3C2AF49C33896FF246CF7EBEC77BF8D51FE
DFD9324FC36BC2A7AF884DFE16ACB4F133F0687D166E64FCED31E2EF60F9DF50
F90D9C81BF27987A9BC6F6C293FC98C6F792B7EC0FE3B2F7D037A98FC66DCFC3
DEA43D1AB73D0F7F23FD510CBADFC9DF4A7F1C037EA7F1666B095C1AF7D84798
26E67561E79F091587E2EA77B4B1CA2D6570B9A1F58C12A1CDD7B8792834EF0E
3B2F97EF6DB2E0326C7F35DF6BA82F852B74E2A3FF1E9F6F235E7BBD47EDA6F6
F3FDF571E33B3C78AC3F62C3F759FF24F8DD1C3FCA3A5B15DFD43E87027EB9C9
7D9EB8F61DBA0BBEA1F1B03C00BE91B12F287E8CF24EF013FC043FC14FF013FC
A2E1C74D453E7F09BCFF526DC15DB886DD539381277CD701F88CCAD4A7E04E9D
73B62DF3E15CE47927F3BEB2D0BE3AEDED562E817334EE998EE27A69EFF0E416
0B6EEEC423DEA367587611EFAFBEA1117F15D6B981D7CFC76A3330D5E34C672A
3DE332555DC929840DEDC7FABFE2FDEB85F87FDF1A0BCE769ED335DDA3675CE6
6BFAAF11BF0DE943D6C38758BE43C59EFA50BA47CF783FF723FC7F5CE379D181
BA0C4CCBFD875E58773DF6C95AF17C0DDDA367CCEF749DEDA7BD33AC6FB95B1F
F1FE1DB529B89DF7B646B9EC60BD46FC2FB0BE436487761FFC0017D17F94C90C
22BAA67B5CF63CA4C3786F8AC6338307786FE145B1E7301BFBFD20DE3F48D742
362FB17EDCAFCF07412F6C5323F5B3C79901F5C30021FB0D5217349E998EB465
9085BB05D6566CE75EB79CF0F755DDEBE6C6C5703ED6FDAF9435E1101EFAFB7B
592665A4F73A7DAFEBEC8CFCCA11670F97748D7842DF34B761215C4B678A5866
82A9BD83EA52B8CE8D413C91BED7A56126F2D2BAD982AB6238BFDA476DB7F522
0BB7B1BE1F419A1757EC02F6FD9BE25E2D525B7DA9DE71DF470706B1BFDBBD6D
299CE9B2F941C6CF4F3390B6752E1787369AEE111F34EF414A19C52E81BE34C6
A30D4EC6DF5F91F6565AD087F5620AE95FE342B852E3BC83E4BA0EE9285233E2
FE41739C8614DCC4E34E1B8DB576D9145C4FCF90A84C33BF53217D76107F4BE7
D39EE74819384CF2E6F38C26B23DD4BB6BB6CF81B36C1BF09AEFDA67DDEAFE18
313E10BEBD91E61E3CC63B75D2FF943D17A3F1C78265A80B13C4F3D55406E94F
51CFFB2AD8E43FA81F9D731A67CCA53916D6D1C2BA7F80C7C37188FB0A973DC8
38CD240BC73F62D98DFCFC988A6E60B9895CFE647516FABB6C6F9E384B5B948B
03C5B13103DF8BD8CCB91D6499855B592F88DF8F15F02BB8FE551E63E04C7E76
58CE3FA9BDA417AC1F337CE6CFC45F8502FEEE30F5A8F08DF4B702FE3F61E428
FB0D6DF11697CF9ECFBAB147C1BFFFC6F5343932E6B17F53577AE4D2DB0DCEF8
447301BCFE8BEFFF1260AD45B25C4B632D5E6F53B12369B7B6EDE5DEAD106753
230BE1936FB171BDE38E6729C4D6CDF25973AF568DAF229B671FDF6CCFB3C9F7
A4E1F900FEEB05F65787A80E8AB971FC48D47D14453AA97B0E1A628FA34DAE11
8B149FAD8D87A0F828FF31791E3230246E7CF67B63D9664F44E5210CBE9B079A
CFC48DCF3EEDEDA83CE8CA0F201E8A9D9F502C1F63E0AC3F907DEB8A7508CB83
6EFCA03E46377E501F63023F888F3185AFEA630CE99FB28F890BDFAF0E53B146
AA7524F8F1E147197F7A027EDCEF26F8097E4FC13791DFDA1DF05D7B565FF2FE
66212CDAF3996EE09CA335C83C3CC279C6E3F99C9C1072EC82A7CD54B7C2FB4D
51FAB1805C7685B5972873D11EF27E5B00FD6BD58D1FC0FE8ED1F9BC6EFC62EC
17F524FC38C7BC62E0871C973AE43E1501BF530E98EEFC123FF2CB018B0BDF8F
075DF8AAF311998726F2D162C377E7A1C529FFAEF4B7BBE387CD43E929F849FF
27FDDF4DFBBF49471E5968FCDCF730AA8A851FE379B4D6757AB1F1EDD8225CA3
1039B11E7192130FAB1AD76100BF53CEB3A16F350DC179D2CFF5697852159FCA
D23B51CEDCE9FB20F95C861CED57C5B7F305FE3F0B2A6B28834B02EA563F7CB7
CE356F5FA68A6FC7E375D4738A4FEDA7887DB11D57DDF19C799A8C372B846FC7
EAE13B4EBC961347E8C4C87719F768C18F726D8FFEF1E9B0FA8798CFC87D34EA
8B02B157C365BB6B32F05454FD671EA41C5EF68BBB92DF9EA4F8275DF68732FC
5CB46B87571C9688A3246A71F777147C8A81A3D83FA1CBC33DFCF9721167365A
B7FF4119BCE5674BACF3C7F3E7C725D057373EAF359D3DB5D6AA4570A1F0570F
0AD9AF0B1CA38BD78AF1CC1B851E0E14B21921F0E728E23F92FF8E195E2B8E19
0B84CC8609DD7B47E04F54CE47C8427F778C6E011DF854E08F75C72FB0EE7D62
70CC9CECA5E34E1E09F335DB60EEC03C31EF1C21F47FA0B08D8DC6BFFD95CB55
BB2FEF1F2CE8236CE3B88AFD8598AFF5736C9CB0B62D800B5CBCAD08E27F42E4
708D113ABEDC43378689E7CD51E355DD73D55A8E9D77E70EBA7C7493F00F938C
E8BD053BFDC6169AAFC9F1D76FEC0F88FDAC1C7FBBCCC7180FA76199258287A3
F47E84FC91C1AE338CC585F230D816B676886FB3604A909C323B5F3837E6CB33
9C06B7CEFBBE5F0A57D39CD17D96463156EEEFE6B9F757D99737B9E2A1AA83E6
E5708EE552CF9843F22319984B71DDB66EE135FB96368F58AC9FE4581B3207A8
25C4DAB285E2D035D96F6F5E07AD2A7026466761BF13CFA6BE654ABA45E33DF9
10F269B65F43DE10EF6153798F26E93FCAE766D5
}
end
end

View File

@ -0,0 +1,110 @@
unit main;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, ExtCtrls,
StdCtrls,
ExImgList;
type
{ TMainForm }
TMainForm = class(TForm)
CheckBox1: TCheckBox;
ColorButton1: TColorButton;
ImageList1: TImageList;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ToolBar0: TToolBar;
ToolBar1: TToolBar;
ToolBar2: TToolBar;
ToolButton1: TToolButton;
ToolButton11: TToolButton;
ToolButton12: TToolButton;
ToolButton13: TToolButton;
ToolButton14: TToolButton;
ToolButton15: TToolButton;
ToolButton16: TToolButton;
ToolButton17: TToolButton;
ToolButton18: TToolButton;
ToolButton2: TToolButton;
ToolButton21: TToolButton;
ToolButton22: TToolButton;
ToolButton23: TToolButton;
ToolButton24: TToolButton;
ToolButton25: TToolButton;
ToolButton26: TToolButton;
ToolButton27: TToolButton;
ToolButton28: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
procedure CheckBox1Change(Sender: TObject);
procedure ColorButton1ColorChanged(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FImageList1: TImageList;
FImageList2: TImageList;
public
end;
var
MainForm: TMainForm;
implementation
{$R *.lfm}
uses
ImgList;
{ TMainForm }
procedure TMainForm.CheckBox1Change(Sender: TObject);
var
i: Integer;
begin
for i := 0 to ToolBar0.ButtonCount - 1 do
begin
ToolBar0.Buttons[i].Enabled := Checkbox1.Checked;
ToolBar1.Buttons[i].Enabled := Checkbox1.Checked;
ToolBar2.Buttons[i].Enabled := Checkbox1.Checked;
end;
end;
procedure TMainForm.ColorButton1ColorChanged(Sender: TObject);
begin
SetImageListColor(FImageList2, ColorButton1.ButtonColor);
Toolbar2.Invalidate;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
// Toolbar0 uses for Images the image list populated at designtime, and
// no dedicated imagelist for DisabledImages, i.e. it creates the disabled
// icons by the built-in routines.
// Toolbar1 uses for Images the image list populated at designtime,
// and for DisabledImages the one created by CreateDisabledImageList.
FImageList1 := CreateDisabledImageList(ImageList1, self);
Toolbar1.DisabledImages := FImageList1;
// Toolbar2 uses for Images a recolored copy of the image list populated at
// designtime, and for DisabledImages the same one as Toolbar1
FImageList2 := CreateRecoloredImageList(ImageList1, ColorButton1.ButtonColor, self);
Toolbar2.Images := FImageList2;
Toolbar2.DisabledImages := FImageList1;
end;
end.

View File

@ -18,7 +18,7 @@
- TRadioButton, TCheckbox, TRadioGroup and TCheckGroup: drawn by ThemeServices/Canvas, not by widgetset, button/text layout, wordwrap, user-provided check images - TRadioButton, TCheckbox, TRadioGroup and TCheckGroup: drawn by ThemeServices/Canvas, not by widgetset, button/text layout, wordwrap, user-provided check images
- TColumnComboBoxEx"/> - TColumnComboBoxEx"/>
<License Value="LGPL with linking exception (like Lazarus LCL)."/> <License Value="LGPL with linking exception (like Lazarus LCL)."/>
<Files Count="7"> <Files Count="8">
<Item1> <Item1>
<Filename Value="source\excheckctrls.pas"/> <Filename Value="source\excheckctrls.pas"/>
<UnitName Value="ExCheckCtrls"/> <UnitName Value="ExCheckCtrls"/>
@ -47,6 +47,10 @@
<Filename Value="source\exshape.pas"/> <Filename Value="source\exshape.pas"/>
<UnitName Value="ExShape"/> <UnitName Value="ExShape"/>
</Item7> </Item7>
<Item8>
<Filename Value="source\eximglist.pas"/>
<UnitName Value="ExImgList"/>
</Item8>
</Files> </Files>
<CompatibilityMode Value="True"/> <CompatibilityMode Value="True"/>
<LazDoc Paths="fpdoc"/> <LazDoc Paths="fpdoc"/>

View File

@ -9,7 +9,7 @@ interface
uses uses
ExCheckCtrls, ExEditCtrls, ExButtons, ExCombo, ExCheckCombo, ExQuestionDlg, ExCheckCtrls, ExEditCtrls, ExButtons, ExCombo, ExCheckCombo, ExQuestionDlg,
ExShape; ExShape, ExImgList;
implementation implementation

View File

@ -2,7 +2,7 @@
<CONFIG> <CONFIG>
<Package Version="5"> <Package Version="5">
<PathDelim Value="\"/> <PathDelim Value="\"/>
<Name Value="exctrlspkg_dsgn"/> <Name Value="ExCtrlsPkg_dsgn"/>
<Type Value="DesignTime"/> <Type Value="DesignTime"/>
<Author Value="Lazarus team"/> <Author Value="Lazarus team"/>
<CompilerOptions> <CompilerOptions>

View File

@ -22,7 +22,7 @@ implementation
{$R exctrlsreg.res} {$R exctrlsreg.res}
uses uses
ExButtons, ExCheckCtrls, ExEditCtrls, ExCombo, ExCheckCombo, ExShape; //, ExImgList; ExButtons, ExCheckCtrls, ExEditCtrls, ExCombo, ExCheckCombo, ExShape;
function TFloatSIPropertyEditor.GetValue: ansistring; function TFloatSIPropertyEditor.GetValue: ansistring;
begin begin

View File

@ -0,0 +1,171 @@
unit ExImgList;
{$mode objfpc}{$H+}
interface
uses
LCLVersion, Classes, SysUtils, Graphics, GraphUtil, Controls, ImgList;
{$IF LCL_FullVersion < 2030000}
procedure BitmapGrayscale(ABitmap: TCustomBitmap; RedFilter, GreenFilter, BlueFilter: Single);
{$IFEND}
function CreateDisabledImageList(AImageList: TCustomImageList; AOwner: TComponent): TImageList;
function CreateRecoloredImageList(AImageList: TCustomImageList; ANewColor: TColor;
AOwner: TComponent): TImageList;
procedure SetImageListColor(AImageList: TCustomImageList; ANewColor: TColor);
implementation
uses
fpImage, fpCanvas, IntfGraphics;
{$IF LCL_FullVersion < 2030000}
procedure BitmapGrayscale(ABitmap: TCustomBitmap; RedFilter, GreenFilter, BlueFilter: Single);
var
IntfImg: TLazIntfImage = nil;
x, y: Integer;
TempColor: TFPColor;
Gray: Word;
sum: Single;
begin
// Normalize filter factors to avoid word overflow.
sum := RedFilter + GreenFilter + BlueFilter;
if sum = 0.0 then
exit;
RedFilter := RedFilter / sum;
GreenFilter := GreenFilter / sum;
BlueFilter := BlueFilter / sum;
IntfImg := ABitmap.CreateIntfImage;
try
IntfImg.BeginUpdate;
try
for y := 0 to IntfImg.Height - 1 do
for x := 0 to IntfImg.Width - 1 do
begin
TempColor := IntfImg.Colors[x, y];
Gray := word(Round(TempColor.Red * RedFilter + TempColor.Green * GreenFilter + TempColor.Blue * BlueFilter));
TempColor.Red := Gray;
TempColor.Green := Gray;
TempColor.Blue := Gray;
IntfImg.Colors[x, y] := TempColor;
end;
finally
IntfImg.EndUpdate;
end;
ABitmap.LoadFromIntfImage(IntfImg);
finally
IntfImg.Free;
end;
end;
{$IFEND}
{ Creates a new image list as copy of AImageList and converts its images to
grayscale. Intended to be used by TToolbar.DisabledImages. Avoids some
drawing artefacts in the auto-generated disabled images due to poorly
supported alpha channel in the built-in routines. }
function CreateDisabledImageList(AImageList: TCustomImageList; AOwner: TComponent): TImageList;
var
i: Integer;
bmp: TCustomBitmap;
Resolution: TCustomImageListResolution;
begin
if AImageList = nil then
begin
Result := nil;
exit;
end;
Result := TImageList.Create(AOwner);
AImageList.AssignTo(Result);
Result.Scaled := AImageList.Scaled;
bmp := TBitmap.Create;
Result.BeginUpdate;
try
for i := 0 to Result.Count - 1 do
begin
for Resolution in Result.Resolutions do
begin
Resolution.GetBitmap(i, bmp);
BitmapGrayScale(bmp, 0.30, 0.59, 0.11);
Resolution.ImageList.Replace(i, bmp, nil, False);
end;
end;
finally
Result.EndUpdate;
bmp.Free;
end;
end;
{ Creates a new images list as copy of AImagelist and changes all non-transparent
pixels to the specified new color. Primarily useful for monochrome outline icons. }
function CreateRecoloredImageList(AImageList: TCustomImageList; ANewColor: TColor;
AOwner: TComponent): TImageList;
begin
Result := TImageList.Create(AOwner);
AImageList.AssignTo(Result);
Result.Scaled := AImageList.Scaled;
SetImagelistColor(Result, ANewColor);
end;
{ Replaces the color of all non-transparent pixels by the given new color.
Intended to change the color of monochrome outline icons. }
procedure SetImageListColor(AImageList: TCustomImageList; ANewColor: TColor);
var
i, x, y: Integer;
IntfImg: TLazIntfImage = nil;
newColor: TFPColor;
tmpColor: TFPColor;
bmp: TCustomBitmap;
Resolution: TCustomImageListResolution;
begin
if AImageList = nil then
exit;
bmp := TBitmap.Create;
AImageList.BeginUpdate;
try
newColor := TColorToFPColor(ANewColor);
for i := 0 to AImageList.Count - 1 do
begin
for Resolution in AImageList.Resolutions do
begin
Resolution.GetBitmap(i, bmp);
IntfImg := bmp.CreateIntfImage;
try
IntfImg.BeginUpdate;
try
for y := 0 to IntfImg.Height - 1 do
for x := 0 to IntfImg.Width - 1 do
begin
tmpColor := IntfImg.Colors[x, y];
if tmpColor.Alpha > 0 then
begin
tmpColor.Red := newColor.Red;
tmpColor.Green := newColor.Green;
tmpColor.Blue := newColor.Blue;
IntfImg.Colors[x, y] := tmpColor;
end;
end;
finally
IntfImg.EndUpdate;
end;
bmp.LoadFromIntfImage(IntfImg);
Resolution.ImageList.Replace(i, bmp, nil, False);
finally
IntfImg.Free;
end;
end;
end;
finally
AImageList.EndUpdate;
bmp.Free;
end;
end;
end.