Source/ Codesnippets | | | | Jens-Arne Reumschüssel | ici comment versprochen (siehe [...] ) qui Voir le texte source pour TabControls avec "neu"-Tab et "Schließen-X" sur den Tabs. Alles dans reinem XProfanX4 geschrieben.
'TabControl avec "récente"-Tab et "Schließen-X"
$H windows.ph $H messages.ph $H commctrl.ph
STRUCT S_RECT=left&,top&,right&,bottom& STRUCT S_DRAWITEMSTRUCT=CtlType&,CtlID&,itemID&,itemAction&,itemState&,hwndItem&,hDC&,rcX1&,rcY1&,rcX2&,rcY2&,itemData& STRUCT S_TCITEM=mask&,dwState&,dwStateMask&,pszText&,cchTextMax&,iImage&,lParam&
declare _hTC%,_hIL%,_hBMP%,_hWhiteBrush%,_hIclose%,_ende%,_MaxTab%,_TabNr%
SUBCLASSPROC declare dis#,rect#,tcitem#,b#,t$,mx%,my%,i%,o% si &sWnd=%HWnd '{ 'Schließen-X sur Tabs malen si %sMessage=~WM_DRAWITEM dim dis#,S_DRAWITEMSTRUCT dis#=&slParam si dis#.hwndItem&=_hTC% dim rect#,S_RECT dim tcitem#,S_TCITEM rect#.left&=dis#.rcX1&+~GetSystemMetrics(~SM_CXEDGE) rect#.top&=dis#.rcY1&+~GetSystemMetrics(~SM_CYEDGE) rect#.right&=dis#.rcX2&-~GetSystemMetrics(~SM_CXEDGE) rect#.bottom&=dis#.rcY2& tcitem#.mask&=~TCIF_TEXT | ~TCIF_STATE tcitem#.dwStateMask&=$FFFFFFFF dim b#,1000 tcitem#.psztext&=b# tcitem#.cchtextmax&=1000 @sendmessage(_hTC%,~TCM_GETITEMA,dis#.itemID&,tcitem#) si TCITEM#.dwstate&=1 ~FillRect(dis#.hDC&,rect#,_hWhiteBrush%) ~SetBkMode(dis#.hDC&,~TRANSPARENT) rect#.left&=rect#.left&+4 rect#.top&=rect#.top&+2 endif t$=@string$(b#,0) dispose b# '~selectobject(DIS#.hDC&,_hTabFont) ~drawtext(dis#.hDC&,@addr(t$),-1,rect#,~DT_LEFT | ~DT_SINGLELINE) si tcitem#.dwstate&<>1 rect#.right&=rect#.right&+4 endif si t$<>" *récente" ~DrawIconEx(dis#.hDC&,rect#.right&-16-2,rect#.top&,_hIclose%,16,16,0,0,~DI_IMAGE | ~DI_MASK) endif dispose rect#,tcitem# endif dispose dis# endif '} elseif &sWnd=_hTC% '{ 'Schließen-X ou bien "*récente"-Tab angeklickt si %smessage=~WM_LBUTTONDOWN mx%=@mouseabsx() my%=@mouseabsy() dim rect#,S_RECT for i%,0,_MaxTab%-1 @sendmessage(_hTC%,~TCM_GETITEMRECT,i%,rect#) si i%<_MaxTab%-1 si (mx%>=rect#.right&-16-2+@GetAbsWindowPosX1(_hTC%)) and (mx%<=rect#.right&+@GetAbsWindowPosX1(_hTC%)) and (my%>=rect#.top&+@GetAbsWindowPosY1(_hTC%)) and (my%<=rect#.top&+16+@GetAbsWindowPosY1(_hTC%)) @sendmessage(_hTC%,~TCM_DELETEITEM,i%,0) dec _MaxTab% 'for o%,0,_MaxTab%-2 ' settext _hTC%,o%,"Tab "+@str$(o%+1)+" " 'endfor 'o% pause endif d'autre si (mx%>=rect#.left&+@GetAbsWindowPosX1(_hTC%)) and (mx%<=rect#.right&+@GetAbsWindowPosX1(_hTC%)) and (my%>=rect#.top&+@GetAbsWindowPosY1(_hTC%)) and (my%<=rect#.bottom&+@GetAbsWindowPosY2(_hTC%)) inc _TabNr% inserttab(_hTC%,_MaxTab%-1,"Tab "+@str$(_TabNr%)+" ") inc _MaxTab% pause endif endif endfor 'i% dispose rect# endif '} endif ENDPROC 'SUBCLASSPROC
'{ 'Hilfsfunktionen PROC MouseAbsX Déclarer Point#,XX& Faible Point#,8 @external("user32.dll","GetCursorPos",Point#) XX&=@long(Point#,0) Dispose Point# Retour XX& ENDPROC 'MouseAbsX PROC MouseAbsY Déclarer Point#,YY& Faible Point#,8 @external("user32.dll","GetCursorPos",Point#) YY&=@long(Point#,4) Dispose Point# Retour YY& ENDPROC 'MouseAbsY PROC GetAbsWindowPosX1 parameters hW& declare b#,ret& dim b#,4*4 @external("user32.dll","GetWindowRect",hW&,b#) ret&=@long(b#,0) dispose b# return ret& ENDPROC 'GetAbsWindowPosX1 PROC GetAbsWindowPosY1 parameters hW& declare b#,ret& dim b#,4*4 @external("user32.dll","GetWindowRect",hW&,b#) ret&=@long(b#,4) dispose b# return ret& ENDPROC 'GetAbsWindowPosY1 PROC GetAbsWindowPosX2 'Es wird qui absolute Position ermittelt! Pour Breite/Hauteur GetWindowSpan verwenden! parameters hW& declare b#,ret& dim b#,4*4 @external("user32.dll","GetWindowRect",hW&,b#) ret&=@long(b#,8) dispose b# return ret& ENDPROC 'GetAbsWindowPosX2 PROC GetAbsWindowPosY2 'Es wird qui absolute Position ermittelt! Pour Breite/Hauteur GetWindowSpan verwenden! parameters hW& declare b#,ret& dim b#,4*4 @external("user32.dll","GetWindowRect",hW&,b#) ret&=@long(b#,12) dispose b# return ret& ENDPROC 'GetAbsWindowPosY2 '}
'Hauptprogramm: cls usermessages $10 _hWhiteBrush%=~CreateSolidBrush(@rgb(255,255,255)) _hBMP%=Create("HPIC",0,"TOOLBAR") _hIL%=@Créer("IMAGELIST",16,16,_hBMP%,@rgb(192,192,192)) _hIclose%=~ImageList_GetIcon(_hIL%,10,~ILD_NORMAL) deleteobject _hBMP% _hTC%=@Créer("TABCTRL",%HWnd,_hIL%,0,0,@width(%HWnd),24) setstyle _hTC%,@getstyle(_hTC%) | ~TCS_OWNERDRAWFIXED @set("FASTMODE",1) subclass %HWnd,1 subclass _hTC%,1 inserttab(_hTC%,1,"Tab 1 ") 'trois Spaces à droite, avec cela cela Schließen-X-Icon hineinpasst inserttab(_hTC%,1,"Tab 2 ") inserttab(_hTC%,2," *récente") waitinput 1 'TabControl 1x Montrer @set("FASTMODE",0) 'Fastmode peux maintenant wieder ausgeschaltet volonté _MaxTab%=3 _TabNr%=2 tandis que _ende%=0 waitinput si (%uMessage=$10) or ((~GetForegroundWindow()=%HWnd) and @iskey(27)) tandis que @iskey(27) sleep 25 endwhile _ende%=1 endif endwhile subclass _hTC%,0 subclass %HWnd,0 deleteobject _hIL% deleteobject _hWhiteBrush% deleteobject _hIclose% usermessages 0 end
Salut, Jens-Arne |
| | | XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 18.09.2022 ▲ |
| |
| | RudiB. | c'est oui Spitze....richtig bien !!! seulement une habe je festgestellt. Beim effacer eines Tabs, sollte là pas aussi oui c'est ca z.B. Tab3 gelöscht volonté, et pas toujours qui zuletzt erzeugte Tab. Habe la fois 10 Tabs erzeugt et Tab1 effacer voulons. jusqu'à zum bitteren Ende blieb Tab1. ou bien soll cela so son ? mais sonst genial....peux on aussi léger abändern. je werd la fois quoi essayer. Salut aus München Rudi |
| | | | |
| | Jens-Arne Reumschüssel | oui, cela sollte pour cela Beispiel réellement so son. mais si je mir cela maintenant droite überlege, ist cela naturellement dans qui acte Quatsch. j'ai cela Beispiel daher angepasst. maintenant rester qui Beizeichnungen qui Tabs conservé, si on une löscht.
Salut, Jens-Arne |
| | | XProfan X4XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 19.09.2022 ▲ |
| |
| | Sven Bader | merci pour den tollen Code! Sowohl Redraw comme aussi Mausposition sommes oui wirklich fummelig mais es scheint qui einzige Weg trop son. Pour mon Bedürfnisse hat un Multiplikationszeichen × zum schließen gereicht, weshalb je mir zumindest den Ownder-Draw sparen peux. avec Stukturen statt Hilfsfunktionen ist es et avec ca kürzer geworden.
qui es brauchen peux ici mon angepasster Code.
Viele Grüße
Sven
'TabControl avec "neu"-Tab et "Schließen-X"
$H windows.ph
$H messages.ph
$H commctrl.ph
STRUCT S_RECT = left&,top&,right&,bottom&
STRUCT S_TABRECT = x1&,y1&,x2&,y2&
STRUCT S_MOUSE = mx&,my&
declare tabcontrol&,_hIL%,_ende%,_MaxTab%,_TabNr%, hFont%
SUBCLASSPROC
declare rect#,i%,o%,tabrect#,mouse#
Si SubClassMessage(Tabcontrol&, ~WM_LBUTTONDOWN)
'{ 'Schließen-X ou bien "*neu"-Tab angeklickt
dim rect#,S_RECT
dim mouse#,S_MOUSE
dim tabrect#,S_TABRECT
external("user32.dll","GetCursorPos",mouse#)
external("user32.dll","GetWindowRect",Tabcontrol&,tabrect#)
for i%,0,_MaxTab%-1
sendmessage(Tabcontrol&,~TCM_GETITEMRECT,i%,rect#)
si i%<_MaxTab%-1
si (mouse#.mx&>=rect#.right&-16-2+tabrect#.x1&) and (mouse#.mx&<=rect#.right&+tabrect#.x1&) and (mouse#.my&>=rect#.top&+tabrect#.y1&) and (mouse#.my&<=rect#.top&+16+tabrect#.y1&)
sendmessage(Tabcontrol&,~TCM_DELETEITEM,i%,0)
dec _MaxTab%
pause
endif
d'autre
si (mouse#.mx&>=rect#.left&+tabrect#.x1&) and (mouse#.mx&<=rect#.right&+tabrect#.x1&) and (mouse#.my&>=rect#.top&+tabrect#.y1&) and (mouse#.my&<=rect#.bottom&+tabrect#.x2&)
inc _TabNr%
inserttab(Tabcontrol&,_MaxTab%-1,"Tab "+str$(_TabNr%)+" × ")
inc _MaxTab%
pause
endif
endif
endfor'i%
dispose rect#, mouse#, tabrect#
'}
endif
ENDPROC'SUBCLASSPROC
'Hauptprogramm:
cls
hFont% = Créer("Font","segoe ui",16,0,0,0,0)
SetDialogFont hFont%
usermessages $10
Tabcontrol&=Créer("TABCTRL",%HWnd,_hIL%,0,0,width(%HWnd),24)
subclass Tabcontrol&,1
set("FASTMODE",1)
inserttab(Tabcontrol&,1,"Tab 1 × ")'trois Spaces à droite, avec cela cela Schließen-X-Icon hineinpasst
inserttab(Tabcontrol&,1,"Tab 2 × ")
inserttab(Tabcontrol&,2," *neu")
waitinput 1'TabControl 1x Montrer
set("FASTMODE",0)'Fastmode peux maintenant wieder ausgeschaltet volonté
_MaxTab%=3
_TabNr%=2
tandis que _ende%=0
waitinput
si (%uMessage=$10) or ((~GetForegroundWindow()=%HWnd) and iskey(27))
tandis que iskey(27)
sleep 25
endwhile
_ende%=1
endif
endwhile
subclass Tabcontrol&,0
usermessages 0
end
So sieht es ensuite im fertigen Programme aus:
|
| | | | |
|
Zum QuelltextOptions du sujet | 2.612 Views |
Themeninformationencet Thema hat 3 participant: |