| 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 RAMPM: 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 Quelltext| Options du sujet | 3.375 Views | 
 Themeninformationencet Thema hat 3 participant: |