Simpler Requester mit DialogBoxIndirectParam
Verfasst: 24.01.2010 13:31
naja simpel ist Ansichtssache, aber doch relativ einfach
Der Gestaltung ist keine Grenzen gesetzt. Erklärungen im Code
sollten Fehler vorhanden sein, bitte melden, my english very
Der Gestaltung ist keine Grenzen gesetzt. Erklärungen im Code
sollten Fehler vorhanden sein, bitte melden, my english very


Code: Alles auswählen
;DialogBox by HJBremer Jan. 2010
Enumeration
#fnt1
#fnt2
#win
#db1
EndEnumeration
;Structure DLGTEMPLATE ;in PB bereits definiert
; style.i ;Fensterstile
; dwExtendedStyle.i ;??
; cdit.w ;immer null
; x.w ;wenn #DS_Center null
; y.w ;sonst posi vom Dialog
; cx.w ;breite + höhe, im Dialog werden sogenannte Dialog Units
; cy.w ;benutzt, diese sind doppelt so groß
;EndStructure
Structure DLG_TEMPLATE Extends DLGTEMPLATE
x1.w ;folgende Werte x1 bis x3 müssen sein, sagt die MSDN
x2.w ;ohne gehts auch nicht.
x3.w ;
EndStructure
Structure DLG_PARAMETER ;kann beliebig erweitert werden
titel.s ;um den Dialog zu steuern
text.s
vg.s
eingabe.s
fontid.i
EndStructure
Procedure myInputRequesterDlgProc(hwnd, msg, wparam, lparam)
;folgende Variablen müssen Static sein, da sie auch ausserhalb von
;#WM_INITDIALOG gebraucht werden
Static *p.DLG_PARAMETER ;Zeiger auf Parameter Structur
Static oknr, abnr, stnr ;Gadgetnummern
;folgende Variablen werden nur in #WM_INITDIALOG benutzt beim Aufruf
Protected nr ;allgemeine Gadgetnr für diverse Gadgets
Protected wbr, whh, r.rect ;reale Werte vom Dialogfenster
Protected sp, ze ;Hilfsvariablen
Select msg
Case #WM_INITDIALOG
*p = lparam
;wenn style mit #WS_SYSMENU|#WS_CAPTION
;SetWindowText_(hwnd, *p\titel)
imgnr = CreateImage(#PB_Any, 220, 42)
StartDrawing(ImageOutput(imgnr))
Box(0,0,220,42,#Red)
StopDrawing()
GetClientRect_(hwnd, r.rect)
wbr = r\right - r\left ;:Debug wbr
whh = r\bottom - r\top ;:Debug whh
UseGadgetList(hwnd)
nr = TextGadget(#PB_Any, 10, 10, 100, 22, *p\titel)
SetGadgetFont(nr, *p\fontid)
nr = TextGadget(#PB_Any, 10, 50, 100, 22, *p\text)
SetGadgetFont(nr, *p\fontid)
nr = ImageGadget(#PB_Any, 5, 90, 0, 0, ImageID(imgnr))
stnr = StringGadget(#PB_Any, 15, 100, 200, 22, *p\vg)
SetGadgetFont(stnr, *p\fontid)
sp = 10
ze = whh - 22 - 10
oknr = ButtonGadget(#PB_Any, sp, ze, 100, 22, "Ok")
abnr = ButtonGadget(#PB_Any, sp + 110, ze, 100, 22, "abbrechen")
oknr & $FFFF ;muß sein, sonst kann man bei #WM_COMMAND
abnr & $FFFF ; die Gadgetnummern nicht abfragen
Case #WM_COMMAND
If wparam = oknr Or wparam = 1 ;wparam = 1 = Return
*p\eingabe = GetGadgetText(stnr)
EndDialog_(hwnd, wparam)
ElseIf wparam = abnr
*p\eingabe = ""
EndDialog_(hwnd, 0)
EndIf
;Case #WM_CLOSE ;wenn style mit #WS_SYSMENU|#WS_CAPTION
; *p\eingabe = ""
; EndDialog_(hwnd, 0)
EndSelect
ProcedureReturn 0
EndProcedure
Procedure.s myInputRequester(titel$, text$, vorgabe$)
Static dlg.DLG_TEMPLATE
Static ipr.DLG_PARAMETER
Protected nr = GetActiveWindow()
dlg\style = #WS_POPUP|#DS_CENTER|#DS_MODALFRAME ;|#WS_SYSMENU|#WS_CAPTION
dlg\cx = 200 ;Breite, im Dialog der doppelte Wert
dlg\cy = 100 ;Höhe
ipr\titel = titel$
ipr\text = text$
ipr\vg = vorgabe$
ipr\fontid = FontID(#fnt2)
DialogBoxIndirectParam_(0, dlg, WindowID(nr), @myInputRequesterDlgProc(), ipr)
ProcedureReturn ipr\eingabe
EndProcedure
LoadFont(#fnt1, "Arial", 8)
LoadFont(#fnt2, "Arial", 11)
OpenWindow(#win, 0, 0, 555, 333, "Test", #PB_Window_SystemMenu|1)
ButtonGadget(#db1, 22, 222, 111, 33, "Dialog Test")
Repeat: event = WaitWindowEvent()
If event = #PB_Event_Gadget Or event = #PB_Event_Menu
wB = EventGadget()
Select wB
Case #db1
vg$ = "hjb"
input$ = myInputRequester("Suchen", "ihre Eingabe", vg$)
If input$
Debug input$
Else
Debug "Abbruch"
EndIf
EndSelect
EndIf
Until event = #PB_Event_CloseWindow
End