From 5913d5f2b1ca80a8959479c9797ef548dbc66900 Mon Sep 17 00:00:00 2001 From: dmitry Date: Mon, 4 Jan 2016 17:16:19 +0000 Subject: [PATCH] win32: removing usage of ComCtrls from win32int. Refactored internal processing of WM_DRAWITEM message for ListView adding a new parameter to TWin32WindowInfo structure. Moved ProgressBar constraint from TWin32WidgetSet to TWin32WSProgressBar. git-svn-id: trunk@51190 - --- lcl/interfaces/win32/win32callback.inc | 20 +++++++++------ lcl/interfaces/win32/win32int.pp | 2 +- lcl/interfaces/win32/win32lclintf.inc | 9 ------- lcl/interfaces/win32/win32proc.pp | 5 ++++ lcl/interfaces/win32/win32wscomctrls.pp | 25 +++++++++++++++++++ .../win32/win32wscustomlistview.inc | 11 ++++++++ 6 files changed, 54 insertions(+), 18 deletions(-) diff --git a/lcl/interfaces/win32/win32callback.inc b/lcl/interfaces/win32/win32callback.inc index 0cd2fba5d5..a1f07a6007 100644 --- a/lcl/interfaces/win32/win32callback.inc +++ b/lcl/interfaces/win32/win32callback.inc @@ -1341,6 +1341,8 @@ procedure TWindowProcHelper.DoMsgDrawItem; var menuItem: TObject; PDrawIS: PDrawItemStruct; + isDrawListItem: Boolean; + DrawItemMsg: Integer; begin PDrawIS := PDrawItemStruct(LParam); if (WParam = 0) and (PDrawIS^.ctlType = ODT_MENU) then @@ -1369,14 +1371,16 @@ begin (TCustomCombobox(lWinControl).Style = csOwnerDrawVariable)))) then UpdateDrawListItem(LM_DRAWLISTITEM) - else - if (lWinControl <> nil) and (lWinControl is TListView) and - (TListView(lWinControl).ViewStyle = vsReport) and - (PDrawIS^.ctlType = ODT_LISTVIEW) and - (TListView(lWinControl).OwnerDraw) - then - UpdateDrawListItem(CN_DRAWITEM) - else + else if Assigned(WindowInfo^.DrawItemHandler) then begin + DrawItemMsg := 0; + isDrawListItem := False; + WindowInfo^.DrawItemHandler(lWinControl, Window, Msg, WParam, PDrawIS^, + DrawItemMsg, isDrawListItem); + if isDrawListItem and (DrawItemMsg<>0) then + UpdateDrawListItem(DrawItemMsg) + else + UpdateDrawItems; + end else UpdateDrawItems; end; end; diff --git a/lcl/interfaces/win32/win32int.pp b/lcl/interfaces/win32/win32int.pp index 02b6e8a8e4..de3bb359e3 100644 --- a/lcl/interfaces/win32/win32int.pp +++ b/lcl/interfaces/win32/win32int.pp @@ -30,7 +30,7 @@ interface uses Windows, // keep as first ActiveX, Classes, - Translations, ComCtrls, Controls, Buttons, + Translations, Controls, Buttons, LCLIntf, LclProc, LazUTF8, LCLType, LMessages, Forms, Dialogs, GraphMath, GraphType, InterfaceBase, StdCtrls, SysUtils, Win32Def, Graphics, Menus, CommCtrl, diff --git a/lcl/interfaces/win32/win32lclintf.inc b/lcl/interfaces/win32/win32lclintf.inc index f68bf920d1..c3dc2dc66a 100644 --- a/lcl/interfaces/win32/win32lclintf.inc +++ b/lcl/interfaces/win32/win32lclintf.inc @@ -584,15 +584,6 @@ begin begin // win32 combo (but not csSimple) has fixed height FixedHeight := TCustomComboBox(SizeConstraints.Control).Style <> csSimple; - end - // The ProgressBar needs a minimum Height of 10 when themed, - // as required by Windows, otherwise it's image is corrupted - else if ThemeServices.ThemesEnabled and (SizeConstraints.Control is TCustomProgressBar) then - begin - MinHeight := 10; - - SizeConstraints.SetInterfaceConstraints( - MinWidth, MinHeight, MaxWidth, MaxHeight); end; if (FixedHeight or FixedWidth) diff --git a/lcl/interfaces/win32/win32proc.pp b/lcl/interfaces/win32/win32proc.pp index 9f37b00e4a..f1d3250fac 100644 --- a/lcl/interfaces/win32/win32proc.pp +++ b/lcl/interfaces/win32/win32proc.pp @@ -36,6 +36,10 @@ Type Msg: UInt; WParam: Windows.WParam; LParam: Windows.LParam; var MsgResult: Windows.LResult; var WinProcess: Boolean): Boolean; + TDrawItemHandlerProc = procedure (const AWinControl: TWinControl; Window: HWnd; + Msg: UInt; WParam: Windows.WParam; const DrawIS: TDrawItemStruct; + var ItemMsg: Integer; var DrawListItem: Boolean); + PWin32WindowInfo = ^TWin32WindowInfo; TWin32WindowInfo = record Overlay: HWND; // overlay, transparent window on top, used by designer @@ -62,6 +66,7 @@ Type isChildEdit: boolean; // is buddy edit of a control ThemedCustomDraw: boolean;// controls needs themed drawing in wm_notify/nm_customdraw IMEComposed: Boolean; + DrawItemHandler: TDrawItemHandlerProc; case integer of 0: (spinValue: Double); 1: ( diff --git a/lcl/interfaces/win32/win32wscomctrls.pp b/lcl/interfaces/win32/win32wscomctrls.pp index ec1ed6b9e1..a2a4e84154 100644 --- a/lcl/interfaces/win32/win32wscomctrls.pp +++ b/lcl/interfaces/win32/win32wscomctrls.pp @@ -205,6 +205,7 @@ type class procedure ApplyChanges(const AProgressBar: TCustomProgressBar); override; class procedure SetPosition(const AProgressBar: TCustomProgressBar; const NewPosition: integer); override; class procedure SetStyle(const AProgressBar: TCustomProgressBar; const NewStyle: TProgressBarStyle); override; + class function GetConstraints(const AControl: TControl; const AConstraints: TObject): Boolean; override; end; { TWin32WSCustomUpDown } @@ -709,6 +710,30 @@ begin end; end; +class function TWin32WSProgressBar.GetConstraints(const AControl: TControl; + const AConstraints: TObject): Boolean; +var + SizeConstraints: TSizeConstraints absolute AConstraints; + MinWidth, MinHeight, MaxWidth, MaxHeight: Integer; +begin + Result := True; + + if (AConstraints is TSizeConstraints) then + begin + MinWidth := 0; + MinHeight := 0; + MaxWidth := 0; + MaxHeight := 0; + + // The ProgressBar needs a minimum Height of 10 when themed, + // as required by Windows, otherwise it's image is corrupted + if ThemeServices.ThemesEnabled then + MinHeight := 10; + + SizeConstraints.SetInterfaceConstraints(MinWidth, MinHeight, MaxWidth, MaxHeight); + end; +end; + { TWin32WSToolbar} {$ifdef OldToolbar} diff --git a/lcl/interfaces/win32/win32wscustomlistview.inc b/lcl/interfaces/win32/win32wscustomlistview.inc index e583ee52e2..9fb7d1b24c 100644 --- a/lcl/interfaces/win32/win32wscustomlistview.inc +++ b/lcl/interfaces/win32/win32wscustomlistview.inc @@ -708,6 +708,16 @@ end; // LV code //////////////////////////////////////////////////////////////////////////////// +procedure ListViewDrawItem(const AWinControl: TWinControl; Window: HWnd; + Msg: UInt; WParam: Windows.WParam; const DrawIS: TDrawItemStruct; + var ItemMsg: Integer; var DrawListItem: Boolean); +begin + DrawListItem := (AWinControl <> nil) and (AWinControl is TListView) and + (TListView(AWinControl).ViewStyle = vsReport) and + (DrawIS.ctlType = ODT_LISTVIEW) and + (TListView(AWinControl).OwnerDraw); + ItemMsg := CN_DRAWITEM; +end; class function TWin32WSCustomListView.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; @@ -738,6 +748,7 @@ begin FinishCreateWindow(AWinControl, Params, false); Params.WindowInfo^.ParentMsgHandler := @ListViewParentMsgHandler; Params.WindowInfo^.needParentPaint := false; + Params.WindowInfo^.DrawItemHandler := @ListViewDrawItem; Result := Params.Window; if TCustomListView(AWinControl).checkboxes then UpdateExStyle(result,lvs_ex_SubitemImages or lvs_Ex_Checkboxes,lvs_ex_SubitemImages or lvs_Ex_Checkboxes) else