CnSkinStdCtrls.pas 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722
  1. {******************************************************************************}
  2. { CnPack For Delphi/C++Builder }
  3. { 中国人自己的开放源码第三方开发包 }
  4. { (C)Copyright 2001-2018 CnPack 开发组 }
  5. { ------------------------------------ }
  6. { }
  7. { 本开发包是开源的自由软件,您可以遵照 CnPack 的发布协议来修 }
  8. { 改和重新发布这一程序。 }
  9. { }
  10. { 发布这一开发包的目的是希望它有用,但没有任何担保。甚至没有 }
  11. { 适合特定目的而隐含的担保。更详细的情况请参阅 CnPack 发布协议。 }
  12. { }
  13. { 您应该已经和开发包一起收到一份 CnPack 发布协议的副本。如果 }
  14. { 还没有,可访问我们的网站: }
  15. { }
  16. { 网站地址:http://www.cnpack.org }
  17. { 电子邮件:master@cnpack.org }
  18. { }
  19. {******************************************************************************}
  20. unit CnSkinStdCtrls;
  21. interface
  22. uses
  23. Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Graphics, IniFiles,
  24. Forms, ExtCtrls, CnSkinTheme;
  25. type
  26. TUnderline = (ulNone, ulHot, ulAlways);
  27. TCnSkinGroupBox = class(TGroupBox)
  28. private
  29. procedure CMThemeChange(var Message: TMessage); message CM_THEMECHANGE;
  30. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  31. protected
  32. { Protected declarations }
  33. public
  34. constructor Create(AOwner: TComponent); override;
  35. destructor Destroy; override;
  36. published
  37. { Published declarations }
  38. end;
  39. TCnSkinLabel = class(TLabel)
  40. private
  41. FHotColor: TColor;
  42. FHot: Boolean;
  43. FUnderline: TUnderline;
  44. procedure SetUnderline(Value: TUnderline);
  45. procedure CMThemeChange(var Message: TMessage); message CM_THEMECHANGE;
  46. procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
  47. procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  48. procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  49. protected
  50. procedure Paint; override;
  51. public
  52. constructor Create(AOwner: TComponent); override;
  53. destructor Destroy; override;
  54. published
  55. property HotColor: TColor read FHotColor write FHotColor;
  56. property Underline: TUnderline read FUnderline write SetUnderline;
  57. end;
  58. TCnSkinEdit = class(TEdit)
  59. private
  60. procedure CMThemeChange(var Message: TMessage); message CM_THEMECHANGE;
  61. procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
  62. protected
  63. { Protected declarations }
  64. public
  65. constructor Create(AOwner: TComponent); override;
  66. destructor Destroy; override;
  67. published
  68. { Published declarations }
  69. end;
  70. TCnSkinMemo = class(TMemo)
  71. private
  72. FDownButton: TScrollBarButton;
  73. FOverButton: TScrollBarButton;
  74. procedure CMThemeChange(var Message: TMessage); message CM_THEMECHANGE;
  75. procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  76. procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
  77. procedure WMNCHittest(var Message: TWMNCHittest); message WM_NCHITTEST;
  78. procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
  79. procedure WMNCLButtonUp(var Message: TWMNCLButtonUp); message WM_NCLBUTTONUP;
  80. procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
  81. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  82. procedure WMTimer(var Message: TWMTimer); message WM_TIMER;
  83. protected
  84. procedure CreateParams(var Params: TCreateParams); override;
  85. public
  86. constructor Create(AOwner: TComponent); override;
  87. destructor Destroy; override;
  88. end;
  89. TButtonState = (bsDefault, bsOver, bsDown, bsDisabled);
  90. TCnSkinComboBox = class(TComboBox)
  91. private
  92. FButtonState: TButtonState;
  93. procedure SetButtonState(Value: TButtonState);
  94. procedure CMThemeChange(var Message: TMessage); message CM_THEMECHANGE;
  95. procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  96. procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  97. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  98. protected
  99. procedure CreateParams(var Params: TCreateParams); override;
  100. procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  101. X, Y: Integer); override;
  102. procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  103. procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  104. X, Y: Integer); override;
  105. public
  106. constructor Create(AOwner: TComponent); override;
  107. destructor Destroy; override;
  108. end;
  109. TCnSkinButton = class(TButton)
  110. private
  111. FButtonState: TButtonState;
  112. procedure SetButtonState(Value: TButtonState);
  113. procedure CMThemeChange(var Message: TMessage); message CM_THEMECHANGE;
  114. procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  115. procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  116. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  117. protected
  118. procedure CreateParams(var Params: TCreateParams); override;
  119. procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  120. X, Y: Integer); override;
  121. procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  122. X, Y: Integer); override;
  123. public
  124. constructor Create(AOwner: TComponent); override;
  125. destructor Destroy; override;
  126. published
  127. { Published declarations }
  128. end;
  129. TCnSkinCheckBox = class(TCheckBox)
  130. private
  131. FButtonState: TButtonState;
  132. procedure SetButtonState(Value: TButtonState);
  133. procedure CMThemeChange(var Message: TMessage); message CM_THEMECHANGE;
  134. procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  135. procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  136. procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  137. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  138. protected
  139. procedure CreateParams(var Params: TCreateParams); override;
  140. procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  141. X, Y: Integer); override;
  142. procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  143. X, Y: Integer); override;
  144. public
  145. constructor Create(AOwner: TComponent); override;
  146. destructor Destroy; override;
  147. published
  148. { Published declarations }
  149. end;
  150. TCnSkinRadioButton = class(TRadioButton)
  151. private
  152. FButtonState: TButtonState;
  153. procedure SetButtonState(Value: TButtonState);
  154. procedure CMThemeChange(var Message: TMessage); message CM_THEMECHANGE;
  155. procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  156. procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  157. procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  158. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  159. protected
  160. procedure CreateParams(var Params: TCreateParams); override;
  161. procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  162. X, Y: Integer); override;
  163. procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  164. X, Y: Integer); override;
  165. public
  166. constructor Create(AOwner: TComponent); override;
  167. destructor Destroy; override;
  168. published
  169. { Published declarations }
  170. end;
  171. TCnSkinListBox = class(TListBox)
  172. private
  173. FDownButton: TScrollBarButton;
  174. FOverButton: TScrollBarButton;
  175. FScrollBarVisible: Boolean;
  176. procedure CMThemeChange(var Message: TMessage); message CM_THEMECHANGE;
  177. procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  178. procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
  179. procedure WMNCHittest(var Message: TWMNCHittest); message WM_NCHITTEST;
  180. procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
  181. procedure WMNCLButtonUp(var Message: TWMNCLButtonUp); message WM_NCLBUTTONUP;
  182. procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
  183. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  184. procedure WMTimer(var Message: TWMTimer); message WM_TIMER;
  185. protected
  186. procedure CreateParams(var Params: TCreateParams); override;
  187. public
  188. constructor Create(AOwner: TComponent); override;
  189. destructor Destroy; override;
  190. end;
  191. TCnSkinScrollBar = class(TScrollBar)
  192. private
  193. FOverButton: TScrollBarButton;
  194. FDownButton: TScrollBarButton;
  195. procedure CMThemeChange(var Message: TMessage); message CM_THEMECHANGE;
  196. procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  197. procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  198. procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
  199. procedure WMNCHittest(var Message: TWMNCHittest); message WM_NCHITTEST;
  200. procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
  201. procedure WMNCLButtonUp(var Message: TWMNCLButtonUp); message WM_NCLBUTTONUP;
  202. procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
  203. procedure WMTimer(var Message: TWMTimer); message WM_TIMER;
  204. protected
  205. procedure CreateParams(var Params: TCreateParams); override;
  206. procedure Change; override;
  207. public
  208. constructor Create(AOwner: TComponent); override;
  209. destructor Destroy; override;
  210. published
  211. end;
  212. TCnSkinStaticText = class(TStaticText)
  213. private
  214. FHotColor: TColor;
  215. FHot: Boolean;
  216. FUnderline: TUnderline;
  217. procedure SetUnderline(Value: TUnderline);
  218. procedure CMThemeChange(var Message: TMessage); message CM_THEMECHANGE;
  219. procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  220. procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  221. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  222. protected
  223. { Protected declarations }
  224. public
  225. constructor Create(AOwner: TComponent); override;
  226. destructor Destroy; override;
  227. published
  228. property HotColor: TColor read FHotColor write FHotColor;
  229. property Underline: TUnderline read FUnderline write SetUnderline;
  230. end;
  231. //procedure ResetSkin(SkinPath: string; IniFile: TIniFile);
  232. implementation
  233. uses
  234. Consts;
  235. procedure DrawGroupBox(Control: TGroupBox);
  236. var
  237. Canvas: TControlCanvas;
  238. R: TRect;
  239. begin
  240. Canvas := TControlCanvas.Create;
  241. Canvas.Control := Control;
  242. Canvas.Lock;
  243. try
  244. Canvas.Brush := Control.Brush;
  245. Canvas.Pen.Color := CnSkinThemes.CurrentSkin.ShadowColor;
  246. Canvas.Font := Control.Font;
  247. Canvas.FillRect(Control.ClientRect);
  248. R := Control.ClientRect;
  249. R.Top := Canvas.TextHeight(Control.Caption) div 2;
  250. Canvas.Rectangle(R);
  251. R.Top := 0;
  252. R.Left := 8;
  253. DrawText(Canvas.Handle, PChar(Control.Caption), -1, R, DT_LEFT or DT_TOP);
  254. finally
  255. Canvas.Unlock;
  256. Canvas.Free;
  257. end;
  258. end;
  259. procedure DrawBorder(Control: TWinControl);
  260. var
  261. Canvas: TCanvas;
  262. RC, RW: TRect;
  263. begin
  264. Canvas := TCanvas.Create;
  265. Canvas.Handle := GetWindowDC(Control.Handle);
  266. try
  267. Windows.GetClientRect(Control.Handle, RC);
  268. GetWindowRect(Control.Handle, RW);
  269. MapWindowPoints(0, Control.Handle, RW, 2);
  270. OffsetRect(RC, -RW.Left, -RW.Top);
  271. ExcludeClipRect(Canvas.Handle, RC.Left, RC.Top, RC.Right, RC.Bottom);
  272. RC := Rect(0, 0, Control.Width, Control.Height);
  273. Canvas.Pen.Color := CnSkinThemes.CurrentSkin.ShadowColor;
  274. Canvas.Brush := Control.Brush;
  275. Canvas.Rectangle(RC);
  276. finally
  277. ReleaseDC(Control.Handle, Canvas.Handle);
  278. Canvas.Free;
  279. end;
  280. end;
  281. procedure DrawCombo(Control: TComboBox; State: TButtonState);
  282. var
  283. Canvas: TControlCanvas;
  284. H: Integer;
  285. SrcR, DestR: TRect;
  286. begin
  287. Canvas := TControlCanvas.Create;
  288. Canvas.Control := Control;
  289. try
  290. Canvas.Brush := Control.Brush;
  291. Canvas.Pen.Color := CnSkinThemes.CurrentSkin.ShadowColor;
  292. Canvas.Rectangle(Control.ClientRect);
  293. DestR.Top := 1;
  294. DestR.Bottom := Control.Height -1;
  295. DestR.Right := Control.Width -1;
  296. DestR.Left := DestR.Right - GetSystemMetrics(SM_CXHTHUMB) - 1;
  297. H := CnSkinThemes.CurrentSkin.ComboBmp.Height div 6;
  298. SrcR := Rect(0, 0, CnSkinThemes.CurrentSkin.ComboBmp.Width, H);
  299. OffsetRect(SrcR, 0, Ord(State) * H);
  300. Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.ComboBmp.Canvas, SrcR);
  301. SrcR := Rect(0, 0, CnSkinThemes.CurrentSkin.ComboBmp.Width, H);
  302. if State = bsDisabled then
  303. OffsetRect(SrcR, 0, 5 * H) else
  304. OffsetRect(SrcR, 0, 4 * H);
  305. Inc(DestR.Left, (DestR.Right - DestR.Left - CnSkinThemes.CurrentSkin.ComboBmp.Width) div 2);
  306. DestR.Right := DestR.Left + CnSkinThemes.CurrentSkin.ComboBmp.Width;
  307. Canvas.Brush.Style := bsClear;
  308. Canvas.BrushCopy(DestR, CnSkinThemes.CurrentSkin.ComboBmp, SrcR, clFuchsia);
  309. finally
  310. Canvas.Free;
  311. end;
  312. end;
  313. procedure DrawButton(Control: TButton; State: TButtonState);
  314. var
  315. Canvas: TControlCanvas;
  316. SrcY, W, H: Integer;
  317. SrcR, DestR: TRect;
  318. begin
  319. Canvas := TControlCanvas.Create;
  320. Canvas.Control := Control;
  321. Canvas.Lock;
  322. try
  323. W := CnSkinThemes.CurrentSkin.ButtonBmp.Width div 3;
  324. H := CnSkinThemes.CurrentSkin.ButtonBmp.Height div 5;
  325. if (GetFocus = Control.Handle) and (State = bsDefault) then
  326. SrcY := CnSkinThemes.CurrentSkin.ButtonBmp.Height - H
  327. else
  328. SrcY := Ord(State) * H;
  329. SrcR := Rect(0, SrcY, W, SrcY + H);
  330. DestR := Rect(0, 0, W, Control.Height);
  331. Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.ButtonBmp.Canvas, SrcR);
  332. OffsetRect(SrcR, W, 0);
  333. DestR.Left := W;
  334. DestR.Right := Control.Width - W;
  335. Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.ButtonBmp.Canvas, SrcR);
  336. SrcR.Right := CnSkinThemes.CurrentSkin.ButtonBmp.Width;
  337. SrcR.Left := SrcR.Right - W;
  338. DestR.Left := DestR.Right;
  339. DestR.Right := Control.Width;
  340. Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.ButtonBmp.Canvas, SrcR);
  341. Canvas.Brush.Style := bsClear;
  342. Canvas.Font := Control.Font;
  343. if not Control.Enabled then
  344. Canvas.Font.Color := clGray;
  345. DestR.Left := 0;
  346. DrawText(Canvas.Handle, PChar(Control.Caption), -1, DestR,
  347. DT_CENTER or DT_VCENTER or DT_SINGLELINE);
  348. finally
  349. Canvas.Unlock;
  350. Canvas.Free;
  351. end;
  352. end;
  353. procedure DrawCheckBox(Control: TCheckBox; State: TButtonState);
  354. var
  355. Canvas: TControlCanvas;
  356. SrcR, DestR: TRect;
  357. W: Integer;
  358. begin
  359. Canvas := TControlCanvas.Create;
  360. Canvas.Control := Control;
  361. Canvas.Lock;
  362. try
  363. W := CnSkinThemes.CurrentSkin.CheckBmp.Width;
  364. SrcR := Rect(0, 0, W, W);
  365. DestR := SrcR;
  366. OffsetRect(DestR, 0, (Control.Height - W) div 2);
  367. OffsetRect(SrcR, 0, (Ord(State) + Ord(Control.State) * 4) * W);
  368. Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.CheckBmp.Canvas, SrcR);
  369. finally
  370. Canvas.Unlock;
  371. Canvas.Free;
  372. end;
  373. end;
  374. procedure DrawRadio(Control: TRadioButton; State: TButtonState);
  375. var
  376. Canvas: TControlCanvas;
  377. SrcR, DestR: TRect;
  378. W: Integer;
  379. begin
  380. Canvas := TControlCanvas.Create;
  381. Canvas.Control := Control;
  382. Canvas.Lock;
  383. try
  384. W := CnSkinThemes.CurrentSkin.RadioBmp.Width;
  385. SrcR := Rect(0, 0, W, W);
  386. DestR := SrcR;
  387. OffsetRect(DestR, 0, (Control.Height - W) div 2);
  388. OffsetRect(SrcR, 0, (Ord(State) + Ord(Control.Checked) * 4) * W);
  389. Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.RadioBmp.Canvas, SrcR);
  390. finally
  391. Canvas.Unlock;
  392. Canvas.Free;
  393. end;
  394. end;
  395. procedure DrawScrollBar2(Canvas: TCanvas; R: TRect; I1, I2: Integer;
  396. Down: TScrollBarButton; Kind: TScrollBarKind; Enabled: Boolean);
  397. const
  398. Colors: array[Boolean] of TColor = (clGray, clBlack);
  399. DownStyles: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
  400. var
  401. DestR: TRect;
  402. DestX, DestY, DestW: Integer;
  403. begin
  404. Canvas.Brush.Color := CnSkinThemes.CurrentSkin.FaceColor;
  405. Canvas.FillRect(R);
  406. Canvas.Pen.Color := Colors[Enabled];
  407. Canvas.Brush.Color := Colors[Enabled];
  408. if Kind = sbHorizontal then
  409. begin
  410. DestW := R.Bottom - R.Top;
  411. DestR := R;
  412. DestR.Right := DestR.Left + DestW;
  413. DrawEdge(Canvas.Handle, DestR, DownStyles[Down = sbLeft], BF_RECT);
  414. DestX := (DestW - 4) div 2 + R.Left;
  415. DestY := (DestW - 6) div 2 + R.Top;
  416. Canvas.Polygon([Point(DestX, DestY + 3), Point(DestX + 3, DestY + 6),
  417. Point(DestX + 3, DestY), Point(DestX, DestY + 3)]);
  418. OffsetRect(DestR, R.Right - R.Left - DestW, 0);
  419. DestX := R.Right + R.Left - DestX -1;
  420. Canvas.Polygon([Point(DestX, DestY + 3), Point(DestX - 3, DestY + 6),
  421. Point(DestX - 3, DestY), Point(DestX, DestY + 3)]);
  422. DrawEdge(Canvas.Handle, DestR, DownStyles[Down = sbRight], BF_RECT);
  423. DestR.Left := I1;
  424. DestR.Right := DestR.Left + I2;
  425. if Enabled then
  426. DrawEdge(Canvas.Handle, DestR, DownStyles[Down = sbButton], BF_RECT);
  427. end
  428. else
  429. begin
  430. DestW := R.Right - R.Left;
  431. DestR := R;
  432. DestR.Bottom := DestR.Top + DestW;
  433. DrawEdge(Canvas.Handle, DestR, DownStyles[Down = sbUp], BF_RECT);
  434. DestX := (DestW - 6) div 2 + R.Left;
  435. DestY := (DestW - 4) div 2 + R.Top;
  436. Canvas.Polygon([Point(DestX, DestY + 3), Point(DestX + 6, DestY + 3),
  437. Point(DestX + 3, DestY), Point(DestX, DestY + 3)]);
  438. OffsetRect(DestR, 0, R.Bottom - R.Top - DestW);
  439. DestY := R.Bottom - R.Top - DestY -1;
  440. Canvas.Polygon([Point(DestX, DestY - 3), Point(DestX + 6, DestY - 3),
  441. Point(DestX + 3, DestY), Point(DestX, DestY - 3)]);
  442. DrawEdge(Canvas.Handle, DestR, DownStyles[Down = sbDown], BF_RECT);
  443. DestR.Top := I1;
  444. DestR.Bottom := DestR.Top + I2;
  445. if Enabled then
  446. DrawEdge(Canvas.Handle, DestR, DownStyles[Down = sbButton], BF_RECT);
  447. end;
  448. end;
  449. procedure DrawMemo(Control: TMemo; Over, Down: TScrollBarButton);
  450. var
  451. Canvas: TCanvas;
  452. R, R2: TRect;
  453. I, I1, I2: Integer;
  454. Enabled: Boolean;
  455. procedure DrawMemoScrollBar(Kind: TScrollBarKind);
  456. begin
  457. R2 := R;
  458. if Kind = sbHorizontal then
  459. begin
  460. Inc(R2.Left);
  461. R2.Top := R2.Bottom - SBSIZE;
  462. if Control.ScrollBars = ssBoth then
  463. Dec(R2.Right, SBSIZE);
  464. I1 := R2.Left + SBSIZE;
  465. I := R2.Right - R2.Left;
  466. case Over of
  467. sbButton: Over := sbNone;
  468. sbButtonH: Over := sbButton;
  469. end;
  470. case Down of
  471. sbButton: Down := sbNone;
  472. sbButtonH: Down := sbButton;
  473. end;
  474. end else
  475. begin
  476. Inc(R2.Top);
  477. R2.Left := R2.Right - SBSIZE;
  478. if Control.ScrollBars = ssBoth then
  479. Dec(R2.Bottom, SBSIZE);
  480. I1 := R2.Top + SBSIZE;
  481. I := R2.Bottom - R2.Top;
  482. end;
  483. Enabled := Control.Enabled;
  484. if Enabled then
  485. Enabled := CnGetScrollInfo(Control, I, I1, I2, Kind);
  486. CnDrawScrollBar(Canvas, R2, I1, I2, Over, Down, Kind, Enabled);
  487. end;
  488. begin
  489. Canvas := TCanvas.Create;
  490. Canvas.Handle := GetWindowDC(Control.Handle);
  491. try
  492. R := Rect(0, 0, Control.Width, Control.Height);
  493. Canvas.Pen.Color := CnSkinThemes.CurrentSkin.ShadowColor;
  494. Canvas.Brush.Style := bsClear;
  495. Canvas.Rectangle(R);
  496. Dec(R.Right);
  497. Dec(R.Bottom);
  498. Canvas.Font := Control.Font;
  499. case Control.ScrollBars of
  500. ssBoth:
  501. begin
  502. R2 := R;
  503. R2.Left := R2.Right - SBSIZE;
  504. R2.Top := R2.Bottom - SBSIZE;
  505. Canvas.Brush.Color := CnSkinThemes.CurrentSkin.FaceColor;
  506. Canvas.FillRect(R2);
  507. DrawMemoScrollBar(sbVertical);
  508. DrawMemoScrollBar(sbHorizontal);
  509. end;
  510. ssVertical: DrawMemoScrollBar(sbHorizontal);
  511. ssHorizontal: DrawMemoScrollBar(sbVertical);
  512. end;
  513. finally
  514. ReleaseDC(Control.Handle, Canvas.Handle);
  515. Canvas.Free;
  516. end;
  517. end;
  518. procedure ScrollMemo(Control: TMemo; Count: Integer; Kind: TScrollBarKind);
  519. begin
  520. if Kind = sbVertical then
  521. SendMessage(Control.Handle, EM_LINESCROLL, 0, Count)
  522. else
  523. SendMessage(Control.Handle, EM_LINESCROLL, Count, 0);
  524. end;
  525. procedure DrawListBox(Control: TListBox; Over, Down: TScrollBarButton);
  526. var
  527. Canvas: TCanvas;
  528. R: TRect;
  529. H, I1, I2: Integer;
  530. begin
  531. Canvas := TCanvas.Create;
  532. Canvas.Handle := GetWindowDC(Control.Handle);
  533. try
  534. R := Rect(0, 0, Control.Width, Control.Height);
  535. Canvas.Pen.Color := CnSkinThemes.CurrentSkin.ShadowColor;
  536. Canvas.Brush.Style := bsClear;
  537. Canvas.Rectangle(R);
  538. H := Control.Height - 2;
  539. I1 := SBSIZE + 1;
  540. if CnGetScrollInfo(Control, H, I1, I2, sbVertical) then
  541. begin
  542. Dec(R.Right);
  543. Dec(R.Bottom);
  544. Inc(R.Top);
  545. R.Left := R.Right - SBSIZE;
  546. CnDrawScrollBar(Canvas, R, I1, I2, Over, Down, sbVertical, Control.Enabled);
  547. end;
  548. finally
  549. ReleaseDC(Control.Handle, Canvas.Handle);
  550. Canvas.Free;
  551. end;
  552. end;
  553. procedure DrawScrollBar(Control: TScrollBar; Over, Down: TScrollBarButton);
  554. var
  555. I, I1, I2: Integer;
  556. Canvas: TCanvas;
  557. R: TRect;
  558. begin
  559. with Control do
  560. begin
  561. if Kind = sbHorizontal then
  562. begin
  563. I := Width - Height - Height;
  564. I2 := Height;
  565. end else
  566. begin
  567. I := Height - Width - Width;
  568. I2 := Width;
  569. end;
  570. if PageSize > 0 then
  571. begin
  572. I2 := I * PageSize div Max;
  573. if I2 < 10 then I2 := 10;
  574. end;
  575. if Kind = sbHorizontal then
  576. I1 := (I - I2) * Position div Max + Height
  577. else
  578. I1 := (I - I2) * Position div Max + Width;
  579. R := Rect(0, 0, Width, Height);
  580. Canvas := TCanvas.Create;
  581. Canvas.Handle := GetWindowDC(Handle);
  582. try
  583. CnDrawScrollBar(Canvas, R, I1, I2, Over, Down, Kind, Enabled);
  584. finally
  585. ReleaseDC(Handle, Canvas.Handle);
  586. Canvas.Free;
  587. end;
  588. end;
  589. end;
  590. {TCnSkinGroupBox}
  591. constructor TCnSkinGroupBox.Create(AOwner: TComponent);
  592. begin
  593. inherited Create(AOwner);
  594. CnSkinThemes.Controls.Add(Self);
  595. end;
  596. destructor TCnSkinGroupBox.Destroy;
  597. begin
  598. CnSkinThemes.Controls.Remove(Self);
  599. inherited Destroy;
  600. end;
  601. procedure TCnSkinGroupBox.CMThemeChange(var Message: TMessage);
  602. begin
  603. Repaint;
  604. end;
  605. procedure TCnSkinGroupBox.WMPaint(var Message: TWMPaint);
  606. begin
  607. inherited;
  608. if CnSkinThemes.Active then
  609. DrawGroupBox(Self);
  610. end;
  611. {TCnSkinLabel}
  612. constructor TCnSkinLabel.Create(AOwner: TComponent);
  613. begin
  614. inherited Create(AOwner);
  615. CnSkinThemes.Controls.Add(Self);
  616. FHotColor := clBlue;
  617. end;
  618. destructor TCnSkinLabel.Destroy;
  619. begin
  620. CnSkinThemes.Controls.Remove(Self);
  621. inherited Destroy;
  622. end;
  623. procedure TCnSkinLabel.SetUnderline(Value: TUnderline);
  624. begin
  625. if Value <> FUnderline then
  626. begin
  627. FUnderline := Value;
  628. Repaint;
  629. end;
  630. end;
  631. procedure TCnSkinLabel.CMThemeChange(var Message: TMessage);
  632. begin
  633. Repaint;
  634. end;
  635. procedure TCnSkinLabel.CMFontChanged(var Message: TMessage);
  636. begin
  637. if not FHot then inherited;
  638. end;
  639. procedure TCnSkinLabel.CMMouseEnter(var Message: TMessage);
  640. begin
  641. inherited;
  642. if not (csDesigning in ComponentState) then
  643. begin
  644. FHot := True;
  645. Repaint;
  646. end;
  647. end;
  648. procedure TCnSkinLabel.CMMouseLeave(var Message: TMessage);
  649. begin
  650. inherited;
  651. if not (csDesigning in ComponentState) then
  652. begin
  653. FHot := False;
  654. Repaint;
  655. end;
  656. end;
  657. procedure TCnSkinLabel.Paint;
  658. var
  659. SaveColor: TColor;
  660. X, W: Integer;
  661. begin
  662. if FHot then
  663. begin
  664. SaveColor := Font.Color;
  665. Font.Color := FHotColor;
  666. end
  667. else
  668. SaveColor := clBlack;
  669. inherited;
  670. if (FUnderline = ulAlways) or ((FUnderline = ulHot) and FHot) then
  671. begin
  672. X := 0;
  673. W := Canvas.TextWidth(Caption);
  674. case Alignment of
  675. taCenter: X := (Width - W) div 2;
  676. taRightJustify: X := Width - W;
  677. end;
  678. Canvas.Pen.Color := Font.Color;
  679. Canvas.MoveTo(X, Height -1 );
  680. Canvas.LineTo(X + W, Height - 1);
  681. end;
  682. if FHot then
  683. Font.Color := SaveColor;
  684. end;
  685. {TCnSkinEdit}
  686. constructor TCnSkinEdit.Create(AOwner: TComponent);
  687. begin
  688. inherited Create(AOwner);
  689. CnSkinThemes.Controls.Add(Self);
  690. end;
  691. destructor TCnSkinEdit.Destroy;
  692. begin
  693. CnSkinThemes.Controls.Remove(Self);
  694. inherited Destroy;
  695. end;
  696. procedure TCnSkinEdit.CMThemeChange(var Message: TMessage);
  697. begin
  698. Repaint;
  699. end;
  700. procedure TCnSkinEdit.WMNCPaint(var Message: TMessage);
  701. begin
  702. if CnSkinThemes.Active then
  703. DrawBorder(Self)
  704. else
  705. inherited;
  706. end;
  707. {TCnSkinMemo}
  708. constructor TCnSkinMemo.Create(AOwner: TComponent);
  709. begin
  710. inherited Create(AOwner);
  711. CnSkinThemes.Controls.Add(Self);
  712. FDownButton := sbNone;
  713. FOverButton := sbNone;
  714. end;
  715. destructor TCnSkinMemo.Destroy;
  716. begin
  717. CnSkinThemes.Controls.Remove(Self);
  718. inherited Destroy;
  719. end;
  720. procedure TCnSkinMemo.CreateParams(var Params: TCreateParams);
  721. begin
  722. inherited CreateParams(Params);
  723. end;
  724. procedure TCnSkinMemo.CMThemeChange(var Message: TMessage);
  725. begin
  726. RecreateWnd;
  727. end;
  728. procedure TCnSkinMemo.CMMouseLeave(var Message: TMessage);
  729. begin
  730. if FOverButton <> sbNone then
  731. begin
  732. FOverButton := sbNone;
  733. FDownButton := sbNone;
  734. DrawMemo(Self, FOverButton, FDownButton);
  735. end;
  736. end;
  737. procedure TCnSkinMemo.WMNCCalcSize(var Message: TWMNCCalcSize);
  738. begin
  739. if CnSkinThemes.Active then
  740. begin
  741. with Message.CalcSize_Params^ do
  742. begin
  743. Inc(rgrc[0].Left);
  744. Inc(rgrc[0].Top);
  745. Dec(rgrc[0].Right);
  746. if ScrollBars in [ssBoth, ssVertical] then
  747. Dec(rgrc[0].Right, SBSIZE);
  748. Dec(rgrc[0].Bottom);
  749. if ScrollBars in [ssBoth, ssHorizontal] then
  750. Dec(rgrc[0].Bottom, SBSIZE);
  751. end;
  752. end else
  753. inherited;
  754. end;
  755. procedure TCnSkinMemo.WMNCLButtonDown(var Message: TWMNCLButtonDown);
  756. var
  757. Pt: TPoint;
  758. Kind: TScrollBarKind;
  759. I, Count, Pos, CharWidth: Integer;
  760. begin
  761. inherited;
  762. if (CnSkinThemes.Active) and (ScrollBars <> ssNone) then
  763. begin
  764. FDownButton := FOverButton;
  765. if FDownButton < sbButton then
  766. begin
  767. Pos := 0;
  768. Kind := sbVertical;
  769. I := 0;
  770. Pt := ScreenToClient(Point(Message.XCursor, Message.YCursor));
  771. if (Pt.X > Width - SBSIZE - 1) and (ScrollBars <> ssHorizontal) then
  772. begin
  773. I := Height - 2;
  774. if ScrollBars = ssBoth then Dec(I, SBSIZE);
  775. Kind := sbVertical;
  776. Pos := Pt.Y;
  777. end else
  778. if (Pt.Y > Height - SBSIZE - 1) and (ScrollBars <> ssVertical) then
  779. begin
  780. I := Width - 2;
  781. if ScrollBars = ssBoth then Dec(I, SBSIZE);
  782. Kind := sbHorizontal;
  783. Pos := Pt.X;
  784. end;
  785. Count := CnGetScrollCount(Self, FDownButton, I, Pos, Kind);
  786. if Count <> 0 then
  787. begin
  788. if FDownButton <> sbNone then
  789. begin
  790. ScrollMemo(Self, Count, Kind);
  791. SetTimer(Handle, 1000, 100, nil);
  792. end else
  793. if Kind = sbHorizontal then
  794. begin
  795. Pos := GetScrollPos(Handle, Ord(Kind));
  796. if Count > 0 then
  797. begin
  798. ScrollMemo(Self, 1, Kind);
  799. CharWidth := GetScrollPos(Handle, Ord(Kind)) - Pos;
  800. Dec(Count, CharWidth);
  801. end else
  802. begin
  803. ScrollMemo(Self, -1, Kind);
  804. CharWidth := Pos - GetScrollPos(Handle, Ord(Kind));
  805. Inc(Count, CharWidth);
  806. end;
  807. ScrollMemo(Self, Count div CharWidth, Kind);
  808. end else
  809. ScrollMemo(Self, Count, Kind);
  810. end else
  811. DrawMemo(Self, FOverButton, FDownButton);
  812. end else
  813. DrawMemo(Self, FOverButton, FDownButton);
  814. end;
  815. end;
  816. procedure TCnSkinMemo.WMNCLButtonUp(var Message: TWMNCLButtonUp);
  817. begin
  818. inherited;
  819. if FDownButton <> sbNone then
  820. begin
  821. FDownButton := sbNone;
  822. DrawMemo(Self, FOverButton, FDownButton);
  823. end;
  824. end;
  825. procedure TCnSkinMemo.WMNCHittest(var Message: TWMNCHittest);
  826. var
  827. Pt: TPoint;
  828. Button: TScrollBarButton;
  829. I, I1, I2, Pos, Count, CharWidth: Integer;
  830. Kind: TScrollBarKind;
  831. begin
  832. inherited;
  833. if (not CnSkinThemes.Active) or (ScrollBars = ssNone) then Exit;
  834. Pt := ScreenToClient(Point(Message.XPos, Message.YPos));
  835. Button := sbNone;
  836. if (Pt.X > Width - SBSIZE - 1) and (ScrollBars <> ssHorizontal) then
  837. begin
  838. Kind := sbVertical;
  839. I := Height - 2;
  840. if ScrollBars = ssBoth then Dec(I, SBSIZE);
  841. if FDownButton = sbButton then
  842. begin
  843. Count := CnGetScrollCount(Self, FDownButton, I, Pt.Y, Kind);
  844. if Count <> 0 then
  845. ScrollMemo(Self, Count, Kind);
  846. end else
  847. if Pt.Y < SBSIZE + 1 then Button := sbUp else
  848. if Pt.Y > I - SBSIZE then Button := sbDown else
  849. begin
  850. I1 := SBSIZE + 1;
  851. if CnGetScrollInfo(Self, I, I1, I2, Kind) and (Pt.Y > I1) and
  852. (Pt.Y < I1 + I2) then
  853. Button := sbButton;
  854. end;
  855. end else
  856. if (Pt.Y > Height - SBSIZE - 1) and (ScrollBars <> ssVertical) then
  857. begin
  858. Kind := sbHorizontal;
  859. I := Width - 2;
  860. if ScrollBars = ssBoth then Dec(I, SBSIZE);
  861. if FDownButton = sbButtonH then
  862. begin
  863. Count := CnGetScrollCount(Self, sbButton, I, Pt.X, Kind);
  864. if Count <> 0 then
  865. begin
  866. Pos := GetScrollPos(Handle, 0);
  867. if Count > 0 then
  868. begin
  869. ScrollMemo(Self, 1, Kind);
  870. CharWidth := GetScrollPos(Handle, Ord(Kind)) - Pos;
  871. Dec(Count, CharWidth);
  872. end else
  873. begin
  874. ScrollMemo(Self, -1, Kind);
  875. CharWidth := Pos - GetScrollPos(Handle, Ord(Kind));
  876. Inc(Count, CharWidth);
  877. end;
  878. ScrollMemo(Self, Count div CharWidth, Kind);
  879. end;
  880. end else
  881. if Pt.X < SBSIZE + 1 then Button := sbLeft else
  882. if Pt.X > I - SBSIZE then Button := sbRight else
  883. begin
  884. I1 := SBSIZE + 1;
  885. if CnGetScrollInfo(Self, I, I1, I2, Kind) and (Pt.X > I1) and
  886. (Pt.X < I1 + I2) then Button := sbButtonH;
  887. end;
  888. end else
  889. Exit;
  890. Message.Result := HTBORDER;
  891. if Button <> FOverButton then
  892. begin
  893. FOverButton := Button;
  894. DrawMemo(Self, FOverButton, FDownButton);
  895. end;
  896. end;
  897. procedure TCnSkinMemo.WMNCPaint(var Message: TMessage);
  898. begin
  899. if CnSkinThemes.Active then
  900. DrawMemo(Self, FOverButton, FDownButton) else inherited;
  901. end;
  902. procedure TCnSkinMemo.WMPaint(var Message: TWMPaint);
  903. begin
  904. inherited;
  905. if CnSkinThemes.Active then
  906. DrawMemo(Self, FOverButton, FDownButton);
  907. end;
  908. procedure TCnSkinMemo.WMTimer(var Message: TWMTimer);
  909. var
  910. Kind: TScrollBarKind;
  911. Count: Integer;
  912. begin
  913. if FDownButton in [sbUp, sbDown] then
  914. Kind := sbVertical else Kind := sbHorizontal;
  915. Count := CnGetScrollCount(Self, FDownButton, -1, -1, Kind);
  916. if (FDownButton <> sbNone) and (Count <> 0) then
  917. ScrollMemo(Self, Count, Kind) else
  918. KillTimer(Handle, Message.TimerID);
  919. end;
  920. {TCnSkinCombo}
  921. constructor TCnSkinComboBox.Create(AOwner: TComponent);
  922. begin
  923. inherited Create(AOwner);
  924. CnSkinThemes.Controls.Add(Self);
  925. end;
  926. destructor TCnSkinComboBox.Destroy;
  927. begin
  928. CnSkinThemes.Controls.Remove(Self);
  929. inherited Destroy;
  930. end;
  931. procedure TCnSkinComboBox.CreateParams(var Params: TCreateParams);
  932. begin
  933. inherited CreateParams(Params);
  934. end;
  935. procedure TCnSkinComboBox.SetButtonState(Value: TButtonState);
  936. begin
  937. if (Value = bsOver) and (FButtonState = bsDown) and (GetKeyState(VK_LBUTTON) < 0) then Exit;
  938. if (Value <> FButtonState) then
  939. begin
  940. FButtonState := Value;
  941. Repaint;
  942. end;
  943. end;
  944. procedure TCnSkinComboBox.CMThemeChange(var Message: TMessage);
  945. begin
  946. Repaint;
  947. end;
  948. procedure TCnSkinComboBox.CMEnabledChanged(var Message: TMessage);
  949. begin
  950. inherited;
  951. Repaint;
  952. end;
  953. procedure TCnSkinComboBox.CMMouseLeave(var Message: TMessage);
  954. begin
  955. SetButtonState(bsDefault);
  956. end;
  957. procedure TCnSkinComboBox.WMPaint(var Message: TWMPaint);
  958. begin
  959. inherited;
  960. if CnSkinThemes.Active then
  961. if Enabled then
  962. DrawCombo(Self, FButtonState) else
  963. DrawCombo(Self, bsDisabled);
  964. end;
  965. procedure TCnSkinComboBox.MouseDown(Button: TMouseButton; Shift: TShiftState;
  966. X, Y: Integer);
  967. begin
  968. if (Button = mbLeft) and (FButtonState <> bsDefault) then
  969. SetButtonState(bsDown);
  970. inherited MouseDown(Button, Shift, X, Y);
  971. end;
  972. procedure TCnSkinComboBox.MouseMove(Shift: TShiftState; X, Y: Integer);
  973. begin
  974. if (X > Width - GetSystemMetrics(SM_CXHTHUMB) -4) and (X < Width -2) then
  975. SetButtonState(bsOver) else SetButtonState(bsDefault);
  976. inherited MouseMove(Shift, X, Y);
  977. end;
  978. procedure TCnSkinComboBox.MouseUp(Button: TMouseButton; Shift: TShiftState;
  979. X, Y: Integer);
  980. begin
  981. if (Button = mbLeft) and (FButtonState <> bsDefault) then
  982. SetButtonState(bsOver);
  983. inherited MouseUp(Button, Shift, X, Y);
  984. end;
  985. {TCnSkinButton}
  986. constructor TCnSkinButton.Create(AOwner: TComponent);
  987. begin
  988. inherited Create(AOwner);
  989. CnSkinThemes.Controls.Add(Self);
  990. end;
  991. destructor TCnSkinButton.Destroy;
  992. begin
  993. CnSkinThemes.Controls.Remove(Self);
  994. inherited Destroy;
  995. end;
  996. procedure TCnSkinButton.CreateParams(var Params: TCreateParams);
  997. begin
  998. inherited CreateParams(Params);
  999. end;
  1000. procedure TCnSkinButton.SetButtonState(Value: TButtonState);
  1001. begin
  1002. if (Value = bsOver) and (FButtonState = bsDown) and (GetKeyState(VK_LBUTTON) < 0) then Exit;
  1003. if (Value <> FButtonState) then
  1004. begin
  1005. FButtonState := Value;
  1006. Repaint;
  1007. end;
  1008. end;
  1009. procedure TCnSkinButton.CMThemeChange(var Message: TMessage);
  1010. begin
  1011. Repaint;
  1012. end;
  1013. procedure TCnSkinButton.CMMouseEnter(var Message: TMessage);
  1014. begin
  1015. SetButtonState(bsOver);
  1016. end;
  1017. procedure TCnSkinButton.CMMouseLeave(var Message: TMessage);
  1018. begin
  1019. SetButtonState(bsDefault);
  1020. end;
  1021. procedure TCnSkinButton.WMPaint(var Message: TWMPaint);
  1022. begin
  1023. inherited;
  1024. if CnSkinThemes.Active then
  1025. if Enabled then
  1026. DrawButton(Self, FButtonState) else
  1027. DrawButton(Self, bsDisabled);
  1028. end;
  1029. procedure TCnSkinButton.MouseDown(Button: TMouseButton; Shift: TShiftState;
  1030. X, Y: Integer);
  1031. begin
  1032. if Button = mbLeft then SetButtonState(bsDown);
  1033. inherited MouseDown(Button, Shift, X, Y);
  1034. end;
  1035. procedure TCnSkinButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
  1036. X, Y: Integer);
  1037. begin
  1038. if (Button = mbLeft) and (FButtonState <> bsDefault) then
  1039. SetButtonState(bsOver);
  1040. inherited MouseUp(Button, Shift, X, Y);
  1041. end;
  1042. {TCnSkinCheck}
  1043. constructor TCnSkinCheckBox.Create(AOwner: TComponent);
  1044. begin
  1045. inherited Create(AOwner);
  1046. CnSkinThemes.Controls.Add(Self);
  1047. end;
  1048. destructor TCnSkinCheckBox.Destroy;
  1049. begin
  1050. CnSkinThemes.Controls.Remove(Self);
  1051. inherited Destroy;
  1052. end;
  1053. procedure TCnSkinCheckBox.CreateParams(var Params: TCreateParams);
  1054. begin
  1055. inherited CreateParams(Params);
  1056. end;
  1057. procedure TCnSkinCheckBox.SetButtonState(Value: TButtonState);
  1058. begin
  1059. if (Value = bsOver) and (FButtonState = bsDown) and (GetKeyState(VK_LBUTTON) < 0) then Exit;
  1060. if (Value <> FButtonState) then
  1061. begin
  1062. FButtonState := Value;
  1063. Repaint;
  1064. end;
  1065. end;
  1066. procedure TCnSkinCheckBox.CMThemeChange(var Message: TMessage);
  1067. begin
  1068. Repaint;
  1069. end;
  1070. procedure TCnSkinCheckBox.CMEnabledChanged(var Message: TMessage);
  1071. begin
  1072. inherited;
  1073. Repaint;
  1074. end;
  1075. procedure TCnSkinCheckBox.CMMouseEnter(var Message: TMessage);
  1076. begin
  1077. SetButtonState(bsOver);
  1078. end;
  1079. procedure TCnSkinCheckBox.CMMouseLeave(var Message: TMessage);
  1080. begin
  1081. SetButtonState(bsDefault);
  1082. end;
  1083. procedure TCnSkinCheckBox.WMPaint(var Message: TWMPaint);
  1084. begin
  1085. inherited;
  1086. if CnSkinThemes.Active then
  1087. if Enabled then
  1088. DrawCheckBox(Self, FButtonState) else
  1089. DrawCheckBox(Self, bsDisabled);
  1090. end;
  1091. procedure TCnSkinCheckBox.MouseDown(Button: TMouseButton; Shift: TShiftState;
  1092. X, Y: Integer);
  1093. begin
  1094. if Button = mbLeft then SetButtonState(bsDown);
  1095. inherited MouseDown(Button, Shift, X, Y);
  1096. end;
  1097. procedure TCnSkinCheckBox.MouseUp(Button: TMouseButton; Shift: TShiftState;
  1098. X, Y: Integer);
  1099. begin
  1100. if (Button = mbLeft) and (FButtonState <> bsDefault) then
  1101. SetButtonState(bsOver);
  1102. inherited MouseUp(Button, Shift, X, Y);
  1103. end;
  1104. {TCnSkinRadio}
  1105. constructor TCnSkinRadioButton.Create(AOwner: TComponent);
  1106. begin
  1107. inherited Create(AOwner);
  1108. CnSkinThemes.Controls.Add(Self);
  1109. end;
  1110. destructor TCnSkinRadioButton.Destroy;
  1111. begin
  1112. CnSkinThemes.Controls.Remove(Self);
  1113. inherited Destroy;
  1114. end;
  1115. procedure TCnSkinRadioButton.CreateParams(var Params: TCreateParams);
  1116. begin
  1117. inherited CreateParams(Params);
  1118. end;
  1119. procedure TCnSkinRadioButton.SetButtonState(Value: TButtonState);
  1120. begin
  1121. if (Value = bsOver) and (FButtonState = bsDown) and (GetKeyState(VK_LBUTTON) < 0) then Exit;
  1122. if (Value <> FButtonState) then
  1123. begin
  1124. FButtonState := Value;
  1125. Repaint;
  1126. end;
  1127. end;
  1128. procedure TCnSkinRadioButton.CMThemeChange(var Message: TMessage);
  1129. begin
  1130. Repaint;
  1131. end;
  1132. procedure TCnSkinRadioButton.CMEnabledChanged(var Message: TMessage);
  1133. begin
  1134. inherited;
  1135. Repaint;
  1136. end;
  1137. procedure TCnSkinRadioButton.CMMouseEnter(var Message: TMessage);
  1138. begin
  1139. SetButtonState(bsOver);
  1140. end;
  1141. procedure TCnSkinRadioButton.CMMouseLeave(var Message: TMessage);
  1142. begin
  1143. SetButtonState(bsDefault);
  1144. end;
  1145. procedure TCnSkinRadioButton.WMPaint(var Message: TWMPaint);
  1146. begin
  1147. inherited;
  1148. if CnSkinThemes.Active then
  1149. if Enabled then
  1150. DrawRadio(Self, FButtonState) else
  1151. DrawRadio(Self, bsDisabled);
  1152. end;
  1153. procedure TCnSkinRadioButton.MouseDown(Button: TMouseButton; Shift: TShiftState;
  1154. X, Y: Integer);
  1155. begin
  1156. if Button = mbLeft then SetButtonState(bsDown);
  1157. inherited MouseDown(Button, Shift, X, Y);
  1158. end;
  1159. procedure TCnSkinRadioButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
  1160. X, Y: Integer);
  1161. var
  1162. I: Integer;
  1163. begin
  1164. if (Button = mbLeft) and (FButtonState <> bsDefault) then
  1165. begin
  1166. SetButtonState(bsOver);
  1167. for I := 0 to Parent.ControlCount - 1 do
  1168. if Parent.Controls[I] is TCnSkinRadioButton then
  1169. Parent.Controls[I].Repaint;
  1170. end;
  1171. inherited MouseUp(Button, Shift, X, Y);
  1172. end;
  1173. {TCnSkinListBox}
  1174. constructor TCnSkinListBox.Create(AOwner: TComponent);
  1175. begin
  1176. inherited Create(AOwner);
  1177. CnSkinThemes.Controls.Add(Self);
  1178. FOverButton := sbNone;
  1179. FDownButton := sbNone;
  1180. FScrollBarVisible := False;
  1181. end;
  1182. destructor TCnSkinListBox.Destroy;
  1183. begin
  1184. CnSkinThemes.Controls.Remove(Self);
  1185. inherited Destroy;
  1186. end;
  1187. procedure TCnSkinListBox.CreateParams(var Params: TCreateParams);
  1188. begin
  1189. inherited CreateParams(Params);
  1190. end;
  1191. procedure TCnSkinListBox.CMThemeChange(var Message: TMessage);
  1192. begin
  1193. RecreateWnd;
  1194. end;
  1195. procedure TCnSkinListBox.CMMouseLeave(var Message: TMessage);
  1196. begin
  1197. if FOverButton <> sbNone then
  1198. begin
  1199. FOverButton := sbNone;
  1200. FDownButton := sbNone;
  1201. DrawListBox(Self, FOverButton, FDownButton);
  1202. end;
  1203. end;
  1204. procedure TCnSkinListBox.WMNCCalcSize(var Message: TWMNCCalcSize);
  1205. begin
  1206. if CnSkinThemes.Active then
  1207. begin
  1208. with Message.CalcSize_Params^ do
  1209. begin
  1210. Inc(rgrc[0].Left);
  1211. Inc(rgrc[0].Top);
  1212. Dec(rgrc[0].Right);
  1213. if FScrollBarVisible then Dec(rgrc[0].Right, SBSIZE);
  1214. Dec(rgrc[0].Bottom)
  1215. end;
  1216. end else inherited;
  1217. end;
  1218. procedure TCnSkinListBox.WMNCLButtonDown(var Message: TWMNCLButtonDown);
  1219. var
  1220. Pt: TPoint;
  1221. Count: Integer;
  1222. begin
  1223. inherited;
  1224. if FScrollBarVisible then
  1225. begin
  1226. FDownButton := FOverButton;
  1227. if FDownButton <> sbButton then
  1228. begin
  1229. Pt := ScreenToClient(Point(Message.XCursor, Message.YCursor));
  1230. Count := CnGetScrollCount(Self, FDownButton, Height - 2, Pt.Y, sbVertical);
  1231. if Count <> 0 then
  1232. begin
  1233. TopIndex := TopIndex + Count;
  1234. SetTimer(Handle, 1000, 100, nil);
  1235. end else
  1236. DrawListBox(Self, FOverButton, FDownButton);
  1237. end else
  1238. DrawListBox(Self, FOverButton, FDownButton);
  1239. end;
  1240. end;
  1241. procedure TCnSkinListBox.WMNCLButtonUp(var Message: TWMNCLButtonUp);
  1242. begin
  1243. inherited;
  1244. if FScrollBarVisible and (FDownButton <> sbNone) then
  1245. begin
  1246. FDownButton := sbNone;
  1247. DrawListBox(Self, FOverButton, FDownButton);
  1248. end;
  1249. end;
  1250. procedure TCnSkinListBox.WMNCHittest(var Message: TWMNCHittest);
  1251. var
  1252. Pt: TPoint;
  1253. Button: TScrollBarButton;
  1254. Count, I1, I2: Integer;
  1255. begin
  1256. inherited;
  1257. if not FScrollBarVisible then Exit;
  1258. Pt := ScreenToClient(Point(Message.XPos, Message.YPos));
  1259. if Pt.X > Width - SBSIZE - 1 then
  1260. begin
  1261. Message.Result := HTBORDER;
  1262. if FDownButton = sbButton then
  1263. begin
  1264. Count := CnGetScrollCount(Self, FDownButton, Height - 2, Pt.Y, sbVertical);
  1265. if Count <> 0 then
  1266. TopIndex := TopIndex + Count;
  1267. end else
  1268. begin
  1269. Button := sbNone;
  1270. if Pt.Y < SBSIZE + 1 then Button := sbUp else
  1271. if Pt.Y > Height - SBSIZE - 1 then Button := sbDown else
  1272. begin
  1273. I1 := SBSIZE + 1;
  1274. if CnGetScrollInfo(Self, Height - 2, I1, I2, sbVertical) and
  1275. (Pt.Y > I1) and (Pt.Y < I1 + I2) then Button := sbButton;
  1276. end;
  1277. if Button <> FOverButton then
  1278. begin
  1279. FOverButton := Button;
  1280. DrawListBox(Self, FOverButton, FDownButton);
  1281. end;
  1282. end;
  1283. end;
  1284. end;
  1285. procedure TCnSkinListBox.WMNCPaint(var Message: TMessage);
  1286. begin
  1287. if CnSkinThemes.Active then
  1288. DrawListBox(Self, FoverButton, FDownButton) else
  1289. inherited;
  1290. end;
  1291. procedure TCnSkinListBox.WMPaint(var Message: TWMPaint);
  1292. var
  1293. SV: Boolean;
  1294. begin
  1295. inherited;
  1296. if CnSkinThemes.Active then
  1297. begin
  1298. SV := Items.Count > ClientHeight div ItemHeight;
  1299. if SV <> FScrollBarVisible then
  1300. begin
  1301. FScrollBarVisible := SV;
  1302. RecreateWnd;
  1303. end;
  1304. if SV then DrawListBox(Self, FDownButton, FOverButton);
  1305. end;
  1306. end;
  1307. procedure TCnSkinListBox.WMTimer(var Message: TWMTimer);
  1308. var
  1309. Count: Integer;
  1310. begin
  1311. Count := CnGetScrollCount(Self, FDownButton, -1, -1, sbVertical);
  1312. if (FDownButton <> sbNone) and (Count <> 0) then
  1313. TopIndex := TopIndex + Count else
  1314. KillTimer(Handle, Message.TimerID);
  1315. end;
  1316. {TCnSkinScrollBar}
  1317. constructor TCnSkinScrollBar.Create(AOwner: TComponent);
  1318. begin
  1319. inherited Create(AOwner);
  1320. CnSkinThemes.Controls.Add(Self);
  1321. FOverButton := sbNone;
  1322. FDownButton := sbNone;
  1323. end;
  1324. destructor TCnSkinScrollBar.Destroy;
  1325. begin
  1326. CnSkinThemes.Controls.Remove(Self);
  1327. inherited Destroy;
  1328. end;
  1329. procedure TCnSkinScrollBar.CreateParams(var Params: TCreateParams);
  1330. begin
  1331. inherited CreateParams(Params);
  1332. end;
  1333. procedure TCnSkinScrollBar.Change;
  1334. begin
  1335. inherited;
  1336. DrawScrollBar(Self, FOverButton, FDownButton);
  1337. end;
  1338. procedure TCnSkinScrollBar.CMThemeChange(var Message: TMessage);
  1339. begin
  1340. RecreateWnd;
  1341. end;
  1342. procedure TCnSkinScrollBar.CMEnabledChanged(var Message: TMessage);
  1343. begin
  1344. inherited;
  1345. DrawScrollBar(Self, FOverButton, FDownButton);
  1346. end;
  1347. procedure TCnSkinScrollBar.CMMouseLeave(var Message: TMessage);
  1348. begin
  1349. if FOverButton <> sbNone then
  1350. begin
  1351. FOverButton := sbNone;
  1352. DrawScrollBar(Self, FOverButton, FDownButton);
  1353. end;
  1354. end;
  1355. procedure TCnSkinScrollBar.WMNCCalcSize(var Message: TWMNCCalcSize);
  1356. begin
  1357. if CnSkinThemes.Active then
  1358. begin
  1359. with Message.CalcSize_Params^ do
  1360. begin
  1361. Inc(rgrc[0].Top, Height);
  1362. Inc(rgrc[0].Left, Width);
  1363. end;
  1364. end else inherited;
  1365. end;
  1366. procedure TCnSkinScrollBar.WMNCLButtonDown(var Message: TWMNCLButtonDown);
  1367. var
  1368. Pt: TPoint;
  1369. begin
  1370. inherited;
  1371. if CnSkinThemes.Active then
  1372. begin
  1373. FDownButton := FOverButton;
  1374. case FDownButton of
  1375. sbUp, sbLeft:
  1376. if Position > Min then
  1377. begin
  1378. Position := Position - 1;
  1379. SetTimer(Handle, 1000, 100, nil);
  1380. end else
  1381. DrawScrollBar(Self, FOverButton, FDownButton);
  1382. sbDown, sbRight:
  1383. if Position < Max then
  1384. begin
  1385. Position := Position + 1;
  1386. SetTimer(Handle, 1000, 100, nil);
  1387. end else
  1388. DrawScrollBar(Self, FOverButton, FDownButton);
  1389. sbNone:
  1390. begin
  1391. Pt := Parent.ScreenToClient(Point(Message.XCursor, Message.YCursor));
  1392. if Kind = sbHorizontal then
  1393. Position := (Pt.X - Left - Height) * Max div (Width - Height - Height)
  1394. else
  1395. Position := (Pt.Y - Top - Width) * Max div (Height - Width - Width);
  1396. end;
  1397. else
  1398. DrawScrollBar(Self, FOverButton, FDownButton);
  1399. end;
  1400. end;
  1401. end;
  1402. procedure TCnSkinScrollBar.WMNCLButtonUp(var Message: TWMNCLButtonUp);
  1403. begin
  1404. inherited;
  1405. if FDownButton <> sbNone then
  1406. begin
  1407. FDownButton := sbNone;
  1408. DrawScrollBar(Self, FOverButton, FDownButton);
  1409. end;
  1410. end;
  1411. procedure TCnSkinScrollBar.WMNCHittest(var Message: TWMNCHittest);
  1412. var
  1413. Pt: TPoint;
  1414. Button: TScrollBarButton;
  1415. I, I1, I2: Integer;
  1416. begin
  1417. inherited;
  1418. if CnSkinThemes.Active then
  1419. begin
  1420. Pt := Parent.ScreenToClient(Point(Message.XPos, Message.YPos));
  1421. Button := sbNone;
  1422. if Kind = sbHorizontal then
  1423. begin
  1424. Dec(Pt.X, Left);
  1425. if FDownButton = sbButton then
  1426. Position := (Pt.X - Height) * Max div (Width - Height - Height) else
  1427. if Pt.X < Height then Button := sbLeft else
  1428. if Pt.X > Width - Height then Button := sbRight else
  1429. begin
  1430. I := Width - Height - Height;
  1431. if PageSize > 0 then
  1432. begin
  1433. I2 := I * PageSize div Max;
  1434. if I2 < 10 then I2 := 10;
  1435. end else
  1436. I2 := Height;
  1437. I1 := (I - I2) * Position div Max + Height;
  1438. if (Pt.X > I1) and (Pt.X < I1 + I2) then
  1439. Button := sbButton;
  1440. end;
  1441. end else
  1442. begin
  1443. Dec(Pt.Y, Top);
  1444. if FDownButton = sbButton then
  1445. Position := (Pt.Y - Width) * Max div (Height - Width - Width) else
  1446. if Pt.Y < Width then Button := sbUp else
  1447. if Pt.Y > Height - Width then Button := sbDown else
  1448. begin
  1449. I := Height - Width - Width;
  1450. if PageSize > 0 then
  1451. begin
  1452. I2 := I * PageSize div Max;
  1453. if I2 < 10 then I2 := 10;
  1454. end else
  1455. I2 := Width;
  1456. I1 := (I - I2) * Position div Max + Width;
  1457. if (Pt.Y > I1) and (Pt.Y < I1 + I2) then
  1458. Button := sbButton;
  1459. end;
  1460. end;
  1461. if Button <> FOverButton then
  1462. begin
  1463. FOverButton := Button;
  1464. DrawScrollBar(Self, FOverButton, FDownButton);
  1465. end;
  1466. Message.Result := HTBORDER;
  1467. end;
  1468. end;
  1469. procedure TCnSkinScrollBar.WMNCPaint(var Message: TMessage);
  1470. begin
  1471. if CnSkinThemes.Active then
  1472. DrawScrollBar(Self, FOverButton, FDownButton) else inherited;
  1473. end;
  1474. procedure TCnSkinScrollBar.WMTimer(var Message: TWMTimer);
  1475. begin
  1476. case FDownButton of
  1477. sbUp, sbLeft:
  1478. if Position > Min then Position := Position - 1 else
  1479. KillTimer(Handle, Message.TimerID);
  1480. sbDown, sbRight:
  1481. if Position < Max then Position := Position + 1 else
  1482. KillTimer(Handle, Message.TimerID);
  1483. else
  1484. KillTimer(Handle, Message.TimerID);
  1485. end;
  1486. end;
  1487. {TCnSkinStatic}
  1488. constructor TCnSkinStaticText.Create(AOwner: TComponent);
  1489. begin
  1490. inherited Create(AOwner);
  1491. CnSkinThemes.Controls.Add(Self);
  1492. FHotColor := clBlue;
  1493. end;
  1494. destructor TCnSkinStaticText.Destroy;
  1495. begin
  1496. CnSkinThemes.Controls.Remove(Self);
  1497. inherited Destroy;
  1498. end;
  1499. procedure TCnSkinStaticText.SetUnderline(Value: TUnderline);
  1500. begin
  1501. if Value <> FUnderline then
  1502. begin
  1503. FUnderline := Value;
  1504. Repaint;
  1505. end;
  1506. end;
  1507. procedure TCnSkinStaticText.CMThemeChange(var Message: TMessage);
  1508. begin
  1509. Repaint;
  1510. end;
  1511. procedure TCnSkinStaticText.CMMouseEnter(var Message: TMessage);
  1512. begin
  1513. inherited;
  1514. if not (csDesigning in ComponentState) then
  1515. begin
  1516. FHot := True;
  1517. Repaint;
  1518. end;
  1519. end;
  1520. procedure TCnSkinStaticText.CMMouseLeave(var Message: TMessage);
  1521. begin
  1522. inherited;
  1523. if not (csDesigning in ComponentState) then
  1524. begin
  1525. FHot := False;
  1526. Repaint;
  1527. end;
  1528. end;
  1529. procedure TCnSkinStaticText.WMPaint(var Message: TWMPaint);
  1530. const
  1531. Flags: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
  1532. var
  1533. X, W: Integer;
  1534. Canvas: TControlCanvas;
  1535. R: TRect;
  1536. begin
  1537. inherited;
  1538. Canvas := TControlCanvas.Create;
  1539. Canvas.Control := Self;
  1540. try
  1541. Canvas.Font := Font;
  1542. Canvas.Brush.Style := bsClear;
  1543. if FHot then Canvas.Font.Color := FHotColor;
  1544. R := ClientRect;
  1545. DrawText(Canvas.Handle, PChar(Caption), -1, R, Flags[Alignment]);
  1546. if (FUnderline = ulAlways) or ((FUnderline = ulHot) and FHot) then
  1547. begin
  1548. X := 0;
  1549. W := Canvas.TextWidth(Caption);
  1550. case Alignment of
  1551. taCenter: X := (Width - W) div 2;
  1552. taRightJustify: X := Width - W;
  1553. end;
  1554. Canvas.Pen.Color := Canvas.Font.Color;
  1555. Canvas.MoveTo(X, Height - 1);
  1556. Canvas.LineTo(X + W, Height - 1);
  1557. end;
  1558. finally
  1559. Canvas.Free;
  1560. end;
  1561. end;
  1562. end.