Includes | | | | - Seite 1 - |
| | Da XProfan bisher keinen Splitter hat, hab ich mal die Docksplitter.dll von David SZAFRANSKI für XProfan gewrapped. Die DLL ist lizensiert unter GPL.
So einem Splitter kann man 2 vorher erstellte Controls zuordnen, wobei sich ListBoxen, Edits und ähnliches besonders eignen. Mit der Maus läßt sich jetzt die größer dieser beiden Controls verändern, bzw. per Mausclick auch eins ganz ausblenden. Bei der Umsetzung im Hinterkopt hab ich natürlich eine Implementation in XProfEdit
Snapschuß:
Das Paket besteht aus einer sehr kleinen DLL, einer Include-Datei, einer Header-Datei, sowie dem oben abgebildeten Beispiel.
$I DockSplitter.inc
Declare DLLhWnd&
DllhWnd& = Splitter_Init()
IfNot DllhWnd& : End : EndIf
WindowStyle 26
Window 100, 100 - 600, 400
Declare hList&, hEdit&, hSplitter&
hList& = Create(ListBox, %hWnd, , 0, 0, 0, 0)
WhileLoop 1, 10, 1
AddString(hList&, Test + @Str$(&Loop))
EndWhile
hEdit& = Create(MultiEdit, %hWnd, , 0, 0, 0, 0)
SetText hEdit&, Dies ist ein kleiner erster Test des DockSplitters!
hSplitter& = Create(Splitter, 0, 0, 600, 400)
Splitter_SetPanel(hSplitter&, hList&, hEdit&)
Splitter_SetPosition hSplitter&, 150
Declare Ende%
WhileNot Ende%
WaitInput
EndWhile
Splitter_Exit DllhWnd&
Viel Spaß damit |
| | | | |
| | | | | - Seite 2 - |
| Frank Abbing | Hier noch ein Splitter-Control, variabel verschiebbar. Íst gerade bei meiner derzeitigen Programmierung abgefallen und kann leicht an eigene Gegebenheiten angepasst werden:
{$cleq}
@Set(ErrorLevel,0)
Declare x&,y&,z&,text$,xpiadll&
Declare listbox1&,listbox2&,splitter&
Def GetSysColor(1) !USER32,GetSysColor
xpiadll&=UseDll(xpia$)
WindowStyle 543
Window 0,0-640,480
Cls GetSysColor(15)
UseFont MS Sans Serif,13,0,0,0,0
SetDialogFont 1
splitter&=Create(Button,%hwnd,:,200,0,7,400)
listbox1&=Create(ListBox,%hwnd,0,0,0,200,400)
listbox2&=Create(ListBox,%hwnd,0,207,0,200,400)
ClearList
AddWindows
MoveListToList(listbox1&)
ClearList
AddFonts
MoveListToList(listbox2&)
If 0
AsmStart GeneriereDatas()
.data
point dd 0,0
split dd 0
profan dd 0
listbox1 dd 0
listbox2 dd 0
hWnd dd 0
uMsg dd 0
wParam dd 0
lParam dd 0
oldproc dd 0
.code
nop
AsmEnd
ASMSTART subclass noexport (x&,x&,x&,x&)
push eax
push ebx
push ecx
push edx
push edi
push esi
push ebp
push esp
m2m hWnd,para1
m2m uMsg,para2
m2m wParam,para3
m2m lParam,para4
.if uMsg == WM_LBUTTONDOWN
mov split,TRUE
invoke LoadCursor,0,IDC_SIZEWE
invoke SetCursor,eax
return 0
.elseif uMsg == WM_LBUTTONUP
mov split,FALSE
return 0
.endif
.if uMsg == WM_MOUSEMOVE
invoke LoadCursor,0,IDC_SIZEWE
invoke SetCursor,eax
.if split == TRUE
invoke GetCursorPos,addr point
invoke ScreenToClient,profan,addr point
lea esi,point
mov edi,[esi]
.if SDWORD PTR edi<0
mov edi,0
.endif
.if edi>400
mov edi,400
.endif
mov [esi],edi
lea esi,point
mov edi,[esi]
invoke MoveWindow,listbox1,0,0,edi,400,TRUE
lea esi,point
mov edi,[esi]
add edi,7
mov ebx,400
sub ebx,edi
add ebx,7
invoke MoveWindow,listbox2,edi,0,ebx,400,TRUE
lea esi,point
mov edi,[esi]
invoke MoveWindow,hWnd,edi,0,7,400,TRUE
.endif
return 0
.endif
pop esp
pop ebp
pop esi
pop edi
pop edx
pop ecx
pop ebx
pop eax
invoke CallWindowProc,oldproc,hWnd,uMsg,wParam,lParam
raus:
ASMEND
EndIf
ASMSTART StartSubclassing(splitter&,%hwnd,listbox1&,listbox2&)
m2m profan,para2
m2m listbox1,para3
m2m listbox2,para4
invoke SetWindowLong,para1,GWL_WNDPROC,addr subclass
mov oldproc,eax
ASMEND
While 1
waitinput
Case %key=2:Break
EndWhile
DestroyWindow(%hwnd)
FreeDll xpiadll&
End
Der gleiche Code hier für User, die XPIA und XPSE nicht installiert haben (warum auch immer )
DECLARE XPIA_#,XPIA$,EXPIA&,X&,Y&,Z&,TEXT$,XPIADLL&,LISTBOX1&,LISTBOX2&,SPLITTER&
DIM XPIA_#,2560
CLEAR XPIA_#
LONG XPIA_#,0=9460301,3,4,65535,184
LONG XPIA_#,24=64
LONG XPIA_#,60=184,247078670,-855002112,1275181089,1750344141,1881174889,1919381362,1663069537,1869508193,1700929652,1853190688,544106784,542330692,1701080941,168627502,36
LONG XPIA_#,128=-1826774061,-1066155369,-1066155369,-1066155369,-1067326869,-1066155370,-1067393767,-1066155379,1751345490,-1066155369
LONG XPIA_#,184=17744,131404,1161521813
LONG XPIA_#,204=554565856,201654539,1536,512
LONG XPIA_#,224=4236,4096,8192,268435456,4096,512,4
LONG XPIA_#,256=4
LONG XPIA_#,264=12288,512
LONG XPIA_#,276=2,1048576,4096,1048576,4096
LONG XPIA_#,300=16,5200,118,4940,40
LONG XPIA_#,344=8192,132
LONG XPIA_#,400=4096,36
LONG XPIA_#,432=1297301837,12851,1222,4096,1536,512
LONG XPIA_#,468=-536870880,1818587694,25455,148,8192,512,2048
LONG XPIA_#,508=1107296320,5124,5106,5092,5078,5064,5048,5030,5136
LONG XPIA_#,652=-1192457387,1,836297,-2014834838,-16777214,93259893,268439588,-1895008769,1058821,276168464,271320463,1979650048,805670676,-15728624,93263989,268439604,-1893960193,1062917,544603920,272369039,1979650048,1074106148
LONG XPIA_#,740=-15728624,93268085,268439620,-1892911617,1067013,813039376,273417615,1979650048,1342541620,-15728624,93272181,268439636,-1891863041,1071109,1081474832,274466191,1438846976,-997987189,-62535684
LONG XPIA_#,820=-40984,-1010200321,-2081649835,1170734276,1276,-11868160,1397817343,1448563281,905925717,268439588,276301199,905908224,268439592,276563343,905908224,268439596,276825487,905908224,268439600,277087631,1031868416
LONG XPIA_#,904=268439676,513,96935541,268439656,1,8356968,-402626048,388,26273872,384499712,276577665,33689600,175439872,275252679,4096,1031864320,268439676,512,12813583,-2073559040,1778385023,21686272,-397410304,342,275266947
LONG XPIA_#,1004=251727872,42117,274753536,568856576,1744830465,268439648,275527167,703074304,-1929379839,1073205,-2093053168,92078335,191,-1862303488,1979711489,26263301,1049165824,274740621,1049300992,-1872232086,1459617793
LONG XPIA_#,1088=6946922,275789311,-471330816,-1929379840,1073205,-2093053168,-1866790969,721420289,130253791,-1872232086,1392508929,-11075478,1078325,12118032,898433024,268439648,23740043,102504,1778870784,905926400,268439672
LONG XPIA_#,1172=39400,1583176704,1532582495,-2076836008,-15728624,1081397,2083913488,-15728624,1079349,-2009727216,-401604592,86,1098441,-2081649835,1170734276,1276,-37820416,905969663,268439592,275514767,905908224,268439596
LONG XPIA_#,1260=275776911,905908224,268439600,276039055,1013452800,1779433489,607518716,-401604592,52,1083555,281200912,637520896,268439576,269755903,637472768,268439568,269231615,637472768,268439560,268707327,637472768,268439552
LONG XPIA_#,1348=270280191,-859041792,4980
LONG XPIA_#,1368=5154,4096
LONG XPIA_#,1396=5124,5106,5092,5078,5064,5048,5030,5136
LONG XPIA_#,1432=1852990827,842230885,1819042862,1245184,1819042115,1684957527,1917876079,4285295,1699152108,1920287604,1349676915,29551,1699152177,1937331060,1869377347,25165938,1684107084,1936880963,4289135,1867317672,1767335286
LONG XPIA_#,1516=2003788910,30998528,1701995347,1867804261,1701407811,29806,1699938803,1920287604,7499635,1699938845,1852397428,1282895716,1097297519,1937047552,842232421,1819042862,1684471808,775041897,7105636,1885434736,1818504809
LONG XPIA_#,1600=108
LONG XPIA_#,1620=1161521813
LONG XPIA_#,1628=5260,1,2,2,5240,5248,5256,4391,4808,5286,5301,65536,1819300703,1702130793,1866673522,1869771886,1852137324,1818504808,1699151980,1769104750,1147499109,1935766625,1635013376,1968403570,1634493282,1852404595,103
LONG XPIA_#,2048=4096,132,816656548,817836214,819015880,820195546,821375212,822554878,823734544,827863330,828649822,829436266,830222710,831009154,833761684,835203518,838218218,839266816,842150417,844182086,847000177,849556112
LONG XPIA_#,2136=850342569,851129013,853684956,854471400,855257844,856109823,857486097,858272546,859058990,859845434,13126
XPIA$=$TEMPDIR+/_Splitter-Control_enh.dll
FILEMODE 1
ASSIGN #1,XPIA$
OPENRW #1
BLOCKWRITE #1,XPIA_#,0,2560
CLOSERW #1
DISPOSE XPIA_#
@SET(ErrorLevel,0)
DEF GETSYSCOLOR(1) !USER32,GetSysColor
XPIADLL&=USEDLL(XPIA$)
WINDOWSTYLE 543
WINDOW 0,0-640,480
CLS GETSYSCOLOR(15)
USEFONT MS Sans Serif,13,0,0,0,0
SETDIALOGFONT 1
SPLITTER&=CREATE(Button,%HWND,:,200,0,7,400)
LISTBOX1&=CREATE(ListBox,%HWND,0,0,0,200,400)
LISTBOX2&=CREATE(ListBox,%HWND,0,207,0,200,400)
CLEARLIST
ADDWINDOWS
MOVELISTTOLIST(LISTBOX1&)
CLEARLIST
ADDFONTS
MOVELISTTOLIST(LISTBOX2&)
IF 0
EXTERNAL(XPIA$,GeneriereDatas)
ENDIF
EXTERNAL(XPIA$,StartSubclassing,SPLITTER&,%HWND,LISTBOX1&,LISTBOX2&)
WHILE 1
WAITINPUT
IF %KEY=2
BREAK
ENDIF
ENDWHILE
DESTROYWINDOW(%HWND)
FREEDLL XPIADLL&
END
Als Splitter-Control dient ein gesubclasster Button. |
| | | | |
| | Uwe ''Pascal'' Niemeier | Hallo Leute!
Wenn wir schon mal dabei sind...
window 50,50-700,500
declare ReBar&,ReBar#,Lb1&,Lb2&,Lb3&,a#
dim a#,16
Lb1&=create(listbox,%hwnd,,0,0,0,0)
Lb2&=create(listbox,%hwnd,,0,0,0,0)
Lb3&=create(listbox,%hwnd,,0,0,0,0)
clearlist
addwindows
movelisttolist(Lb1&)
clearlist
addfonts
movelisttolist(Lb2&)
clearlist
addfiles *.*
movelisttolist(Lb3&)
clear a#
long a#,0=8
long a#,4=$FFFF---Alles initialisieren
external(comctl32.dll,InitCommonControlsEx,a#)
--Stil: $50000000 | ~CCS_NORESIZE | ~RBS_FIXEDORDER
ReBar&=Control(ReBarWindow32,,$50000804 ,10,10,600,400,%hwnd,1,0)
struct ReBar=Size&,Mask&,Style&,clrFore&,clrBack&,lpText&,cch&,iImage&,hwndChild&,
cxMinChild&,cyMinChild&,cx&,hbmBack&,wID&,cyChild&,cyMaxChild&,cyIntegral&,
cxIdeal&,lParam&,cxHeader&
dim ReBar#,ReBar--REBARBANDINFO
clear ReBar#
with ReBar#
.Size&=sizeof(ReBar#)
.Mask&=$71------RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE
.cyMaxChild&=1--Darf nicht Null sein
.Style&=256------------------------RBBS_NOGRIPPER (1. Band ohne Griff)
.cxMinChild&=5---------------------Minimum Breite
.cyMinChild&=height(ReBar&)--------Höhe des Bandes
.cx&=100---------------------------Vorgabe Breite
.hwndChild&=Lb1&-------------------Band 1
sendmessage(ReBar&,1025,0,ReBar#)--RB_INSERTBAND
.Style&=128------------------------RBBS_GRIPPERALWAYS (folgende Bänder mit Griff)
.cxMinChild&=50--------------------Minimum Breite
.cyMinChild&=200-------------------Höhe des Bandes
.cx&=300---------------------------Vorgabe Breite
.hwndChild&=Lb2&-------------------Band 2
sendmessage(ReBar&,1025,1,ReBar#)--RB_INSERTBAND
.cxMinChild&=10--------------------Minimum Breite
.cyMinChild&=300-------------------Höhe des Bandes
.hwndChild&=Lb3&-------------------Band 3
sendmessage(ReBar&,1025,2,ReBar#)--RB_INSERTBAND
endwith
while 1
waitinput
if sendmessage(ReBar&,1051,0,0) > height(ReBar&)--1051 = RB_GETBARHEIGHT
clear a#--Umklappen rückgängig, falls Gripper nach unten gezogen wurde
sendmessage(ReBar&,1047,0,a#)--RB_SIZETORECT
endif
endwhile
Obwohl es ja eigendlich in den Bereich CodeSnippets gehört... Aber es passt halt grad zum Thema.
SeeYou Pascal |
| | | | |
| | | Wow das wusste ich ja garnicht! Das ist einfach super! |
| | | | |
| | | Schöne Idee das ReBar so zu *mißbrauchen* Hab mit ReBar noch nicht viel gemacht, weil erstellen ist einfach, aber Verwaltung nicht (wenn man es als Toolbar-Ersatz nutzt) |
| | | | |
| | Frank Abbing | ReBar nach unten ziehen funktioniert noch nicht ganz. Die Controls verschwinden und sind erst beim nächsten Klick wieder da. Ansonsten: Coole Idee! |
| | | | |
| | Uwe ''Pascal'' Niemeier | Hallo Leute!
[quote:a0651eeb8e]ReBar nach unten ziehen funktioniert noch nicht ganz. Die Controls verschwinden und sind erst beim nächsten Klick wieder da. [/quote:a0651eeb8e] Bei entsprechender Einstellung des ReBars werden die Bänder (Seiten des Splitters) dann untereinander angezeigt. Über den Stil konnte ich das bisher nicht unterdrücken, und Profan erkennt die entsprechende Notify-Message nicht. Im Ernstfall hilft da nur SubClassing des Parents
Ganz haarig wird das bei mehreren ineinander verschachtelten horizontalen und vertikalen ReBars...
SeeYou Pascal |
| | | | |
| | Rolf Koch | Echt genial! Da kann man wirklich feinste Sachen mit machen. Leider bekomme ich soetwas wie unten im Bild nicht hin, das wäre die Steigerung schlechthin. Bedeutet ja, man müsste die Header mit Bitmaps austauschen können. Ich versuchs mal weiter, falls soetwas mit Rebar überhaupt möglich ist.
window 50,50-700,500
USEFONT MS Sans Serif,13,0,0,0,0
SETDIALOGFONT 1
declare ReBar&,ReBar#,Lb1&,Lb2&,Lb3&,a#
dim a#,16
DECLARE a1&,b1&,c1&
DECLARE a2&,c1&,c2&,c3&
DECLARE a3&
Lb1&=create(text,%hwnd,,0,0,0,0)
CREATE(TEXT,lb1&,Seite 1,0013,0013,0130,0014)
a1& = CREATE(RADIOBUTTON,lb1&,Check Me Seite 1 A,0013,0033,0120,0017)
a2& = CREATE(RADIOBUTTON,lb1&,Check Me Seite 1 B,0013,0053,0120,0017)
a3& = CREATE(RADIOBUTTON,lb1&,Check Me Seite 1 C,0013,0073,0120,0017)
Lb2&=create(text,%hwnd,,0,0,0,0)
CREATE(TEXT,lb2&,Seite 2,0013,0013,0130,0014)
b1& = CREATE(RADIOBUTTON,lb2&,Check Me Seite 2 A,0013,0033,0120,0017)
b2& = CREATE(RADIOBUTTON,lb2&,Check Me Seite 2 B,0013,0053,0120,0017)
b3& = CREATE(RADIOBUTTON,lb2&,Check Me Seite 2 C,0013,0073,0120,0017)
Lb3&=create(text,%hwnd,,0,0,0,0)
CREATE(TEXT,lb3&,Seite 3,0013,0013,0130,0014)
c1& = CREATE(RADIOBUTTON,lb3&,Check Me Seite 3 A,0013,0033,0120,0017)
c2& = CREATE(RADIOBUTTON,lb3&,Check Me Seite 3 B,0013,0053,0120,0017)
c3& = CREATE(RADIOBUTTON,lb3&,Check Me Seite 3 C ,0013,0073,0120,0017)
clear a#
long a#,0=8
long a#,4=$FFFF---Alles initialisieren
external(comctl32.dll,InitCommonControlsEx,a#)
--Stil: $50000000 | ~CCS_NORESIZE | ~RBS_FIXEDORDER
ReBar&=Control(ReBarWindow32,,$50000884 ,10,10,300,400,%hwnd,1,0)
struct ReBar=Size&,Mask&,Style&,clrFore&,clrBack&,lpText&,cch&,iImage&,hwndChild&,
cxMinChild&,cyMinChild&,cx&,hbmBack&,wID&,cyChild&,cyMaxChild&,cyIntegral&,
cxIdeal&,lParam&,cxHeader&
dim ReBar#,ReBar--REBARBANDINFO
clear ReBar#
with ReBar#
.Size&=sizeof(ReBar#)
.Mask&=$73 ------RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE
.cyMaxChild&=1--Darf nicht Null sein
.Style&=128------------------------RBBS_GRIPPERALWAYS (folgende Bänder mit Griff)
.cxMinChild&=5---------------------Minimum Breite
.cyMinChild&=height(ReBar&)--------Höhe des Bandes
.cx&=100---------------------------Vorgabe Breite
.hwndChild&=Lb1&-------------------Band 1
sendmessage(ReBar&,1025,0,ReBar#)--RB_INSERTBAND
sendmessage(ReBar&,2048,0,ReBar#)--RB_INSERTBAND
.Style&=128------------------------RBBS_GRIPPERALWAYS (folgende Bänder mit Griff)
.cxMinChild&=5--------------------Minimum Breite
.cyMinChild&=height(ReBar&)-------------------Höhe des Bandes
.cx&=100---------------------------Vorgabe Breite
.hwndChild&=Lb2&-------------------Band 2
sendmessage(ReBar&,1025,1,ReBar#)--RB_INSERTBAND
.cxMinChild&=5--------------------Minimum Breite
.cyMinChild&=height(ReBar&)-------------------Höhe des Bandes
.hwndChild&=Lb3&-------------------Band 3
sendmessage(ReBar&,1025,2,ReBar#)--RB_INSERTBAND
endwith
while 1
waitinput
if sendmessage(ReBar&,1051,0,0) > height(ReBar&)--1051 = RB_GETBARHEIGHT
clear a#--Umklappen rückgängig, falls Gripper nach unten gezogen wurde
sendmessage(ReBar&,1047,0,a#)--RB_SIZETORECT
endif
endwhile
|
| | | | |
| | Rolf Koch | Wow, ich habs. Das Rebarteil lässt sich aber gut verarschen *lol* Ich bastel noch ein bisschen und dann lege ich es mal hierhin |
| | | | |
| | | | | | | |
| | | | - Seite 3 - |
| | Rolf Koch | *lol* Hier meine kleine Idee und Umsetzung. [...]
Läuft bei mir einwandfrei mit der XProfan Version: 10.0ß-NT RC1. Könnt mir ja mal schreiben, wie es natürlich wieder mal woanders Probleme macht |
| | | | |
| | | Genial Rolf! Das Result sieht einfach spitze aus! |
| | | | |
| | Rolf Koch | also scheints doch zu laufen - Der Dank gilt vorallem an Pascal, da er hier den Grundstock geliefert hat. Da kann man noch mehr draus machen. |
| | | | |
|
AntwortenThemenoptionen | 20.229 Betrachtungen |
ThemeninformationenDieses Thema hat 8 Teilnehmer: |