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:

2 Fenster mit CreateWindowEx erstellen

 
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
OrangeTiger



Anmeldungsdatum: 21.02.2008
Beiträge: 17

BeitragVerfasst am: 06.04.2008, 16:21    Titel: 2 Fenster mit CreateWindowEx erstellen Antworten mit Zitat

Hi,
Ich würde gerne 2 Fenster in meinem Programm haben... Fenster0 als Hauptfenster und Fenster1 soll aufgerufen werden, wenn man auf den Button klickt...
Ausserdem sollte man während Fenster1 aktiv ist nicht im Fenster0 Arbeiten können und Wenn Fenster1 geschlossen wird soll sich nicht das ganze Programm beenden sondern nur das Fenster1 schließen und wieder zu Fenster0 zurück kehren.

Soweit bin ich bis jetzt:

Code:
#INCLUDE "windows.bi"

DIM SHARED fenster(1) AS HWND
DIM SHARED wCls AS WNDCLASS
DIM SHARED wMsg AS MSG
DIM SHARED button AS HWND

FUNCTION MainProc(WhWnd AS HWND, wMsg AS UINT, wParam AS WPARAM, lParam AS LPARAM) AS LRESULT
   
    SELECT CASE wMsg
    CASE WM_CREATE
        RETURN 0
    CASE WM_DESTROY
        END
    CASE WM_COMMAND
        SELECT CASE lParam
        CASE button
            'Hier soll jetzt Fenster1 aufgerufen werden
        END SELECT
    END SELECT
    RETURN DefWindowProc(WhWnd, wMsg, wParam, lParam)
   
END FUNCTION

FUNCTION Main(hInstance AS HINSTANCE, hpi AS HINSTANCE, szCmdLine AS STRING, hts AS INTEGER) AS INTEGER

    WITH wCls
        .style = CS_HREDRAW OR CS_VREDRAW
        .lpfnWndProc = @MainProc
        .cbClsExtra = 0
        .cbWndExtra = 0
        .hInstance = hInstance
        .hIcon = LoadIcon(NULL, IDI_APPLICATION)
        .hCursor = LoadCursor(NULL, IDC_ARROW)
        .hbrBackground = GetStockObject(LTGRAY_BRUSH)
        .lpszMenuName = NULL
        .lpszClassName = @"WINDOW"
    END WITH
   
    IF RegisterClass(@wCls) = FALSE THEN
        MessageBox(NULL, "Konnte die Fenterklasse nicht registrieren!", "Registrierungsproblem", MB_OK OR MB_ICONERROR)
        RETURN 1
    END IF
   
    fenster(0) = CreateWindowEx(0, @"WINDOW", "Fenster0", WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_THICKFRAME OR WS_MINIMIZEBOX, _
        CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, NULL, NULL, hInstance, NULL)
    fenster(1) = CreateWindowEx(0, @"WINDOW", "Fenster1", WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_THICKFRAME OR WS_MINIMIZEBOX, _
        CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, NULL, NULL, hInstance, NULL)
   
    button = CreateWindowEx(0, @"BUTTON", "Button", WS_OVERLAPPED OR WS_CHILD, 148, 4, 140, 20, fenster(0), NULL, hInstance, NULL)

    UpdateWindow(fenster(0))
    ShowWindow(fenster(0), SW_SHOW)
    ShowWindow(button, SW_SHOW)

    WHILE GetMessage(@wMsg, fenster(0), 0, 0) <> FALSE
      TranslateMessage(@wMsg)
      DispatchMessage(@wMsg)
    WEND
END FUNCTION

Main(GetModuleHandle(NULL), NULL, COMMAND, SW_SHOW)


MfG OrangeTiger
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 06.04.2008, 19:58    Titel: Antworten mit Zitat

Wie wärs mit...
Code:
    CASE WM_COMMAND
        SELECT CASE lParam
        CASE button
            ShowWindow(fenster(1), SW_SHOW)
        END SELECT
Mal abgesehen dass Fenster 1 keine WndProc hat und somit das Programm automatisch abstürzt wenn man auf den Button klickt.
_________________
Zitat:
1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OrangeTiger



Anmeldungsdatum: 21.02.2008
Beiträge: 17

BeitragVerfasst am: 06.04.2008, 22:16    Titel: Antworten mit Zitat

