|
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 |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 27.11.2017, 22:16 Titel: WinApi mit Screenres? |
|
|
Kann man Funktionen der WinApi (Checkbox, Radiobuttons, ...) bei einem mit Screenres erstellten Fenster anwenden? Oder geht das nur mit diesem (hWnd = CreateWindow ...)? Das wäre schon toll, wenn man eine Trackbar auf ein mit Screenres erstellten Fenster anwenden könnte! Vielleicht kennt einer eine Lösung?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1220 Wohnort: Ruhrpott
|
Verfasst am: 28.11.2017, 13:53 Titel: |
|
|
Meintest du sowas?
Code: | #Include Once "windows.bi"
Dim As Integer style
Dim As HWND fensterhandle
Dim As RECT r
ScreenRes 400,300,32
fensterhandle = GetForegroundWindow()
style = GetWindowLong(fensterhandle, GWL_STYLE)
GetWindowRect(fensterhandle, @r)
SetWindowLong(fensterhandle, GWL_STYLE, style Or WS_VSCROLL Or WS_HSCROLL)
SetWindowPos(fensterhandle, HWND_TOP, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_DRAWFRAME)
Sleep |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 28.11.2017, 18:49 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Meintest du sowas?
Code: | #Include Once "windows.bi"
Dim As Integer style
Dim As HWND fensterhandle
Dim As RECT r
ScreenRes 400,300,32
fensterhandle = GetForegroundWindow()
style = GetWindowLong(fensterhandle, GWL_STYLE)
GetWindowRect(fensterhandle, @r)
SetWindowLong(fensterhandle, GWL_STYLE, style Or WS_VSCROLL Or WS_HSCROLL)
SetWindowPos(fensterhandle, HWND_TOP, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_DRAWFRAME)
Sleep |
Gruß
grindstone | Nicht ganz, denn auf dem Fenster müsste bzw. sollte ein Radiobutton oder eine Checkbox, ... sein. Aber das würde schon in die richtige Richtung gehen.
Gemeint ist: Ich erstelle ein Fenster mit ScreenRes und auf dem Fenster kann man einen der verschiedenen Radiobuttons anklicken.
Keine Ahnung ob so etwas geht?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 29.11.2017, 11:53 Titel: |
|
|
Er hat dir ja auch nur ein Beispiel gegeben, nicht dein Programm fertig geschrieben. Mit dem Fenster Handle kannst du einfach deine WinAPI Befehle verwenden und tun und lassen, was du möchtest.
Übrigens: Mit ScreenControl kriegst du das Fenster Handle direkt raus, ohne auf das Fenster im Vordergrund zu vertrauen. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1220 Wohnort: Ruhrpott
|
Verfasst am: 29.11.2017, 12:21 Titel: |
|
|
@ALWIM:
Sicher geht das, der Aufwand ist aber genauso groß wie bei einem "echten" Windows - Fenster.
MOD hat Folgendes geschrieben: | Mit ScreenControl kriegst du das Fenster Handle direkt raus, ohne auf das Fenster im Vordergrund zu vertrauen. | Stimmt, das ist besser. Der Mensch ist halt ein Gewohnheitstier...
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 29.11.2017, 15:57 Titel: |
|
|
MOD hat Folgendes geschrieben: | Er hat dir ja auch nur ein Beispiel gegeben, nicht dein Programm fertig geschrieben. Mit dem Fenster Handle kannst du einfach deine WinAPI Befehle verwenden und tun und lassen, was du möchtest.
Übrigens: Mit ScreenControl kriegst du das Fenster Handle direkt raus, ohne auf das Fenster im Vordergrund zu vertrauen. | Ein fertiges Programm will ich ja gar nicht! Nur die Antwort ob es möglich ist.
grindstone hat Folgendes geschrieben: | @ALWIM:
Sicher geht das, der Aufwand ist aber genauso groß wie bei einem "echten" Windows - Fenster. |
Wenn es geht, ist es ja gut. Dann schaue ich mal wie es geht. Mir ist nur noch nicht ganz klar, wo ich das normale mit "Sreenres" erstellte Fenster angebe.
Ich danke vielmals für die Hilfe!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 29.11.2017, 16:20 Titel: |
|
|
Wie MOD schon gesagt hat, bekommst du mit SCREENRES und GET_WINDOW_HANDLE das Handle, das du dann wie ein beliebiges anderes Fenster-Handle verwenden kannst. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1220 Wohnort: Ruhrpott
|
Verfasst am: 29.11.2017, 18:26 Titel: |
|
|
Ich habe vor einiger Zeit schon mal was in diese Richtung probiert, es dann aber mangels Erfordernis nicht weiterverfolgt. Mal sehen, ob ich es wiederfinde und ein kleines Beispiel daraus basteln kann.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1220 Wohnort: Ruhrpott
|
Verfasst am: 30.11.2017, 13:52 Titel: |
|
|
Jetzt weiß ich wieder, wo ich damals hängengeblieben bin: Der Grafikscreen weigert sich hartnäckig, das Kindfenster anzuzeigen.
Code: | #Include Once "windows.bi"
#Include "fbgfx.bi"
Using fb
Dim Shared As LONG_PTR PrevWindowProc
Dim Shared As HWND fensterhandle, hButton
Dim Shared As Long instanz
Declare Function umleitung(hWnd As HWND, uMsg As UINT, wParam As WPARAM, lParam As LPARAM ) As Integer
ScreenRes 400,300,32
fensterhandle = GetForegroundWindow()
'ScreenControl GET_WINDOW_HANDLE, fensterhandle
? "fensterhandle ";fensterhandle
instanz = GetWindowLong(fensterhandle, GWL_HINSTANCE)
hButton = CreateWindowEx(WS_EX_WINDOWEDGE, "BUTTON", "ButtoN", _
WS_VISIBLE Or WS_CHILD Or BS_GROUPBOX, _ ' // Styles
5, 5, 10, 30, _
fensterhandle, 1, instanz, NULL)
ShowWindow(hButton, SW_SHOW)
? "hButton ";hButton
? "Button ID";GetDlgCtrlID(hButton)
PrevWindowProc = SetWindowLongPtr(fensterhandle, GWLP_WNDPROC, Cast(Integer,@umleitung))
Sleep
Function umleitung(hWnd As HWND, uMsg As UINT, wParam As WPARAM, lParam As LPARAM ) As Integer
Locate 10,1
? "umleitung";Timer
? String(50, " ")
Locate 11, 1
? hWnd;Tab(10);uMsg;Tab(20);wParam;Tab(30);lParam
Select Case uMsg
Case WM_SIZE
MoveWindow(hButton, LOWORD(lParam) / 2 - 80, HIWORD(lParam) - 30, 160, 22, TRUE)
Return 0
Case Else
Return CallWindowProc(Cast(WNDPROC, PrevWindowProc), hWnd, uMsg, wParam, lParam )
End Select
Return 0
End Function |
Wie man sieht, wurde das Kindfenster ordnungsgemäß erstellt, und die Umleitung der Fensterprozedur funktioniert auch (zum Testen einmal mit der Maus drüberfahren).
Ebenso zeigt ein Scan der Fensterhandles, daß der Button dem Grafikscreen ordnungsgemäß als Kindfenster zugeordnet ist.
...
C 328664
C 721780
P 4260756 neuerStyle2_u
C 3605392 ButtoN
P 3736558 D:\basic\freeBasic\GUI\neuerStyle2_u.exe
P 328608 Das deutsche QBasic- und FreeBASIC-Forum :: Antwort schreiben - Mozilla Firefox
P 1245696 FreeBASIC - Referenz
C 1180164
...
Irgend jemand eine Idee, wo es hakt?
Gruß
grindstone
Ach ja: Mit SCREENCONTROL (darum auskommentiert) bekomme ich die Fehlermeldung: neuerStyle2_u.bas(15) error 98: No matching overloaded function, SCREENCONTROL() in 'ScreenControl GET_WINDOW_HANDLE, fensterhandle' _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1220 Wohnort: Ruhrpott
|
Verfasst am: 30.11.2017, 15:54 Titel: |
|
|
OK, das Problem mit der Anzeige habe ich gelöst. Das Grafikfenster muß (zusätzlich) den Stil WS_CLIPCHILDREN bekommen:
Code: | #Include Once "windows.bi"
#Include "fbgfx.bi"
Using fb
Dim Shared As LONG_PTR PrevWindowProc, PrevButtonProg
Dim Shared As HWND fensterhandle, hButton
Dim Shared As Long instanz
Declare Function umleitung(hWnd As HWND, uMsg As UINT, wParam As WPARAM, lParam As LPARAM ) As Integer
ScreenRes 400,300,32
fensterhandle = GetForegroundWindow()
'ScreenControl GET_WINDOW_HANDLE, fensterhandle
? "fensterhandle ";fensterhandle
SetWindowLong(fensterhandle, GWL_STYLE, GetWindowLong(fensterhandle, GWL_STYLE) Or WS_CLIPCHILDREN)
instanz = GetWindowLong(fensterhandle, GWL_HINSTANCE)
hButton = CreateWindowEx(WS_EX_WINDOWEDGE, "BUTTON", "ButtoN", _
WS_VISIBLE Or WS_CHILD, _ ' // Styles
100, 30, 100, 30, _
fensterhandle, Cast(HMENU, 1), Cast(HINSTANCE, instanz), NULL)
UpdateWindow(fensterhandle)
? "hButton ";hButton
? "Button ID";GetDlgCtrlID(hButton)
PrevWindowProc = SetWindowLongPtr(fensterhandle, GWLP_WNDPROC, Cast(Integer,@umleitung))
Dim As MSG uMsg
Do While GetMessage(@uMsg, NULL, NULL, NULL)
TranslateMessage(@uMsg)
DispatchMessage(@uMsg)
Loop
Function umleitung(hWnd As HWND, uMsg As UINT, wParam As WPARAM, lParam As LPARAM ) As Integer
Static As Double zeitmerken
Locate 10,1
? "umleitung";Timer
? String(50, " ")
Locate 11, 1
? hWnd;Tab(10);uMsg;Tab(20);wParam;Tab(30);lParam
If Timer > zeitmerken Then
Locate 20,10
? " "
EndIf
Select Case uMsg
Case WM_COMMAND
Select Case lParam
Case hButton
Locate 20,10
? "TUUUUUUUUUUUUT!"
zeitmerken = Timer + 1
End Select
Case Else
Return CallWindowProc(Cast(WNDPROC, PrevWindowProc), hWnd, uMsg, wParam, lParam )
End Select
Return 0
End Function |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 01.12.2017, 16:25 Titel: |
|
|
Habe es mal getestet. Es funktioniert auch mit einem Radiobutton ohne Probleme! Nun muss ich nur noch schauen, was ich genau brauche und es dementsprechend programmieren.
Danke für die Hilfe!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1220 Wohnort: Ruhrpott
|
Verfasst am: 01.12.2017, 16:48 Titel: |
|
|
Gern geschehen. Wie man allerdings bei diesem "Fensterln" ohne Trickserei oder Multithreading noch ein normales Programm laufen lassen kann, entzieht sich leider (immer noch) meiner Kenntnis.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Lothar Schirm
Anmeldungsdatum: 24.04.2006 Beiträge: 64 Wohnort: Bayern
|
Verfasst am: 10.01.2020, 17:55 Titel: WinApi mit ScreenRes |
|
|
Ich habe mal sowas probiert, sieht ziemlich einfach aus: SCREENRES mit einem Button und einer Editbox. In die Editbox kann man was reinschreiben, und wenn man den Button drückt, wird der Text auf das Konsolenfenter kopiert.
Code: | 'EditBox_Screen.bas
'Multiline Editbox mit ScreenRes
#Include "windows.bi"
'#include "fbgfx.bi"
'Using FB
Dim As MSG msg
Dim As HWND hWnd, btn1, edt1
Dim As Long textsize
Dim As String text
'Graphikfenster:
ScreenRes 500, 300, 32
WindowTitle "Hello"
Color 0, &HFFFFFF
Cls
hWnd = GetForegroundWindow()
'ScreenControl GET_WINDOW_HANDLE, hWnd <--- funktioniert nicht - Fehlermeldung!
' Create window
'hWnd = CreateWindowEx( 0, "#32770", "Hello", WS_OVERLAPPEDWINDOW Or WS_VISIBLE, 100, 100, 500, 300, 0, 0, 0, 0 )
' Button:
btn1 = CreateWindowEx( 0, "BUTTON", "Copy text to console", WS_VISIBLE Or WS_CHILD, 20, 10, 150, 20, hWnd, 0, 0, 0 )
' Editbox:
edt1 = CreateWindowEx( 0, "EDIT", "Type text here...",ws_border Or WS_VISIBLE Or WS_CHILD Or WS_HSCROLL Or WS_VSCROLL Or ES_AUTOHSCROLL Or ES_AUTOVSCROLL Or ES_MULTILINE, 20, 50, 400, 200, hWnd, 0, 0, 0 )
While GetMessage( @msg, 0, 0, 0 )
TranslateMessage( @msg )
DispatchMessage( @msg )
Select Case msg.hwnd
Case hWnd
If msg.message = 273 Then End
Case btn1 'Text aus der Editbox ins Konsolenfenster
If msg.message = WM_LBUTTONDOWN Then
textSize = GetWindowTextLength(edt1)
text = Space(textsize)
GetWindowText(edt1, text, textsize + 1)
text = RTrim(text, Chr(0))
Open Cons For Output As #1
Print #1, text
Close #1
End If
End Select
Wend
End |
Wer die Original Windows-Syntax mit den vielen Nullen nicht mag, kann ja mal meine WinGUI Bibliothek ausprobieren .https://www.freebasic-portal.de/downloads/bibliotheken/wingui-eine-einfache-winapi-gui-bibliothek-358.html. Die ist zwar für eine WindowsDialogbox (Konstante "#32770") konzipert, basiert eber auf der gleiche Methode wie dieses Beispiel und müsste so auch auf einem SCREENRES-Fenster funktionieren. |
|
Nach oben |
|
|
Lothar Schirm
Anmeldungsdatum: 24.04.2006 Beiträge: 64 Wohnort: Bayern
|
Verfasst am: 11.01.2020, 18:01 Titel: WinAPI mit ScreenRes |
|
|
Hier kommt eine bereinigte und "verbesserte" Version, da die Windows Message Nr. 273 beim FB Screen nicht erscheint, d.h. das Fenster muss durch die Abfrage inkey = Chr(255, 107) geschlossen werden:
Code: | 'EditBox_Screen.bas
'Multiline Editbox mit ScreenRes
'12.01.2020
'Stürzt ab wenn man in der Menüleiste rumfummelt
'Messagebox löscht controls
#Include "windows.bi"
#Include "fbgfx.bi"
Dim As MSG msg
Dim As HWND hWnd, btn_copy, btn_close, edt
Dim As Long textsize
Dim As String text
'Graphikfenster:
ScreenRes 500, 300, 32
WindowTitle "Hello"
Color 0, &HFFFFFF
Cls
hWnd = GetForegroundWindow()
' Buttons:
btn_copy = CreateWindowEx( 0, "BUTTON", "Copy text to console", WS_VISIBLE Or WS_CHILD, 20, 10, 150, 20, hWnd, 0, 0, 0 )
btn_close = CreateWindowEx( 0, "BUTTON", "Close", WS_VISIBLE Or WS_CHILD, 400, 260, 80, 20, hWnd, 0, 0, 0 )
' Editbox:
edt = CreateWindowEx( 0, "EDIT", "Type text here...",ws_border Or WS_VISIBLE Or WS_CHILD Or WS_HSCROLL Or WS_VSCROLL Or ES_AUTOHSCROLL Or ES_AUTOVSCROLL Or ES_MULTILINE, 20, 50, 400, 200, hWnd, 0, 0, 0 )
Do
GetMessage( @msg, 0, 0, 0 )
TranslateMessage( @msg )
DispatchMessage( @msg )
Select Case msg.hwnd
Case btn_copy
If msg.message = WM_LBUTTONDOWN Then
'Text aus der Editbox ins Konsolenfenster kopieren:
textSize = GetWindowTextLength(edt)
text = Space(textsize)
GetWindowText(edt, text, textsize + 1)
text = RTrim(text, Chr(0))
Open Cons For Output As #1
Print #1, text
Close #1
' Messagebox (0, "Text kopiert!", "Info!", 0) <--- löscht Teile des Fensters!!!
End If
Case btn_close
If msg.message = WM_LBUTTONDOWN Then Exit Do
End Select
Loop Until inkey = Chr(255, 107)
End
|
Funktioniert aber auch nicht ganz zuverlässig, und es gibt Fehler, die im Code kommentiert sind. Ich würde abraten WinAPI auf dem FB Screen zu verwenden. |
|
Nach oben |
|
|
Lothar Schirm
Anmeldungsdatum: 24.04.2006 Beiträge: 64 Wohnort: Bayern
|
Verfasst am: 04.02.2020, 20:51 Titel: |
|
|
Hier ist ein modifiziertes entbuggtes Beispiel:
Code: | '===============================================================================
' EditBox_Screen.bas
' Multiline Editbox mit ScreenRes
' Erstellt am 12.01.2020
' Letzte Bearbeitung am 04.02.2020
'===============================================================================
#Include "windows.bi"
Dim As MSG msg
Dim As HWND hwnd, btn_copy, btn_close, edt1, edt2
Dim As Long textsize
Dim As String text
'Fenster:
ScreenRes 500, 600, 32
WindowTitle "GUI auf Grafikfenster"
Color 0, &HFFFFFF
Cls
'Maus darf nicht im Windows-Menü herumklicken, sonst gibt es Abstürze
SetMouse(,,,1) 'clipped to graphics window
'Windowhandle des Fensters ermitteln:
hWnd = GetForegroundWindow()
' Buttons:
btn_copy = CreateWindowEx( 0, "BUTTON", "Copy text ", WS_VISIBLE Or WS_CHILD, 20, 10, 100, 20, hWnd, 0, 0, 0 )
btn_close = CreateWindowEx( 0, "BUTTON", "Close", WS_VISIBLE Or WS_CHILD, 340, 500, 80, 20, hWnd, 0, 0, 0 )
' Editboxen:
edt1 = CreateWindowEx( 0, "EDIT", "Type text here...",ws_border Or WS_VISIBLE Or WS_CHILD Or WS_HSCROLL Or WS_VSCROLL Or ES_AUTOHSCROLL Or ES_AUTOVSCROLL Or ES_MULTILINE, 20, 50, 400, 200, hWnd, 0, 0, 0 )
edt2 = CreateWindowEx(0, "Edit", "", ws_border Or WS_VISIBLE Or WS_CHILD Or WS_HSCROLL Or WS_VSCROLL Or ES_AUTOHSCROLL Or ES_AUTOVSCROLL Or ES_READONLY Or ES_MULTILINE, 20, 280, 400, 200, hWnd, 0, 0, 0 )
Do
GetMessage( @msg, 0, 0, 0 )
TranslateMessage( @msg )
DispatchMessage( @msg )
Select Case msg.hwnd
Case btn_copy
If msg.message = WM_LBUTTONDOWN Then
'Text aus der Editbox1 in die Editbox2 kopieren:
textSize = GetWindowTextLength(edt1)
text = Space(textsize)
GetWindowText(edt1, text, textsize + 1)
text = RTrim(text, Chr(0))
SetWindowText(edt2, text)
End If
Case btn_close
If msg.message = WM_LBUTTONDOWN Then Exit Do
End Select
Loop
End |
Wichtig ist der Befehl "SetMouse(,,,1)", damit die Maus nicht ins System-Menü des Fensters kommt. Man muss das Fenster dann eben mit einem extra "Close"-Button schließen. Und eine Messagebox habe ich auch nicht verwendet. Vielleicht erfinde ich noch ein Beispiel, wo man ein Windows-GUI im FreeBASIC Screen zusammen mit der GFX Library von FreeBASIC verwenden kann, sonst hat man ja eigentlich keinen Vorteil davon.
Es ist übrigens genau so einfach, das obige Beispiel für das Konsolenfenster zu verwenden (einfach Screen 0 statt ScreenRes) , jedoch kann man dann die Maus nicht hindern, im System-Menü herumzuklicken, und das kann dann wieder zu Abstürzen führen. |
|
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.
|
|