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:

WinApi mit Screenres?

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



Anmeldungsdatum: 08.08.2006
Beiträge: 946
Wohnort: Niederbayern

BeitragVerfasst am: 27.11.2017, 21:16    Titel: WinApi mit Screenres? Antworten mit Zitat

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



Anmeldungsdatum: 03.10.2010
Beiträge: 789
Wohnort: Ruhrpott

BeitragVerfasst am: 28.11.2017, 12:53    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 08.08.2006
Beiträge: 946
Wohnort: Niederbayern

BeitragVerfasst am: 28.11.2017, 17:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 990

BeitragVerfasst am: 29.11.2017, 10:53    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 03.10.2010
Beiträge: 789
Wohnort: Ruhrpott

BeitragVerfasst am: 29.11.2017, 11:21    Titel: Antworten mit Zitat

@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... grinsen


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 946
Wohnort: Niederbayern

BeitragVerfasst am: 29.11.2017, 14:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9707
Wohnort: Neben der Festplatte

BeitragVerfasst am: 29.11.2017, 15:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 789
Wohnort: Ruhrpott

BeitragVerfasst am: 29.11.2017, 17:26    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 03.10.2010
Beiträge: 789
Wohnort: Ruhrpott

BeitragVerfasst am: 30.11.2017, 12:52    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 03.10.2010
Beiträge: 789
Wohnort: Ruhrpott

BeitragVerfasst am: 30.11.2017, 14:54    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 08.08.2006
Beiträge: 946
Wohnort: Niederbayern

BeitragVerfasst am: 01.12.2017, 15:25    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 03.10.2010
Beiträge: 789
Wohnort: Ruhrpott

BeitragVerfasst am: 01.12.2017, 15:48    Titel: Antworten mit Zitat

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
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 -> Windows-spezifische Fragen 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