Ja genau... mit ShowWindow war mir schon klar, aber meine Frage sollte auch eigentlich dadrauf hinauslaufen, wie ich eine 2te WndProc für das Fenster1 mache....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 06.04.2008, 22:33    Titel: Antworten mit Zitat

Nabend,

das funktioniert analog zum Erstellen des ersten Fensters.
1. Klassenstruktur wieder entsprechend ausfüllen. (neue WndProc, neuer Klassenname)
2. Fensterklasse registrieren
3. Fenster erstellen

Code:

FUNCTION SubProc(WhWnd AS HWND, wMsg AS UINT, wParam AS WPARAM, lParam AS LPARAM) AS LRESULT
   
(...)
   
END FUNCTION

    WITH wCls
        .style = CS_HREDRAW OR CS_VREDRAW
        .lpfnWndProc = @SubProc
        .cbClsExtra = 0
        .cbWndExtra = 0
        .hInstance = hInstance
        .hIcon = LoadIcon(NULL, IDI_APPLICATION)
        .hCursor = LoadCursor(NULL, IDC_ARROW)
        .hbrBackground = GetStockObject(LTGRAY_BRUSH)
        .lpszMenuName = NULL
        .lpszClassName = @"SUBWINDOW"
    END WITH
   
    IF RegisterClass(@wCls) = FALSE THEN
        MessageBox(NULL, "Konnte die Fenterklasse nicht registrieren!", "Registrierungsproblem", MB_OK OR MB_ICONERROR)
        RETURN 1
    END IF

    fenster(1) = CreateWindowEx(0, @"SUBWINDOW", "Fenster1", WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_THICKFRAME OR WS_MINIMIZEBOX, _
        CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, NULL, NULL, hInstance, NULL) 
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OrangeTiger



Anmeldungsdatum: 21.02.2008
Beiträge: 17

BeitragVerfasst am: 06.04.2008, 23:35    Titel: Antworten mit Zitat

Joa, funktioniert soweit ganz gut
Code:
        SELECT CASE lParam
        CASE button(0)
            ShowWindow(fenster(1), SW_SHOW)
            WHILE GetMessage(@wMsg, fenster(1), 0, 0) <> FALSE
                TranslateMessage(@wMsg)
                DispatchMessage(@wMsg)
            WEND
            UpdateWindow(fenster(0))
        END SELECT


Code:
FUNCTION NSProc(hWnd1 AS HWND, wMsg1 AS UINT, wParam AS WPARAM, lParam AS LPARAM) AS LRESULT
   
    SELECT CASE wMsg1
    CASE WM_CREATE
        RETURN 0
    CASE WM_DESTROY
        PostQuitMessage(0)
    END SELECT
    RETURN DefWindowProc(hWnd1, wMsg1, wParam, lParam)
   
END FUNCTION


NSProc ist jetzt die WndProc vom fenster(1)... aber wenn ich jetzt Fenster(1) schließe hängt sich Fenster(0) auf, wieso das?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 07.04.2008, 14:11    Titel: Antworten mit Zitat

*räusper* *räusper*
Code:
CASE WM_DESTROY
   PostQuitMessage(0)
Was denkst du denn was der Code macht durchgeknallt ?
_________________
Zitat:
1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OrangeTiger



Anmeldungsdatum: 21.02.2008
Beiträge: 17

BeitragVerfasst am: 07.04.2008, 16:27    Titel: Antworten mit Zitat

Öhm... ok, also ganz ehrlich dachte ich jetzt, der sendet eine Message an das aktive Fenster, womit das beendet wird... wenn du aber so fragst vermute ich jetzt mal, dass das nicht stimmt... wie müsste ichs denn richrtig schreiben, dass es funktioniert?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 07.04.2008, 16:45    Titel: Antworten mit Zitat

Code:
ShowWindow (hWnd1, SW_HIDE)
Edit:
Moment... Im WM_DESTROY ergibt das ja keinen Sinn durchgeknallt . Ich würde einfach "return true" machen.
_________________
Zitat:
1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OrangeTiger



Anmeldungsdatum: 21.02.2008
Beiträge: 17

BeitragVerfasst am: 07.04.2008, 21:24    Titel: Antworten mit Zitat

Also mit ShowWindow das hab ich ja schon... das Fenster wird ja beim schließen nicht mehr angezeigt, ich will ja jetzt "nur" noch, dass nadem das eine fenster geschlossen wurde das andere wieder aktiviert wird... aber mit return true geht das auch ned... das Hauptfenster macht dann gar nix mehr...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 07.04.2008, 23:24    Titel: Antworten mit Zitat

