CnSkinForm.pas 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  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 CnSkinForm;
  21. interface
  22. uses
  23. Windows, Messages, Classes, Controls, SysUtils, Graphics, Forms, ExtCtrls;
  24. const
  25. CN_MSG_NCREPAINT = CM_BASE + $0110;
  26. type
  27. TWindowButton = (wbNone, wbClose, wbMaximized, wbMinimized);
  28. TCnSkinForm = class(TComponent)
  29. private
  30. FForm: TForm;
  31. FDownButton: TWindowButton;
  32. FOverButton: TWindowButton;
  33. FSaveWndProc: TWndMethod;
  34. FTimer: TTimer;
  35. procedure NcPaint(Active: Boolean);
  36. procedure SetOverButton(Value: TWindowButton);
  37. procedure CheckOverButton(Sender: TObject);
  38. protected
  39. procedure ThemeChange;
  40. procedure NewWndProc(var Message: TMessage);
  41. public
  42. constructor Create(AOwner: TComponent); override;
  43. destructor Destroy; override;
  44. end;
  45. implementation
  46. uses
  47. CnSkinTheme;
  48. const
  49. HTOVERBUTTON = HTHELP + 100;
  50. TransparentColor = clFuchsia;
  51. var
  52. CnSkinForms: TList;
  53. constructor TCnSkinForm.Create(AOwner: TComponent);
  54. begin
  55. inherited Create(AOwner);
  56. FForm := AOwner as TForm;
  57. FSaveWndProc := FForm.WindowProc;
  58. FForm.WindowProc := NewWndProc;
  59. FTimer := TTimer.Create(Self);
  60. FTimer.Enabled := False;
  61. FTimer.Interval := 333;
  62. FTimer.OnTimer := CheckOverButton;
  63. CnSkinForms.Add(Self);
  64. end;
  65. destructor TCnSkinForm.Destroy;
  66. begin
  67. FTimer.Free;
  68. CnSkinForms.Remove(Self);
  69. inherited Destroy;
  70. end;
  71. procedure TCnSkinForm.SetOverButton(Value: TWindowButton);
  72. begin
  73. if Value <> FOverButton then
  74. begin
  75. FOverButton := Value;
  76. // FTimer.Enabled := FOverButton <> wbNone;
  77. NcPaint(FForm.Active);
  78. end;
  79. end;
  80. procedure TCnSkinForm.CheckOverButton(Sender: TObject);
  81. var
  82. I: Integer;
  83. Pt: TPoint;
  84. begin
  85. GetCursorPos(Pt);
  86. Dec(Pt.X, FForm.Left);
  87. Dec(Pt.Y, FForm.Top);
  88. I := FForm.Width - CnSkinThemes.CurrentSkin.ButtonRight - CnSkinThemes.CurrentSkin.ButtonSize;
  89. if FForm.BorderStyle <> bsDialog then
  90. begin
  91. if biMaximize in FForm.BorderIcons then
  92. Dec(I, CnSkinThemes.CurrentSkin.ButtonSize);
  93. if biMinimize in FForm.BorderIcons then
  94. Dec(I, CnSkinThemes.CurrentSkin.ButtonSize);
  95. end;
  96. if not PtInRect(Rect(I, CnSkinThemes.CurrentSkin.ButtonTop,
  97. FForm.Width - CnSkinThemes.CurrentSkin.ButtonRight,
  98. CnSkinThemes.CurrentSkin.ButtonTop +
  99. CnSkinThemes.CurrentSkin.ButtonSize), Pt) then
  100. begin
  101. SetOverButton(wbNone);
  102. PostMessage(FForm.Handle, CN_MSG_NCREPAINT, 0, 0);
  103. end;
  104. end;
  105. procedure TCnSkinForm.NcPaint(Active: Boolean);
  106. var
  107. Canvas: TCanvas;
  108. R, SrcR, DestR: TRect;
  109. TB, LB, RB, BB: TBitmap;
  110. Flags: Longint;
  111. X, Y: Integer;
  112. Icon: TIcon;
  113. procedure BtnPaint(Btn: TWindowButton);
  114. begin
  115. Y := 0;
  116. if FOverButton = Btn then
  117. begin
  118. Inc(Y, CnSkinThemes.CurrentSkin.ButtonSize);
  119. if FDownButton = Btn then Inc(Y, CnSkinThemes.CurrentSkin.ButtonSize);
  120. end else
  121. if not Active then
  122. Inc(Y, CnSkinThemes.CurrentSkin.ButtonSize * 3);
  123. SrcR := Rect(X, Y, X + CnSkinThemes.CurrentSkin.ButtonSize,
  124. Y + CnSkinThemes.CurrentSkin.ButtonSize);
  125. OffsetRect(DestR, - CnSkinThemes.CurrentSkin.ButtonSize, 0);
  126. TB.Canvas.BrushCopy(DestR, CnSkinThemes.CurrentSkin.WindowBtnBmp, SrcR, TransparentColor);
  127. end;
  128. begin
  129. TB := TBitmap.Create;
  130. TB.Width := FForm.Width;
  131. TB.Height := CnSkinThemes.CurrentSkin.CaptionHeight;
  132. LB := TBitmap.Create;
  133. LB.Width := CnSkinThemes.CurrentSkin.BorderSize;
  134. LB.Height := FForm.Height - CnSkinThemes.CurrentSkin.CaptionHeight - CnSkinThemes.CurrentSkin.BorderSize;
  135. RB := TBitmap.Create;
  136. RB.Width := CnSkinThemes.CurrentSkin.BorderSize;
  137. RB.Height := LB.Height;
  138. BB := TBitmap.Create;
  139. BB.Width := FForm.Width;
  140. BB.Height := CnSkinThemes.CurrentSkin.BorderSize;
  141. Icon := nil;
  142. Canvas := TCanvas.Create;
  143. try
  144. R := Rect(0, 0, CnSkinThemes.CurrentSkin.WindowBmp.Width, CnSkinThemes.CurrentSkin.WindowBmp.Height div 2);
  145. if not Active then
  146. OffsetRect(R, 0, R.Bottom);
  147. TB.Canvas.Brush.Style := bsClear;
  148. SrcR := Rect(R.Left, R.Top, R.Left + CnSkinThemes.CurrentSkin.CaptionHeight, R.Top + CnSkinThemes.CurrentSkin.CaptionHeight);
  149. DestR := Rect(0, 0, CnSkinThemes.CurrentSkin.CaptionHeight, TB.Height);
  150. TB.Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.WindowBmp.Canvas, SrcR);
  151. OffsetRect(SrcR, R.Right - R.Left - CnSkinThemes.CurrentSkin.CaptionHeight, 0);
  152. OffsetRect(DestR, TB.Width - CnSkinThemes.CurrentSkin.CaptionHeight, 0);
  153. TB.Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.WindowBmp.Canvas, SrcR);
  154. SrcR.Right := Srcr.Left;
  155. SrcR.Left := R.Left + CnSkinThemes.CurrentSkin.CaptionHeight;
  156. DestR.Right := DestR.Left;
  157. DestR.Left := CnSkinThemes.CurrentSkin.CaptionHeight;
  158. TB.Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.WindowBmp.Canvas, SrcR);
  159. DestR := Rect(0, 0, CnSkinThemes.CurrentSkin.ButtonSize, CnSkinThemes.CurrentSkin.ButtonSize);
  160. OffsetRect(DestR, TB.Width - CnSkinThemes.CurrentSkin.ButtonRight, CnSkinThemes.CurrentSkin.ButtonTop);
  161. X := 0;
  162. BtnPaint(wbClose);
  163. if FForm.BorderStyle <> bsDialog then
  164. begin
  165. Inc(X, CnSkinThemes.CurrentSkin.ButtonSize);
  166. if biMaximize in FForm.BorderIcons then
  167. begin
  168. if FForm.WindowState = wsNormal then
  169. Inc(X, CnSkinThemes.CurrentSkin.ButtonSize);
  170. BtnPaint(wbMaximized);
  171. if FForm.WindowState <> wsNormal then
  172. Inc(X, CnSkinThemes.CurrentSkin.ButtonSize);
  173. Inc(X, CnSkinThemes.CurrentSkin.ButtonSize);
  174. end
  175. else
  176. Inc(X, CnSkinThemes.CurrentSkin.ButtonSize * 2);
  177. if biMinimize in FForm.BorderIcons then
  178. BtnPaint(wbMinimized);
  179. end;
  180. Flags := DT_LEFT or DT_VCENTER or DT_SINGLELINE;
  181. DestR.Right := DestR.Left - CnSkinThemes.CurrentSkin.BorderSize;
  182. DestR.Left := CnSkinThemes.CurrentSkin.BorderSize + 2;
  183. if FForm.BorderStyle <> bsDialog then
  184. begin
  185. if not FForm.Icon.Empty then
  186. Icon := FForm.Icon else
  187. if FForm = Application.MainForm then
  188. Icon := Application.Icon;
  189. if Assigned(Icon) then
  190. begin
  191. DrawIconEx(TB.Canvas.Handle, DestR.Left,
  192. CnSkinThemes.CurrentSkin.ButtonTop + 2,
  193. Icon.Handle, 16, 16, 0, 0, DI_NORMAL or DT_VCENTER);
  194. Inc(DestR.Left, 18);
  195. end;
  196. end;
  197. TB.Canvas.Font := FForm.Font;
  198. TB.Canvas.Font.Size := 11;
  199. TB.Canvas.Font.Style := [fsBold];
  200. if Active then
  201. TB.Canvas.Font.Color := CnSkinThemes.CurrentSkin.ActiveCaptionColor
  202. else
  203. TB.Canvas.Font.Color := CnSkinThemes.CurrentSkin.InactiveCaptionColor;
  204. DrawText(TB.Canvas.Handle, PChar(FForm.Caption), -1, DestR, Flags);
  205. SrcR := Rect(R.Left, R.Top + CnSkinThemes.CurrentSkin.CaptionHeight, R.Left
  206. + CnSkinThemes.CurrentSkin.BorderSize, R.Bottom - CnSkinThemes.CurrentSkin.BorderSize);
  207. DestR := Rect(0, 0, LB.Width, LB.Height);
  208. LB.Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.WindowBmp.Canvas, SrcR);
  209. SrcR.Right := R.Right;
  210. SrcR.Left := R.Right - CnSkinThemes.CurrentSkin.BorderSize;
  211. RB.Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.WindowBmp.Canvas, SrcR);
  212. SrcR := Rect(R.Left, R.Bottom - CnSkinThemes.CurrentSkin.BorderSize, R.Left + CnSkinThemes.CurrentSkin.BorderSize, R.Bottom);
  213. DestR := Rect(0, 0, CnSkinThemes.CurrentSkin.BorderSize, BB.Height);
  214. BB.Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.WindowBmp.Canvas, SrcR);
  215. OffsetRect(SrcR, R.Right - R.Left - CnSkinThemes.CurrentSkin.BorderSize, 0);
  216. OffsetRect(DestR, BB.Width - CnSkinThemes.CurrentSkin.BorderSize, 0);
  217. BB.Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.WindowBmp.Canvas, SrcR);
  218. SrcR.Right := SrcR.Left;
  219. SrcR.Left := R.Left + CnSkinThemes.CurrentSkin.BorderSize;
  220. DestR.Right := DestR.Left;
  221. DestR.Left := CnSkinThemes.CurrentSkin.BorderSize;
  222. BB.Canvas.CopyRect(DestR, CnSkinThemes.CurrentSkin.WindowBmp.Canvas, SrcR);
  223. Canvas.Handle := GetWindowDC(FForm.Handle);
  224. try
  225. ExcludeClipRect(Canvas.Handle, CnSkinThemes.CurrentSkin.BorderSize, CnSkinThemes.CurrentSkin.CaptionHeight,
  226. FForm.Width - CnSkinThemes.CurrentSkin.BorderSize, FForm.Height - CnSkinThemes.CurrentSkin.BorderSize);
  227. R := Rect(0, 0, TB.Width, TB.Height);
  228. Canvas.CopyRect(R, TB.Canvas, R);
  229. SrcR := Rect(0, 0, LB.Width, LB.Height);
  230. DestR := SrcR;
  231. OffsetRect(DestR, 0, CnSkinThemes.CurrentSkin.CaptionHeight);
  232. Canvas.CopyRect(DestR, LB.Canvas, SrcR);
  233. OffsetRect(DestR, FForm.Width - CnSkinThemes.CurrentSkin.BorderSize, 0);
  234. Canvas.CopyRect(DestR, RB.Canvas, SrcR);
  235. SrcR := Rect(0, 0, BB.Width, BB.Height);
  236. DestR := SrcR;
  237. OffsetRect(DestR, 0, FForm.Height - CnSkinThemes.CurrentSkin.BorderSize);
  238. Canvas.CopyRect(DestR, BB.Canvas, SrcR);
  239. finally
  240. ReleaseDC(FForm.Handle, Canvas.Handle);
  241. end;
  242. finally
  243. TB.Free;
  244. LB.Free;
  245. RB.Free;
  246. BB.Free;
  247. Canvas.Free;
  248. end;
  249. end;
  250. procedure TCnSkinForm.ThemeChange;
  251. var
  252. SaveCW, SaveCH: Integer;
  253. Flags: Longint;
  254. Rgn: HRGN;
  255. begin
  256. FForm.Color := CnSkinThemes.CurrentSkin.FaceColor;
  257. SaveCW := FForm.ClientWidth;
  258. SaveCH := FForm.ClientHeight;
  259. Flags := GetWindowLong(FForm.Handle, GWL_STYLE);
  260. if not CnSkinThemes.Active then
  261. SetWindowLong(FForm.Handle, GWL_STYLE, Flags or WS_CAPTION)
  262. else
  263. SetWindowLong(FForm.Handle, GWL_STYLE, Flags and not WS_CAPTION);
  264. FForm.ClientWidth := SaveCW;
  265. FForm.ClientHeight := SaveCH;
  266. if CnSkinThemes.CurrentSkin.RgnSize <> 0 then
  267. begin
  268. Rgn := CreateRoundRectRgn(0, 0, FForm.Width + 1, FForm.Height + CnSkinThemes.CurrentSkin.RgnSize,
  269. CnSkinThemes.CurrentSkin.RgnSize, CnSkinThemes.CurrentSkin.RgnSize);
  270. SetWindowRgn(FForm.Handle, Rgn, True);
  271. DeleteObject(Rgn);
  272. end
  273. else
  274. SetWindowRgn(FForm.Handle, 0, True);
  275. end;
  276. procedure TCnSkinForm.NewWndProc(var Message: TMessage);
  277. var
  278. Pt: TPoint;
  279. WP: PWindowPos;
  280. Btn: TWindowButton;
  281. Right, Bottom: Integer;
  282. Rgn: HRGN;
  283. begin
  284. if (not CnSkinThemes.Active) or (FForm.BorderStyle = bsNone) or
  285. (FForm.BorderStyle > bsDialog) then
  286. FSaveWndProc(Message)
  287. else
  288. case Message.Msg of
  289. WM_NCACTIVATE:
  290. begin
  291. Message.Result := 1;
  292. NcPaint(TWMNcActivate(Message).Active);
  293. end;
  294. WM_NCCALCSIZE:
  295. begin
  296. FSaveWndProc(Message);
  297. if Message.WParam <> 0 then
  298. begin
  299. WP := TWMNCCalcSize(Message).CalcSize_Params^.lppos;
  300. with TWMNCCalcSize(Message).CalcSize_Params^.rgrc[0] do
  301. begin
  302. Inc(Top, CnSkinThemes.CurrentSkin.CaptionHeight);
  303. Dec(Bottom, CnSkinThemes.CurrentSkin.BorderSize);
  304. Inc(Left, CnSkinThemes.CurrentSkin.BorderSize);
  305. Dec(Right, CnSkinThemes.CurrentSkin.BorderSize);
  306. end;
  307. TWMNCCalcSize(Message).CalcSize_Params^.rgrc[1] := TWMNCCalcSize(Message).CalcSize_Params^.rgrc[0];
  308. Message.Result := WVR_VALIDRECTS;
  309. end;
  310. end;
  311. WM_NCHITTEST:
  312. begin
  313. FSaveWndProc(Message);
  314. Btn := wbNone;
  315. with TWMNCHitTest(Message) do
  316. Pt := Point(XPos - FForm.Left, YPos - FForm.Top);
  317. // 判断是否落在系统图标内
  318. if FForm.BorderStyle <> bsDialog then
  319. begin
  320. if not FForm.Icon.Empty or ((FForm = Application.MainForm) and not Application.Icon.Empty) then
  321. begin
  322. if PtInRect(Rect(CnSkinThemes.CurrentSkin.BorderSize, CnSkinThemes.CurrentSkin.ButtonTop,
  323. CnSkinThemes.CurrentSkin.BorderSize + 2 + 16, CnSkinThemes.CurrentSkin.ButtonTop + 16), Pt) then
  324. begin
  325. Message.Result := HTSYSMENU;
  326. Exit;
  327. end;
  328. end;
  329. end;
  330. Right := FForm.Width - CnSkinThemes.CurrentSkin.ButtonRight;
  331. Bottom := CnSkinThemes.CurrentSkin.ButtonTop + CnSkinThemes.CurrentSkin.ButtonSize;
  332. if PtInRect(Rect(Right - CnSkinThemes.CurrentSkin.ButtonSize, CnSkinThemes.CurrentSkin.ButtonTop, Right, Bottom), Pt) then
  333. begin
  334. // 鼠标坐标在最右边的关闭按钮
  335. Btn := wbClose;
  336. Message.Result := HTCLOSE;
  337. end
  338. else
  339. if FForm.BorderStyle <> bsDialog then
  340. begin
  341. if biMaximize in FForm.BorderIcons then
  342. begin
  343. Dec(Right, CnSkinThemes.CurrentSkin.ButtonSize);
  344. if PtInRect(Rect(Right - CnSkinThemes.CurrentSkin.ButtonSize, CnSkinThemes.CurrentSkin.ButtonTop, Right, Bottom), Pt) then
  345. begin
  346. // 在最大化按钮区域内
  347. Btn := wbMaximized;
  348. Message.Result := HTMAXBUTTON;
  349. end;
  350. end;
  351. if biMinimize in FForm.BorderIcons then
  352. begin
  353. Dec(Right, CnSkinThemes.CurrentSkin.ButtonSize);
  354. if PtInRect(Rect(Right - CnSkinThemes.CurrentSkin.ButtonSize, CnSkinThemes.CurrentSkin.ButtonTop, Right, Bottom), Pt) then
  355. begin
  356. // 在最小化按钮区域内
  357. Btn := wbMinimized;
  358. Message.Result := HTMINBUTTON;
  359. end;
  360. end;
  361. end;
  362. SetOverButton(Btn);
  363. if PtInRect(Rect(CnSkinThemes.CurrentSkin.BorderSize, CnSkinThemes.CurrentSkin.BorderSize, Right - CnSkinThemes.CurrentSkin.ButtonSize, CnSkinThemes.CurrentSkin.CaptionHeight), Pt) then
  364. Message.Result := HTCAPTION;
  365. end;
  366. // 被WM_ENTERMENULOOP消息激活而通知重画的消息
  367. CN_MSG_NCREPAINT: NcPaint(FForm.Active);
  368. CM_TEXTCHANGED: NcPaint(FForm.Active);
  369. WM_NCPAINT: NcPaint(FForm.Active);
  370. WM_SETTEXT: NcPaint(FForm.Active);
  371. WM_NCMOUSEMOVE: CheckOverButton(Self);
  372. // 必须处理此消息并且送出重画消息来重画,否则标题栏上会出现原有按钮造成错乱
  373. WM_ENTERMENULOOP: PostMessage(FForm.Handle, CN_MSG_NCREPAINT, 0, 0);
  374. $00AE: Message.Result := 1;
  375. //WM_INITMENU: PostMessage(FForm.Handle, CN_MSG_NCREPAINT, 0, 0);
  376. WM_NCLBUTTONDOWN:
  377. begin
  378. if FOverButton <> wbNone then
  379. TWMNCHitMessage(Message).HitTest := HTOVERBUTTON;
  380. FSaveWndProc(Message);
  381. if FDownButton <> FOverButton then
  382. begin
  383. FDownButton := FOverButton;
  384. NcPaint(FForm.Active);
  385. end;
  386. end;
  387. WM_NCLBUTTONUP:
  388. begin
  389. if FDownButton <> wbNone then
  390. begin
  391. case FDownButton of
  392. wbClose: FForm.Close;
  393. wbMaximized:
  394. if FForm.WindowState <> wsNormal then
  395. FForm.WindowState := wsNormal
  396. else
  397. FForm.WindowState := wsMaximized;
  398. wbMinimized: Application.Minimize;
  399. end;
  400. FDownButton := wbNone;
  401. NcPaint(FForm.Active);
  402. end;
  403. end;
  404. WM_SIZE:
  405. begin
  406. FSaveWndProc(Message);
  407. if CnSkinThemes.CurrentSkin.RgnSize > 0 then
  408. begin
  409. Rgn := CreateRoundRectRgn(0, 0, FForm.Width + 1,
  410. FForm.Height + CnSkinThemes.CurrentSkin.RgnSize,
  411. CnSkinThemes.CurrentSkin.RgnSize, CnSkinThemes.CurrentSkin.RgnSize);
  412. SetWindowRgn(FForm.Handle, Rgn, True);
  413. DeleteObject(Rgn);
  414. end;
  415. // NcPaint(FForm.Active);
  416. end;
  417. else
  418. FSaveWndProc(Message);
  419. end;
  420. end;
  421. {procedure ResetSkin(SkinPath: string; IniFile: TIniFile);
  422. var
  423. I: Integer;
  424. begin
  425. if FileExists(SkinPath + 'window.bmp') then
  426. CnSkinThemes.CurrentSkin.WindowBmp.LoadFromFile(SkinPath + 'window.bmp');
  427. if FileExists(SkinPath + 'window_button.bmp') then
  428. begin
  429. CnSkinThemes.CurrentSkin.WindowBtnBmp.LoadFromFile(SkinPath + 'window_button.bmp');
  430. ButtonSize := CnSkinThemes.CurrentSkin.WindowBtnBmp.Width div 4;
  431. end;
  432. if Assigned(IniFile) then
  433. begin
  434. CnSkinThemes.CurrentSkin.CaptionHeight := IniFile.ReadInteger('Parameter', 'CnSkinThemes.CurrentSkin.CaptionHeight',
  435. CnSkinThemes.CurrentSkin.CaptionHeight);
  436. BorderSize := IniFile.ReadInteger('Parameter', 'BorderSize', BorderSize);
  437. ButtonRight := IniFile.ReadInteger('Parameter', 'ButtonRight', ButtonRight);
  438. ButtonTop := IniFile.ReadInteger('Parameter', 'ButtonTop', ButtonTop);
  439. RgnSize := IniFile.ReadInteger('Parameter', 'RgnSize', 0);
  440. ActiveCaption := TColor(IniFile.ReadInteger('Color', 'ActiveCaption',
  441. ActiveCaption));
  442. InactiveCaption := TColor(IniFile.ReadInteger('Color', 'InactiveCaption',
  443. InactiveCaption));
  444. end else
  445. begin
  446. RgnSize := 0;
  447. end;
  448. for I := 0 to CnSkinForms.Count -1 do
  449. TCnSkinForm(CnSkinForms[I]).ThemeChange;
  450. end; }
  451. initialization
  452. CnSkinForms := TList.Create;
  453. finalization
  454. CnSkinForms.Free;
  455. end.