Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Inputbox modal anzeigen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ffhex



Anmeldungsdatum: 24.02.2012
Beiträge: 11
Wohnort: Jena

BeitragVerfasst am: 25.02.2012, 18:07    Titel: Inputbox modal anzeigen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 26.02.2012, 12:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 26.02.2012, 13:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ffhex



Anmeldungsdatum: 24.02.2012
Beiträge: 11
Wohnort: Jena

BeitragVerfasst am: 26.02.2012, 19:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 26.02.2012, 20:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
RWK



Anmeldungsdatum: 04.07.2011
Beiträge: 44

BeitragVerfasst am: 27.02.2012, 15:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ffhex



Anmeldungsdatum: 24.02.2012
Beiträge: 11
Wohnort: Jena

BeitragVerfasst am: 27.02.2012, 20:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz