 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ffhex
Anmeldungsdatum: 24.02.2012 Beiträge: 11 Wohnort: Jena
|
Verfasst am: 25.02.2012, 18:07 Titel: Inputbox modal anzeigen |
|
|
Hallo Forum & QB- + FB-Fans,
ich benutze in meiner GUI die InputBox.bi.
http://www.freebasic-portal.de/downloads/sonstiges/inputbox-170.html
Beim Aufruf erhält das InputBox-Fenster den Fokus. Es ist jedoch nicht modal,
d.h. ich kann mit dem Fokus wieder in meine GUI wechseln.
Frage: Wie kann ich erreichen, daß die Inputbox modal angezeigt wird,
d.h. dass ein Wechsel zu meiner GUI-Form erst dann erfolgen kann, wenn die Inputbox geschlossen wurde.
...als IDE für FB benutze ich z.Zt. Firefly3.
Viele Grüsse und vielen Dank für eine Antwort!
FFhex. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 26.02.2012, 12:01 Titel: |
|
|
Bin kein besonderer Fan von der WinAPI und denke das dieser Vorschlag nicht unbedingt der richtige Umgang damit ist;
Aber ein einfaches Code: | SetForegroundWindow(thiswnd) |
am Anfang der Funktion IB_wnd_Proc, vor dem select/case funktioniert... soweit jedenfalls... _________________
 |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 26.02.2012, 13:43 Titel: |
|
|
Schau mal ob es so geht:
Code: | #Include "windows.bi"
Const IB_btnCancel = 1001
Const IB_btnOK = 1002
Const IB_txtInput = 1003
Const IB_lblPrompt = 1004
Declare Function InputBox(ByVal sIB_Title As String, ByVal sIB_Prompt As String, ByVal sIB_Default As String = "") As String
Declare Function IB_Wnd_Proc(byval hWnd as HWND, byval msg as UINT, byval wParam as WPARAM, byval lParam as LPARAM) As LRESULT
Declare Function IB_Create_Wnd(ByVal hWnd As HWND) As LRESULT
Declare Sub IB_Create_Wnd_Content(ByVal parent As HWND)
Dim Shared As HINSTANCE IB_Instance
Dim Shared As HFONT IB_h_Font
Dim Shared As String IB_Result
Dim Shared As String IB_Title
Dim Shared As String IB_Prompt
Dim Shared As String IB_Default
Public Function InputBox(ByVal sIB_Title As String, ByVal sIB_Prompt As String, ByVal sIB_Default As String = "") As String
Dim As HWND hWnd
ScreenControl 2, hWnd
IB_Title = sIB_Title
IB_Prompt = sIB_Prompt
IB_Default = sIB_Default
IB_Instance = GetModuleHandle(null)
IB_h_Font = CreateFont(-13, 0, 0, 0, FW_NORMAL, 0, _
0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, _
DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, "Times New Roman")
IB_Result = ""
IB_Create_Wnd(hWnd)
Return IB_Result
End Function
Function IB_Wnd_Proc(byval hWnd as HWND, byval msg as UINT, byval wParam as WPARAM, byval lParam as LPARAM) As LRESULT
Select Case msg
Case WM_COMMAND
Select Case LoWord(wParam)
Case IB_btnCancel
IB_Result = ""
EndDialog(hWnd, 0)
Case IB_btnOK
Dim As ZString * 31 zIB_Result
GetDlgItemText(hWnd, IB_txtInput, zIB_Result, 30)
IB_Result = zIB_Result
EndDialog(hWnd, 0)
End Select
Case WM_INITDIALOG
IB_Create_Wnd_Content(hWnd)
Case WM_CLOSE
EndDialog(hWnd, 0)
Case Else
Return FALSE
End Select
Return TRUE
End Function
Function lpwAlign(ByVal lpIn As LPWORD) As LPWORD
Dim As ULong ul
ul = Cast(ULong, lpIn)
ul += 1
ul Shl= 1
ul Shr= 1
Return cast(LPWORD, ul)
End Function
Function IB_Create_Wnd(ByVal hWnd As HWND) As LRESULT
Dim As HGLOBAL hgbl
Dim As LPDLGTEMPLATE lpdt
Dim As LPWORD lpw
Dim As LPWSTR lpwsz
Dim As LRESULT ret
hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024)
If (hgbl = 0) Then Return -1
lpdt = Cast(LPDLGTEMPLATE, GlobalLock(hgbl))
' Define a dialog box.
lpdt->style = WS_POPUP Or WS_BORDER Or WS_SYSMENU Or DS_MODALFRAME Or WS_CAPTION
lpdt->cdit = 0 ' Number of controls
lpdt->x = 10: lpdt->y = 10
lpdt->cx = 195: lpdt->cy = 50
lpw = Cast(LPWORD, (lpdt + 1))
*lpw = 0: lpw += 1 ' No menu
*lpw = 0: lpw += 1 ' Predefined dialog box class (by default)
lpwsz = Cast(LPWSTR, lpw)
MultiByteToWideChar(CP_ACP, 0, IB_Title, -1, lpwsz, 50)
GlobalUnlock(hgbl)
ret = DialogBoxIndirect(IB_Instance, Cast(LPDLGTEMPLATE, hgbl), hWnd, Cast(DLGPROC, @IB_Wnd_Proc))
GlobalFree(hgbl)
Return ret
End Function
Sub IB_Create_Wnd_Content(ByVal parent As HWND)
Dim As HWND hWnd
Dim As RECT rect
GetClientRect(parent, @rect)
hWnd = CreateWindowEx(&h00000200, "Edit", IB_Default, &h50010080, rect.left + 8, rect.top + 32, rect.right - 16, 24, parent, Cast(HMENU, IB_txtInput), IB_Instance, null)
SendMessage(hWnd, WM_SETFONT, Cast(WPARAM, IB_h_Font), TRUE)
hWnd = CreateWindowEx(&h00000000, "Static", IB_Prompt, &h50000300, rect.left + 8, rect.top + 8, rect.right - 16, 24, parent, Cast(HMENU, IB_lblPrompt), IB_Instance, null)
SendMessage(hWnd, WM_SETFONT, Cast(WPARAM, IB_h_Font), TRUE)
hWnd = CreateWindowEx(&h00000000, "Button", "Cancel", &h50012F00, rect.right - (96 + 8), rect.top + 64, 96, 32, parent, Cast(HMENU, IB_btnCancel), IB_Instance, null)
SendMessage(hWnd, WM_SETFONT, Cast(WPARAM, IB_h_Font), TRUE)
hWnd = CreateWindowEx(&h00000000, "Button", "OK", &h50012F00, rect.left + 8, rect.top + 64, 96, 32, parent, Cast(HMENU, IB_btnOK), IB_Instance, null)
SendMessage(hWnd, WM_SETFONT, Cast(WPARAM, IB_h_Font), TRUE)
End Sub |
Bei IB_Create_Wnd wird nun kein Fenster sondern eine Dialogbox erstellt, die immer vor dem FB Fenster sein sollte und dieses blockieren sollte. |
|
Nach oben |
|
 |
