Fenster erstellen
-
hallo ich bin ein Neuling...
ich versuche gerade ein Fenster mit Winapi zu erstellen und um dies ein bisschen übersichtlicher zu Gestalten wollte ich diesmal einen Teil davon in die header Datei verlagern, dass meine Main Datei nicht so vollgepropft ist. Mein Problem ist jetzt wenn ich jetzt meiner WNDCLASS, meine Callback Funktion übergeben möchte kommt immer der Fehler:
c:\users\heeiiigou\documents\visual studio 2010\projects\dreieck\dreieck\inputcontrol.cpp(25): error C3867: "window::WndProc": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&window::WndProc", um einen Zeiger auf den Member zu erstellen.
1>c:\users\heeiiigou\documents\visual studio 2010\projects\dreieck\dreieck\inputcontrol.cpp(25): error C2440: '=': 'LPARAM (__stdcall window::* )(HWND,UINT,WPARAM,LPARAM)' kann nicht in 'WNDPROC' konvertiert werdenWas mache ich Falsch?
hier meine Main cpp datei:
#include "header.h" window crwnd; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR CmdLine, int iCmdShow) { crwnd.WndProp(hInstance); return 0; }
hier die header datei:
#include <Windows.h> class window { public: LPARAM CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void WndProp(HINSTANCE); HWND hWindow; WNDCLASS wc; MSG msg; private: };
und hier meine letzte:
#include "header.h" LPARAM CALLBACK window::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_DESTROY: { PostQuitMessage(0); return 0; break; } } DefWindowProc(hWnd,message,wParam, lParam); } void window::WndProp(HINSTANCE hInstance) { WndProp(hInstance); wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.hCursor = LoadCursor(hInstance,IDC_ARROW); wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = L"Dreieck"; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; }
-
die WindowProc darf keine Memberfunktion von einer Klasse sein, sondern muß global sein
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633573%28v=vs.85%29.aspx
-
Der Grund: Ein Methodenzeiger und ein Funktionszeiger sind zwei verschiedene Dinge, denn eine Methode kann nur auf einem Objekt aufgerufen werden.
Lösung für dein Problem: Per SetWindowLongPtr mit GWLP_USERDATA einen Pointer auf dein
window
Objekt an das Fenster heften und eine freie WndProc Funktion schreiben, die den Pointer ausliest und an eine entsprechende WndProc Methode weiterleitet.
-
danke für die schnelle Hilfe