From 96374a02c050ebf3cfab7f2a67329d62aac34893 Mon Sep 17 00:00:00 2001 From: JianjunLiu Date: Thu, 8 Sep 2022 17:06:18 +0800 Subject: [PATCH] =?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 娣诲姞splitter --- designer/tslvcldesigner.tsf | 69 +++++++ designer/utslvcldesignerresource.tsf | 14 ++ funcext/tvclib/tcontrol.tsf | 28 ++- funcext/tvclib/tcustomcontrol.tsf | 276 ++++++++++++++++++++++++++- funcext/tvclib/tcustomsplitter.tsf | 17 ++ funcext/tvclib/tslvcl.tsf | 10 + funcext/tvclib/utslvclcoolbar.tsf | 34 ++-- 7 files changed, 422 insertions(+), 26 deletions(-) create mode 100644 funcext/tvclib/tcustomsplitter.tsf diff --git a/designer/tslvcldesigner.tsf b/designer/tslvcldesigner.tsf index 9083496..1e51cb6 100644 --- a/designer/tslvcldesigner.tsf +++ b/designer/tslvcldesigner.tsf @@ -2356,6 +2356,40 @@ type TGraphicLabelWindow = class(TDVirutalWindow) return true; end end +type TGraphicsplitterWindow = class(TDVirutalWindow) +{** + @explan(说明) label 控件替代窗口 %% +**} + + function paint();override; + begin + //canvas.Font := font; + //al := BindComp.TextAlign; + //BindComp.CanvasDrawAlignText(self.canvas,self.ClientRect,self.caption,al); + end + function SetPublish(n,v);override; + begin + r := inherited; + //if n="color" then color := v; + //if n="bkbitmap" then bkbitmap := v; + //if (n="textalign" or n="caption" or n="font" or n="bkbitmap") then InvalidateRect(nil,true); + return r; + end + function Create(AOwner);override; + begin + inherited; + BindComp := new tsplitter(self); + width := BindComp.width; + height := BindComp.Height; + color := BindComp.color; + WindowFileds := array("left","top","width","height","color","visible","enabled","align"); + end + + function DesigningSizer();override; + begin + return true; + end +end type TDLabel = class(TDComponent) {** @@ -2392,6 +2426,40 @@ type TDLabel = class(TDComponent) inherited; end end +type tdsplitter = class(TDComponent) +{** + @explan(说明) label控件 %% +**} + function HitTip();override; + begin + return inherited; + end + function IsContainer();override; + begin + return false; + end + function ComponentClass();override; + begin + return class(tsplitter); + end + function dclassname();override; + begin + return "tsplitter"; + end + + function WndClass();override; + begin + return Class(TGraphicsplitterWindow); + end + function bitmapinfo();override; + begin + return getsplitterbitmapinfo(); + end + function Create(AOwner);override; + begin + inherited; + end +end //****************timmer**************************** type TTimerWindow = class(TDVirutalWindow) {** @@ -9422,6 +9490,7 @@ begin class(TDmessagebox), class(TDBtn), class(TDLabel), + class(tdsplitter), class(TDEdit), class(TDpassword), class(TDmemo), diff --git a/designer/utslvcldesignerresource.tsf b/designer/utslvcldesignerresource.tsf index ad64c9b..2613ef1 100644 --- a/designer/utslvcldesignerresource.tsf +++ b/designer/utslvcldesignerresource.tsf @@ -33,6 +33,7 @@ function getrunbmpinfo(); function getwrapprojectbmpinfo(); function getcreateprojectbmpinfo(); function geteditcodebitmapinfo(); +function getsplitterbitmapinfo(); //编辑器图片 function getdbugerrunbmpinfo(); function getopenfilebmpinfo(); @@ -1215,6 +1216,19 @@ CF7F527EA1C3DA7875C10207E7AA366E2C20907118F56AE3DA023E0ECE2A78100 4FA02DDADA8831B0B9AD8BCB2A0297CA9A0F59F7E7B0FE20F1D79BA1B7D429BC4 0000000049454E44AE42608200"; end +function getsplitterbitmapinfo(); +begin + return "0502000000060400000074797065000203000000696D670006040000006461746 +100021301000089504E470D0A1A0A0000000D4948445200000018000000180806 +000000E0773DF8000000017352474200AECE1CE90000000467414D410000B18F0 +BFC6105000000097048597300000EC300000EC301C76FA864000000A849444154 +484B63F84F6330422C3874E020062616106DC1FDFBB7E1B8BC7C12548630185C1 +6800C1E3A3E78F6F63B9485DF026475D800560B5EBCFBFE3FB8E13894873F88FC +6B8FFD7FF2FA1B948709302C80196E91B30F2A82DF072075F82C41B100D970523 +12E4B502CC89C700EAB666231483F3AA0AF0F4080A6710003344D453040D37C80 +0EF0594008906401B620220406970F686A01C850644C2C20CA024A008D2DF8FF1 +F0006015AA04B38837B0000000049454E44AE42608200"; +end { GetSaveFileBitmapInfo //保存文件 "0502000000060400000074797065000203000000696D670006040000006461746 diff --git a/funcext/tvclib/tcontrol.tsf b/funcext/tvclib/tcontrol.tsf index 72f7811..f3e4929 100644 --- a/funcext/tvclib/tcontrol.tsf +++ b/funcext/tvclib/tcontrol.tsf @@ -897,43 +897,51 @@ type tcontrol = class(tcomponent) begin exit; end - if e.width<1 then exit; - if e.height<1 then exit; + if e.width<2 or e.height<2 then //处理一下操出范围的子控件 + begin + case Align of + alLeft,alRight,alTop,alBottom,alClient: + begin + SetBounds(e.left,e.top,2,2); + end + end ; + exit; + end bds := UnAlignBounds; case Align of alTop: begin ht := min(e.height,bds[3]-bds[1]); - if ht then - begin - SetBounds(e.left,e.top,e.width,ht); + //if ht then + //begin + SetBounds(e.left,e.top,e.width,max(2,ht)); //SetBoundsRect(array(e.left,e.top,e.width+e.left,e.top+ht)); e.top += ht; e.height -= ht; - end + //end end alRight: begin wd := min(e.width,bds[2]-bds[0]); - SetBounds(e.left+e.width-wd,e.top,wd,e.height); + SetBounds(e.left+e.width-wd,e.top,max(wd,2),e.height); e.width := e.width-wd; end alLeft: begin wd := min(e.width,bds[2]-bds[0]); - SetBounds(e.left,e.top,wd,e.height); + SetBounds(e.left,e.top,max(wd,2),e.height); e.left := e.left+wd; e.width := e.width-wd; end alBottom: begin ht := min(e.height,bds[3]-bds[1]); - SetBounds(e.left,e.top+e.height-ht,e.width,ht); + SetBounds(e.left,e.top+e.height-ht,e.width,max(ht,2)); e.height -= ht; end alClient: begin - SetBounds(e.left,e.top,e.width,e.height); + SetBounds(e.left,e.top,max(2,e.width),max(2,e.height)); e.height := 0; e.width := 0; end diff --git a/funcext/tvclib/tcustomcontrol.tsf b/funcext/tvclib/tcustomcontrol.tsf index 2b44cd2..e068267 100644 --- a/funcext/tvclib/tcustomcontrol.tsf +++ b/funcext/tvclib/tcustomcontrol.tsf @@ -1,5 +1,5 @@ type tcustomcontrol=class(TWinControl) - uses utslvclauxiliary; + uses utslvclauxiliary,utslvclgdi; {** @explan(说明) 自绘制窗口控件 %% **} @@ -22,11 +22,26 @@ type tcustomcontrol=class(TWinControl) inherited; if datatype(FOnPaint)=7 then call(FOnPaint,self(true)); end + function ControlAppended(AControl);override; + begin + if AControl is class(tcustomsplitter) then + begin + fhasspliter++; + end + end + function ControlDeleted(AControl);override; + begin + if AControl is class(tcustomsplitter) then + begin + fhasspliter--; + end + end public function Create(AOwner:TComponent);override; begin inherited; includestate(FControlState,csCustomPaint); + fsplitterwilldrag := true; //FCanvas := new tcanvas(); end function CreateParams(p);override; @@ -37,6 +52,8 @@ type tcustomcontrol=class(TWinControl) function Recycling();override; begin FOnPaint := nil; + fsplitercache := array(); + fsplitterdragimglist := nil; inherited; end function DoVScroll(o,e);virtual; @@ -54,8 +71,265 @@ type tcustomcontrol=class(TWinControl) begin return DoHScroll(o,e); end + + function WMLButtonDown(o,e);override;//拖拽释放 + begin + if fhasspliter<1 then return inherited; + if csDesigning in ComponentState then exit; + case fcurspltype of + alLeft,alRight: + begin + drgidx := 1; + end + alTop,alBottom: + begin + drgidx := 0; + end + else + begin + return inherited; + end + end ; + if fsplitterwilldrag then + begin + cimgst(); + fsplitterwilldrag := false; + fsplitterdraging := true; + nxy := clienttowindow(e.xpos,e.ypos); + _wapi.ImageList_BeginDrag(fsplitterdragimglist.Handle,drgidx,12,12); + _wapi.ImageList_DragEnter(self.Handle,nxy[0],nxy[1]); + crect := clientrect; + ps := array(clienttoscreen(crect[0],crect[1]),clienttoscreen(crect[2],crect[3])); + _wapi.clipcursor(ps); + splitterenabled(false); + return ; + end + //end + inherited; + end + function WMLBUTTONUP(o,e);override;//拖拽实现 + begin + if fhasspliter<1 then return inherited; + if csDesigning in ComponentState then return ; + if fsplitterdraging then + begin + cimgst(); + _wapi.ImageList_DragLeave(self.Handle); + _wapi.ImageList_EndDrag(); + splitterenabled(true); + fsplitterwilldrag := true; + fsplitterdraging := false; + sizeprive(e.pos); + _wapi.clipcursor(0); + return ; + end + inherited; + end + function WMMouseMove(o,e);override; //移动 + begin + if fhasspliter<1 then return inherited; + if fsplitterdraging then + begin + cimgst(); + nxy := clienttowindow(e.xpos,e.ypos); + _wapi.ImageList_DragMove(nxy[0],nxy[1]); + return ; + end else + begin + xy := e.pos(); + fcurspltype := nil; + fcursplitterid := -1; + fcursplitter := nil; + for i,v in Controls.data do + begin + if (v is class(tcustomsplitter)) and (v.Visible) and (v.enabled) and pointinrect(xy,v.BoundsRect) and (v<>fcursplitter) then //拖拽 + begin + va := v.Align; + if va in array(alLeft,alRight) then + begin + cursor := OCR_SIZEWE; + fcurspltype := va; + fcursplitter := v; + fcursplitterid := i; + return ; + end else + if va in array(alTop,alBottom) then + begin + cursor := OCR_SIZENS; + fcurspltype := va; + fcursplitter := v; + fcursplitterid := i; + return ; + end + + end + end + cursor := OCR_NORMAL; + end + inherited; + end property OnPaint:eventhandler read FOnPaint write FOnPaint; {** @param(OnPaint)(function[TCustomControl,tuieventbase]) 窗口关闭消息回调 %% **} + private + function getzybmp(); + begin +r :="0502000000060400000074797065000203000000696D670006040000006461746 +10002E300000089504E470D0A1A0A0000000D4948445200000018000000180806 +000000E0773DF8000000017352474200AECE1CE90000000467414D410000B18F0 +BFC6105000000097048597300000EC300000EC301C76FA8640000007849444154 +484BED8FED09C0200C443B90C3B89CDB65174BC02B54134FA41F7FF220207AB98 +7477D9910504240F94F2022EDC499654D812EE49C97242C3B08B0504A69371CCD +7A929B60A71C78924B80F294923BC07AC3F492EF7E0076245EB932081448AC851 +E963505CA4A3998655DC1538480120242AD27B102A52F60A469C4000000004945 +4E44AE42608200"; + return r; + end + function getsxbmp(); + begin +r := "0502000000060400000074797065000203000000696D670006040000006461746 +100027801000089504E470D0A1A0A0000000D4948445200000018000000180806 +000000E0773DF8000000017352474200AECE1CE90000000467414D410000B18F0 +BFC6105000000097048597300000EC300000EC301C76FA8640000010D49444154 +484BE5963D0A84400C853D8885BD585AD8D97802B11704AFA19D8D78053BAFE10 +5AC0541F006361E204B86380CAC6322EC6EB31F04740CEF61327F0E08699A0682 +2000C771A02C4B98E799BEDC2332288A42099B118621ECFB4E19765883BAAEDFC +4CF48D394B2ECB006499228B1388EB5705555FA79DB36CABC4654A2B66D615916 +2D3A8E23F47DAF8243DC64C43490F26706BEEF2B83755D6984E79101CE986118E +84D8636388E43FDFA27629A2652350CA228D235FE44E05A417E67F0F5127D8B47 +06B81F799EC7EE3F268F0CCEFA6219A4FC8101AE5CDB766DCE161BAC419EE74AF +4EAC0C18673B0067747669665946547D483AB435F228E889B7C5E5B5CD785AEEB +689403E005E8019174FBC7C7A70000000049454E44AE42608200"; + return r; + + end + function candosplitter(v); + begin + return (not(v is class(tcustomsplitter)) and (v.Visible) and (v.Align = fcurspltype)); + end + function sizeprive(xy); + begin + id := fcursplitterid; + ctls := Controls; + rc := clientrect; + x := max(rc[0],xy[0]); + x := min(rc[2],x); + y := max(rc[1],xy[1]); + y:= min(rc[3],y); + case fcurspltype of + alLeft : + begin + for i:= id-1 downto 0 do + begin + v := ctls[i]; + if candosplitter(v) then + begin + vL := v.Left; + sw := fcursplitter.Width; + nvl := max(x-vl-sw,sw); + v.Align := alNone; + v.Width := nvl; + v.Align := fcurspltype; + return ; + end + end + + end + alTop: + begin + for i:= id-1 downto 0 do + begin + v := ctls[i]; + if candosplitter(v) then + begin + vL := v.top; + sw := fcursplitter.Height; + nvl := max(y-vl-sw,sw); + v.Align := alNone; + v.Height := nvl; + v.Align := fcurspltype; + return ; + end + end + end + alRight: + begin + for i:= id-1 downto 0 do + begin + v := ctls[i]; + if candosplitter(v) then + begin + vl := (v.BoundsRect)[2]; + sw := fcursplitter.Width; + nvl := max(vl-x-sw*1.5,sw); + v.Align := alNone; + v.Width := nvl; + v.Align := fcurspltype; + return ; + end + end + end + alBottom: + begin + for i:= id-1 downto 0 do + begin + v := ctls[i]; + if candosplitter(v) then + begin + vL := (v.BoundsRect)[3]; + sw := fcursplitter.Height; + nvl := max(vl-y-sw*1.5,sw); + v.Align := alNone; + v.Height := nvl; + v.Align := fcurspltype; + return ; + end + end + end + + end + end + function cimgst(); + begin + if not fsplitterdragimglist then + begin + fsplitterdragimglist := new TCustomImageList(self); + fsplitterdragimglist.Width := 24; + fsplitterdragimglist.Height := 24; + bmp := new TcustomBitmap(); + bmp.readvcon(HexFormatStrToTsl(getsxbmp())); + fsplitterdragimglist.addbmp(bmp); + bmp.readvcon(HexFormatStrToTsl(getzybmp())); + fsplitterdragimglist.addbmp(bmp); + end + end + function splitterenabled(b); + begin + if not b then + begin + fsplitercache := array(); + for i,v in controls.data do + begin + fsplitercache[i] := array(v,v.enabled); + v.enabled := false; + + end + end else + begin + for i,v in fsplitercache do + begin + v[0].enabled := v[1]; + end + fsplitercache := nil; + end + end + fsplitterdragimglist; + fsplitterwilldrag; + fsplitterdraging; + fcurspltype; + fcursplitter; + fcursplitterid; + fsplitercache; + fhasspliter; end; \ No newline at end of file diff --git a/funcext/tvclib/tcustomsplitter.tsf b/funcext/tvclib/tcustomsplitter.tsf new file mode 100644 index 0000000..6842071 --- /dev/null +++ b/funcext/tvclib/tcustomsplitter.tsf @@ -0,0 +1,17 @@ +type tcustomsplitter = class(tgraphiccontrol) +{** + @explan(说明)调整分割控件 +**} + function create(AOwner); + begin + inherited; + Caption := ""; + color := 0xEED2BC; + Width := 6; + Height := 100; + end + function SetAlign(a);override; + begin + inherited; + end +end diff --git a/funcext/tvclib/tslvcl.tsf b/funcext/tvclib/tslvcl.tsf index 481dec9..2f2de1b 100644 --- a/funcext/tvclib/tslvcl.tsf +++ b/funcext/tvclib/tslvcl.tsf @@ -2509,6 +2509,16 @@ type tcoolbar = class(tcustomcoolbar) return array("name","enabled","caption","autosize","border","wsdlgmodalframe","font","color","dragbtncolor","visible","arrange"); end end +type tsplitter = class(tcustomsplitter) + function create(AOwner); + begin + inherited; + end + function publishs();override; + begin + return array("name","enabled","border","left","top","width","height","color","transparent","visible","align"); + end +end //树控件 type TTreeCtlNode = class( TcustomTreeCtlNode) diff --git a/funcext/tvclib/utslvclcoolbar.tsf b/funcext/tvclib/utslvclcoolbar.tsf index 1175c6d..0bd2ce0 100644 --- a/funcext/tvclib/utslvclcoolbar.tsf +++ b/funcext/tvclib/utslvclcoolbar.tsf @@ -44,11 +44,11 @@ type tcustomcoolbar=class(tcustomcontrol) end return r; end - function MouseUp(o,e);override;//拖拽实现 + function WMLBUTTONUP(o,e);override;//拖拽实现 begin if csDesigning in ComponentState then exit; - if e.button=mbLeft then - begin + //if e.button=mbLeft then + //begin if FIs_Draging then begin _wapi.ImageList_DragLeave(self.Handle); @@ -77,22 +77,21 @@ type tcustomcoolbar=class(tcustomcontrol) InvalidateRect(nil,false); end end - end - - r := ClientRect; + end EnabledChild(true); FWill_Drag := true; FIs_Draging := false; _wapi.clipcursor(0); + return ; end - end + //end inherited; end - function MouseDown(o,e);override;//拖拽释放 + function WMLButtonDown(o,e);override;//拖拽释放 begin if csDesigning in ComponentState then exit; - if e.button=mbLeft then - begin + //if e.button=mbLeft then + //begin xy := e.pos; trk := -1; for i,v in fcoolbands.data do @@ -113,7 +112,7 @@ type tcustomcoolbar=class(tcustomcontrol) end end - if trk<0 then return ; + if trk<0 then return inherited; nxy := clienttowindow(e.xpos,e.ypos); if FWill_Drag then begin @@ -125,16 +124,18 @@ type tcustomcoolbar=class(tcustomcontrol) ps := array(clienttoscreen(crect[0],crect[1]),clienttoscreen(crect[2],crect[3])); _wapi.clipcursor(ps); EnabledChild(false); + return ; end - end + //end inherited; end - function MouseMove(o,e);override; //移动 + function WMMouseMove(o,e);override; //移动 begin if FIs_Draging then begin nxy := clienttowindow(e.xpos,e.ypos); _wapi.ImageList_DragMove(nxy[0],nxy[1]); + return ; end else begin xy := e.pos(); @@ -153,12 +154,15 @@ type tcustomcoolbar=class(tcustomcontrol) break; end end - if not flg then + if flg then + begin + return ; + end else begin cursor := OCR_NORMAL; end end - inherited; + inherited; end function doControlALign();override;//调整位置 begin