Code:
''' Lutz Ifers WinAPI-Tutorial
''' LutzIfer.FreeBasic.de
'''
''' Kapitel 4.1 - "Zweitfenster"

'option explicit
#include "windows.bi"
const ProgrammName = "Zweitfenster"
const NebenfensterName = "Nebenfenster"

declare function Fenster(byval hWnd as HWND, byval message as UINTEGER,_
    byval wParam as WPARAM, byval lParam as LPARAM) as LRESULT

dim as WNDCLASS   wcMeinFenster
with wcMeinFenster
    .style         =  CS_HREDRAW or CS_VREDRAW
    .lpfnWndProc   =  ProcPtr(Fenster)
    .cbClsExtra    =  0
    .cbWndExtra    =  0
    .hInstance     =  GetModuleHandle(NULL)
    .hCursor       =  LoadCursor(NULL, IDC_ARROW)
    .hIcon         =  LoadIcon(NULL, IDI_APPLICATION)
    .hbrBackground =  GetStockObject(WHITE_BRUSH)
    .lpszClassName =  StrPtr(ProgrammName)
    .lpszMenuName  =  NULL
end with
RegisterClass @wcMeinFenster

dim as WNDCLASS   wcNebenFenster
with wcNebenFenster
    .style         =  CS_HREDRAW or CS_VREDRAW or CS_NOCLOSE
    .lpfnWndProc   =  ProcPtr(DefWindowProc)
    .cbClsExtra    =  0
    .cbWndExtra    =  0
    .hInstance     =  GetModuleHandle(NULL)
    .hCursor       =  LoadCursor(NULL, IDC_ARROW)
    .hIcon         =  LoadIcon(NULL, IDI_APPLICATION)
    .hbrBackground =  GetStockObject(WHITE_BRUSH)
    .lpszClassName =  StrPtr(NebenfensterName)
    .lpszMenuName  =  NULL
end with
RegisterClass @wcNebenFenster

dim as HWND   hMeinFenster = CreateWindow(_
    ProgrammName, "Titelzeile", WS_OVERLAPPEDWINDOW,_
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,_
    NULL, NULL, GetModuleHandle(NULL), NULL)

ShowWindow   hMeinFenster, SW_NORMAL
UpdateWindow hMeinFenster

dim as MSG msg
do while getmessage(@msg, NULL, 0, 0) <> 0
    DispatchMessage  @msg
loop
end msg.wParam

function Fenster(byval hWnd as HWND, byval message as UINTEGER,_
    byval wParam as WPARAM, byval lParam as LPARAM) as LRESULT
   
    static as HWND hFensterA, hFensterB, hFensterC, hFensterD
    static as POINT ptStart, ptEnde
    dim    as HDC   hDC
   
    select case message
        case WM_DESTROY
            PostQuitMessage 0
            return 0
           
        case WM_CREATE
            hFensterA = CreateWindow(NebenfensterName,_
                "Vollwertiges Zweitfenster",_
                WS_OVERLAPPEDWINDOW or WS_VISIBLE,_
                CW_USEDEFAULT, CW_USEDEFAULT, 200, 100,_
                hWnd, NULL, cast(LPCREATESTRUCT,lParam)->hInstance, NULL)
            hFensterB = CreateWindow(NebenfensterName,_
                "Ohne alles",_
                WS_VISIBLE,_
                CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,_
                hWnd, NULL, cast(LPCREATESTRUCT,lParam)->hInstance, NULL)
            hFensterC = CreateWindow(NebenfensterName,_
                "Vielleicht Men�bar",_
                WS_VISIBLE or WS_OVERLAPPED or WS_SYSMENU,_
                CW_USEDEFAULT, CW_USEDEFAULT, 300, 150,_
                hWnd, NULL, cast(LPCREATESTRUCT,lParam)->hInstance, NULL)
            hFensterD = CreateWindow(NebenfensterName,_
                "Selbstst�ndig",_
                WS_OVERLAPPEDWINDOW or WS_VISIBLE,_
                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,_
                NULL, NULL, cast(LPCREATESTRUCT,lParam)->hInstance, NULL)
            return 0
    end select
    return DefWindowProc( hWnd, message, wParam, lParam )   
end function

_________________
Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft.
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