PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei Winapi Wrapper



motion
06.10.2010, 16:01
Hallo, ich schreibe im Moment an einem Winapi Wrapper (blablabla, gibt es schon; blablabla, warum das Rad neu erfinden - ich weiß. Zum Verständnis ;)) und habe dabei Probleme. Um ehrlich zu sein, ich habe bis jetzt nur den Source eines bestehenden Wrappers genommen, versucht zu verstehen - das auch geschafft - und jetzt versuche ich erstmal alles in einer Headerdatei unterzubringen. Funktioniert soweit gut, das Kompilieren geht, doch bei der Ausführung hakt es.

Ich übergebe bei der Erstellung des Fensters einen zeiger auf die Erstellende Klasse (this) mit um später in der Fensterprozedur die Empfängerklasse der Nachricht determinieren zu können. Die Prozedur und alles andere steht soweit (ein Link zur Headerdatei unten) doch CreateWindowEx schlägt fehl, ohne jegliche Angabe zum Grund. Selbst wenn ich GetLastError aufrufe gibt dies 0 zurück. Hier mal die Create Funktion der Klasse:


bool Create(LPCTSTR lpClassName, HINSTANCE hInstance, LPCTSTR lpWindowName, DWORD dwStyle, DWORD dwStyleEx = 0,
HWND hWndParent = 0, HMENU hMenu = 0, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT,
int nWidth = CW_USEDEFAULT, int nHeight = CW_USEDEFAULT) {
if(hWnd) return false;

PASSLPARAM *p = new PASSLPARAM;
p->phwnd = &hWnd;
p->pwindow = this;

hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, reinterpret_cast<LPVOID>(p));

GetLastError();

return (hWnd != NULL);
}
Ich habe schon einiges verändert um herauszufinden, woran der "Fehler" liegt, ich habe auch schon versucht anstatt der PASSLPARAM Struktur
struct PASSLPARAM {
wwindow *pwindow;
HWND *phwnd;
};
nur den this Zeiger zu übergeben. Vergeblich.
Wenn ich als lParam NULL übergebe, funktioniert das Erstellen des Fensters, doch die Fensterprozedur nicht mehr.

Hier der link:#1203150 - Pastie (http://pastie.org/1203150)

Vielleicht kann ja jemand von euch mir sagen, wo mein Fehler liegt und ob/wie ich ihn beheben kann. Danke schonmal im Vorhinein.

/motion

blackberry
06.10.2010, 17:23
Hi,
ich befürchte du wirst dich erschlagen wollen, nachdem du den Patch gesehen haben wirst, also atme lieber nochmal tief durch.

Der Patch:

273d272
< return DefWindowProc(hWnd, message, wParam, lParam);Yup - nur die zwei Zeilen ^_^

Hier mein Code mit dem es funktioniert:

using namespace wgui;

class MyWindow : public wwindow
{
public: LRESULT OnCreate(LPCREATESTRUCT pCS)
{
MessageBox(hWnd, "Hello, World!", "MyWindow", MB_OK);
}
};

APPLICATION
{
const char wndclass[] = "TestWindowClass_1";
wwindowclass wwc;
MyWindow mw;

wwc.SetInstance(hInstance);
wwc.SetClassName(wndclass);
wwc.Register();

mw.Create(
wndclass, hInstance, "Windows App", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0,
HWND_DESKTOP, 0, CW_USEDEFAULT, CW_USEDEFAULT,
500, 500
);

mw.MessageLoop();
return 0;
}

motion
06.10.2010, 17:48
Danke, dass du erstmal auf den Beitrag geantwortet hast, ich hatte schon befürchtet, keine Antwort zu bekommen, weil es doch speziell ist. Vielleicht bin ich grade am hängen oder sonstwas, ich verstehe jedoch nicht genau was jetzt mein Problem war ^^ Ich würde jedoch jetzt gerne wissen, wie du darauf gekommen bist, dass das das Problem war...

blackberry
06.10.2010, 17:54
Habs gerade nochmal getestet... das mit dem ShowWindow ist auch unnötig, wenn man WS_VISIBLE als Style übergibt.
Was das mit dem DefWindowProc angeht, so ist es wichtig, dass alle Nachrichten bearbeitet werden. Welche Nachricht(en) jetzt genau dafür gesorgt hat/haben weiß ich nicht, jedoch sollte man DefWindowProc immer aufrufen, wenn man nachrichten nicht selber behandelt, damit man sicherstellen kann, dass auch diese behandelt werden.

In deinem Code steht ja auch in Zeile 148:
break; // DefWindowProc is called
Hätte ja im Grunde ein Hinweis sein können, dass am Ende der Funktion irgendwie DefWindowProc aufgerufen werden müsste; dies war jedoch nicht der Fall.

motion
06.10.2010, 20:57
Krasse Geschichte. Mir muss wohl der Aufruf von DefWindowProc unter die Räder gekommen sein... Danke auf jeden Fall herzlich für deine Hilfe. Ich finde es gut, dass hier so schnell eine Antwort kam. Auch wenn ich noch sagen muss, dass ich den Fehler schon irgendwie "lächerlich" finde. Ich wäre allerdings nie darauf gekommen also danke nochmal vielmals.

/motion