 |
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 |
OrangeTiger
Anmeldungsdatum: 21.02.2008 Beiträge: 17
|
Verfasst am: 06.04.2008, 16:21 Titel: 2 Fenster mit CreateWindowEx erstellen |
|
|
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 |
|
 |
raph ael
Anmeldungsdatum: 12.04.2006 Beiträge: 472
|
Verfasst am: 06.04.2008, 19:58 Titel: |
|
|
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 |
|
 |
OrangeTiger
Anmeldungsdatum: 21.02.2008 Beiträge: 17
|
Verfasst am: 06.04.2008, 22:16 Titel: |
|
|
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 |
|
 |
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 06.04.2008, 22:33 Titel: |
|
|
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 |
|
 |
OrangeTiger
Anmeldungsdatum: 21.02.2008 Beiträge: 17
|
Verfasst am: 06.04.2008, 23:35 Titel: |
|
|
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 |
|
 |
raph ael
Anmeldungsdatum: 12.04.2006 Beiträge: 472
|
Verfasst am: 07.04.2008, 14:11 Titel: |
|
|
*räusper* *räusper* Code: | CASE WM_DESTROY
PostQuitMessage(0)
| Was denkst du denn was der Code macht ? _________________
Zitat: | 1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein. |
|
|
Nach oben |
|
 |
OrangeTiger
Anmeldungsdatum: 21.02.2008 Beiträge: 17
|
Verfasst am: 07.04.2008, 16:27 Titel: |
|
|
Ö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 |
|
 |
raph ael
Anmeldungsdatum: 12.04.2006 Beiträge: 472
|
Verfasst am: 07.04.2008, 16:45 Titel: |
|
|
Code: | ShowWindow (hWnd1, SW_HIDE) | Edit:
Moment... Im WM_DESTROY ergibt das ja keinen Sinn . Ich würde einfach "return true" machen. _________________
Zitat: | 1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein. |
|
|
Nach oben |
|
 |
OrangeTiger
Anmeldungsdatum: 21.02.2008 Beiträge: 17
|
Verfasst am: 07.04.2008, 21:24 Titel: |
|
|
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 |
|
 |
Lutz Ifer Grillmeister

Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 07.04.2008, 23:24 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|