Klassen Problem, Static
-
Hallo!
Ich hab jetzt mit (V)C++ angefangen, vorher nur Visual Basic. Und um mir den Umstieg zu erleichtern hab ich mir eine klasse geschriebn mit der ich ein Fenster erzeuge. Funktioniert auch toll. wenn ich jetzt aber 2 Variablen vom Typ WindowClass erzeuge, gibt es eigentlich auch kein problem. nur wenn ich eines der beiden fenster schließe wird das zweite auch automatisch geschlossen. Warum?
Meine Ansätze (die nicht funktionieren):
Fenster dürfen nicht der gleichen Klasse angehören
PostQuitMessage muss doch an ein fenster gerichtet sein?!hoffe es kann mir wer helfen. ich weiß man soll nicht einfach unmengen Quellcode posten, aber ich weiß ja nicht wo der fehler ist und darum hab ich mir gedacht kann sich so jeder ansehen was ich mache, vl. ist'S ja ein ganz simpler fehler...
und noch was: ich kann zwar static variablen in der header-datei deklarieren, aber sie nicht im Konstruktor/Destruktor verwenden. Fehler: Nicht aufgelöstes externes Symbol...
mfg dominik
//Test.cpp #include "WindowClass.h" LRESULT CALLBACK WINDOWProc1(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ; LRESULT CALLBACK WINDOWProc2(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; Window MyWindow1(hInstance,(WNDPROC)WINDOWProc1,"klasse134"); MyWindow1.Show(); Window MyWindow2(hInstance,(WNDPROC)WINDOWProc2,"klasse1gdf4"); MyWindow2.Show(); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WINDOWProc1(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } LRESULT CALLBACK WINDOWProc2(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } //WindowClass.cpp #include "WindowClass.h" #include <string.h> #define WINDOW_CLASS_NAME "blob" Window::Window(HINSTANCE hinstance, WNDPROC wndproc, char* classname) { hInstance = hinstance; wndProc = wndproc; ClassName = new char[strlen(classname)+1]; ClassName = strcpy(ClassName,classname); RgstrClss(); hWnd = CrtWndw(); } Window::~Window() { SendMessage(hWnd,WM_DESTROY,NULL,NULL); UnrgstrClss(); } int Window::RgstrClss(void) { WNDCLASS WindowClass; WindowClass.cbClsExtra = 0; WindowClass.cbWndExtra= 0; WindowClass.hbrBackground = (HBRUSH) GetSysColorBrush(COLOR_BTNFACE); WindowClass.hCursor = LoadCursor(NULL,IDC_ARROW); WindowClass.hIcon = LoadIcon(NULL,IDI_APPLICATION); WindowClass.hInstance = hInstance; WindowClass.lpfnWndProc = wndProc; WindowClass.lpszClassName = ClassName; WindowClass.lpszMenuName = NULL; WindowClass.style = CS_HREDRAW | CS_VREDRAW; return RegisterClass(&WindowClass); } int Window::UnrgstrClss(void) { return UnregisterClass(ClassName,hInstance); } HWND Window::CrtWndw(void) { return CreateWindow(ClassName, TEXT ("MEIN Fenster! Hooray!"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 420, 250, NULL, NULL, hInstance, NULL); } int Window::Show(void) { return ShowWindow(hWnd,1); } //WindowClass.h #include <Windows.h> class Window { private: int RgstrClss(void); int UnrgstrClss(void); HWND CrtWndw(void); char* ClassName; public: Window(HINSTANCE hinstance, WNDPROC wndproc, char* classname); ~Window(); int Show(void); HWND hWnd; HINSTANCE hInstance; WNDPROC wndProc; };
-
Naja, kommt davon wenn man nicht weiß, was die Funktionen machen die man aufruft.
PostQuitMessageNach dem PostQuitMessage() geht dein Programm aus der Hauptschleife und wird beendet. Komisch das dir das noch nicht aufgefallen ist...
int RgstrClss(void); int UnrgstrClss(void); HWND CrtWndw(void); char* ClassName;
Lohnt es sich echt, die paar Buchstaben nicht zu tippen? :p
-
und noch was: ich kann zwar static variablen in der header-datei deklarieren, aber sie nicht im Konstruktor/Destruktor verwenden. Fehler: Nicht aufgelöstes externes Symbol...
Die müssen nochmal ausserhalb definiert werden:
class X { static int y; } int X::y = 0;
-
Hier ist das Standard-C++-Forum , in Standard-C++ gibts keine Fenster! Sowas gibts nur im WINAPI oder MFC-Forum.
mfg
Glamdring
-
danke für eure antworten, hat mir sehr gholfen, jetzt klappt alles. hab mir den code mehr oder weniger aus einem programm zusammen gesucht was mir der Assisstent erstellt hat. und dort wird immer PostQuitMessage aufgerufen wenn das fenster geschlossen wird. aber jetzt weiß ichs, THX!
mfg dominik
-
int RgstrClss(void); int UnrgstrClss(void); HWND CrtWndw(void);