ffhex
Anmeldungsdatum: 24.02.2012 Beiträge: 11 Wohnort: Jena
|
Verfasst am: 26.02.2012, 19:25 Titel: |
|
|
Hallo,
vielen herzl. Dank für die schnelle Hilfe!
@Eternal_pain: das funzt super!!!
...der User muss die Eingabe in der InputBox erst beenden (oder abbrechen), so sollte es sein! Dabei ist das Mainfenster der Anwendung inaktiv.
@XOR: damit hatte ich im Test (mit Firefly) leider keinen Erfolg. Die Inputbox funktioniert zwar korrekt, jedoch kann ich parallel dazu auf mein Mainfenster klicken, und das ist schlecht.
Kann auch sein dass dieses Verhalten am Firefly liegt. Dort ist es so, dass z.B. eine Messagebox erst dann modal angezeigt wird, wenn an sie das hwnd der aktuellen Form mit übergeben wird, also:
...modale MB: MessageBox( hWndForm, "Nachricht", "Titel", MB_OK)
..nicht modale MB: MessageBox( 0, "Nachricht", "Titel", MB_OK)
Nochmals vielen Dank und viele Grüsse!
FFhex
P.S. Ich programmiere schon viele Jahre QB und VB6. Mit FB (Konsole) und FireFly (als RAD - GUI) komme ich i. allg. sehr gut zurecht. Mit der Windows-API habe ich jedoch noch einige Verständnisprobleme.... |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 26.02.2012, 20:22 Titel: |
|
|
Code: | Public Function InputBox(ByVal sIB_Title As String, ByVal sIB_Prompt As String, ByVal sIB_Default As String = "") As String
Dim As HWND hWnd
ScreenControl 2, hWnd |
würdest du ein FB fenster verwenden, würde es gehen, wenn du deine eigenen Fenster hast, solltest du den Codeabschnitt in folgenden umwandeln:
Code: | Public Function InputBox(ByVal hWnd as HWND, ByVal sIB_Title As String, ByVal sIB_Prompt As String, ByVal sIB_Default As String = "") As String |
Zitat: | ...modale MB: MessageBox( hWndForm, "Nachricht", "Titel", MB_OK) |
das würde dann so aussehen. |
|
Nach oben |
|
 |
RWK
Anmeldungsdatum: 04.07.2011 Beiträge: 44
|
Verfasst am: 27.02.2012, 15:19 Titel: |
|
|
und wenn Du eh FireFly benutzt würde ich auch nicht eine Input Box aufmachen sondern einen neuen Frame aufrufen. Das Fensterchen kann dann modal aufgerufen und je nach gusto gestaltet werden.
Code: |
Function FRMMAIN_CMDONLINE_BN_CLICKED ( ControlIndex As Integer, hWndForm As HWND, hWndControl As HWND, idButtonControl As Integer ) As Integer
Dim hwServ As Long
hwServ = frmOnline_Show( hwnd_frmMain, 1)
|
wobei frmOnline der FrameName des aufzurufenden Fensters im FireFly Project ist und hwnd_frmMain das Handle des aufrufenden Fenster... |
|
Nach oben |
|
 |
ffhex
Anmeldungsdatum: 24.02.2012 Beiträge: 11 Wohnort: Jena
|
Verfasst am: 27.02.2012, 20:26 Titel: |
|
|
Hallo,
vielen Dank für die weiteren Tipps!
@XOR: wenn ich das hWndForm mit an die InputBox übergebe funktioniert es auch bestens im FireFly! (die DIM - und die ScreenControl - Anweisung müssen dann auskommentiert werden)
@RWK: Danke für das Beispiel mit der eigenen Form. Das bringt natürlich den Vorteil, dass man sein eigenes Layout umsetzen kann. Ich wollte ein schnelle Ergebnis und habe die Inputbox bevorzugt. In diesem Fall muss man aber z.B. mit den bereits vordefinierte Fonts leben können.
Viele Grüsse aus Jena.
FFhex |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|