C++: WndProc funktioniert nicht
-
Hallo,
Ich möchte ein WinApi Fenster erstellen doch bei der Kompilierung tritt immer diese Fehlermeldung auf:70 26 D:\Felix\c++\WinApi\Main.cpp [Error] invalid conversion from 'long long int (*)(HWND, UINT, UINT, LONG) {aka long long int (*)(HWND__*, unsigned int, unsigned int, long int)}' to 'WNDPROC {aka long long int (*)(HWND__*, unsigned int, long long unsigned int, long long int)}' [-fpermissive]
Hier nochmal der ganze Code:
#include <iostream> #include <stdio.h> #include <time.h> #include <ctime> #include <cstdlib> #include <windows.h> using namespace std; char suser[] = "UserName"; long long WINAPI WndProc(HWND hwnd, UINT message, UINT wParam, LONG lParam) { //Variablen HDC hdc; //Handle für Gerätekontext PAINTSTRUCT ps; //Struktur für Zeichenoperationen RECT rect; //Rechteckstruktur switch (message) //Welche Nachricht? { case WM_PAINT: //Fenster neu zeichnen { hdc=BeginPaint(hwnd,&ps); //Gerätekontext bereitstellen GetClientRect(hwnd, &rect); //Größe der zu bearbeitenden //rechteckigen Fläche (Fensterinhalt, //client area) ermitteln DrawText(hdc,suser,-1, &rect, //Name des Users //zentriert ausgeben DT_SINGLELINE|DT_CENTER|DT_VCENTER); EndPaint(hwnd,&ps); //Gerätekontext freigeben return(0); } case WM_DESTROY: //Fenster schließen { PostQuitMessage(0); //WM_QUIT senden, //um Message_Loop zu beenden return(0); } dafault: //Andere Nachrichten. Werden { //von den Windows-Standard- //Nachrichtenroutine bearbeiten return DefWindowProc(hwnd, message, wParam, lParam); } } } int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { //Variablen static char szClassName[] = "KontocheckFensterKlasse"; //Name der //Fensterklasse WNDCLASSEX winclassex; //Fensterklassenstruktur HWND hwnd; //Fensterhandle MSG msg; //Nachrichtenstruktur //exsistiert schon eine laufende Instanze dieser Anwendung? //falls nein: Komponenten der winclassex struktur füllen if(!hPrevInstance) { winclassex.cbSize = sizeof(winclassex); winclassex.style = CS_HREDRAW | CS_VREDRAW; winclassex.lpfnWndProc = WndProc; winclassex.cbClsExtra=0; winclassex.cbWndExtra=0; winclassex.hInstance=hInstance; winclassex.hIcon=LoadIcon(NULL,IDI_APPLICATION); winclassex.hCursor=LoadCursor(NULL,IDC_ARROW); winclassex.hbrBackground=(HBRUSH) GetStockObject( WHITE_BRUSH); winclassex.lpszMenuName="Fenstermenu"; winclassex.lpszClassName=szClassName; winclassex.hIconSm = LoadIcon( NULL, IDI_APPLICATION); RegisterClassEx(&winclassex); //Klasse registrieren } //Neues Fenster erzeugen und Handle speichern hwnd=CreateWindow(szClassName, "Fenster", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 1200, 1000, NULL, NULL, hInstance, NULL); //Neues Fenster anzeigen und sofort aktuelisiren ShowWindow(hwnd, nShowCmd); UpdateWindow(hwnd); //Anfallende Nachrichten bearbeiten while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); //Nachricht übersetzen DispatchMessage(&msg); //Nachricht an Nachrichtenfunktion //weiterleiten } return 0; }
Kann mir irgendwer helfen? Ich benutze Dev c++ Compiler.
-
Kompilierst du für 64-bit? Die letzten beiden Parameter von
WndProc
passen nicht, s. WndProc.
-
Vielen Dank! Es lag an den letzten beiden Parametern. Aber wenn ich jetzt kompiliere kommt:
[Error] ld returned 1 exit status
-
Da sollten dann aber vorher noch andere Fehler (oder Warnungen) erscheinen.
-
default
, nicht dafault.
-
Ja du hast recht! Ich dachte zuerst die wäre nicht von Bedeutung:
Main.cpp:(.text+0x168): undefined reference to `__imp_GetStockObject'
-
Du mußt noch die passende Lib zum Projekt hinzufügen ("Library Dependencies"), s.a. Undefined reference to GetStockObject@4 bzw. direkt GetStockObject - wird also wohl "gdi32.lib" sein.