Fenster Programmierung?

Eine Frage wo ist hier ein Fehler:
Code:
#define STRICT
#include <windows.h>

//LRESULT ist ein typedef auf einen long Typ.
//CALLBACK sagt aus, dass diese Funktion von Windows aufgerufen wird.
//Der erste Parameter ist der Handle zu dem Fenster.
//Der zweite Parameter message enthält die Kennziffer der Nachricht.
//Die nächsten beiden Parameter enthalten je nach Nachricht verschiedene Daten.
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

const char szAppName[] = "Ein eigenes Fenster"; //Programmname.

//Der erste Parameter HINSTANCE ist ein Handle auf diese Programminstanz.
//Der zweite Parameter ist vom gleichen Typ, jedoch wird dieser Wert in Win 32 immer Null sein.
//Der dritte Parameter enthält die Kommandozeilen Parameter.
//Mit dem vierten Parameter wird übergeben, wie das eventuelle Fenster angezeigt werden soll (maximiert, minimiert usw.).
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    HWND       hWnd; //Handle für unser Fenster.
    MSG        msg;  //Windows Nachrichten abholen und bearbeiten.
    WNDCLASS   wc;   //Typ der Fensterklasse.

    wc.style         =  CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   =  WndProc;
    wc.cbClsExtra    =  0;
    wc.cbWndExtra    =  0;
    wc.hInstance     =  hInstance;
    wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
    wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
    wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszClassName =  szAppName;
    wc.lpszMenuName  =  NULL;
    RegisterClass(&wc);

    hWnd = CreateWindow(szAppName,
                        "Titelleiste",
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,          /* X-Position auf dem Monitor */
                        CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
                        CW_USEDEFAULT,          /* Fensterbreite              */
                        CW_USEDEFAULT,          /* Fensterhoehe               */
                        NULL,
                        NULL,
                        hInstance,
                        NULL);

    ShowWindow(hWnd, iCmdShow);
    UpdateWindow(hWnd);

    while(GetMessage(&msg, NULL, 0, 0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
    switch(message){
        case WM_DESTROY:{
            PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

Dev-C++ Meldet:
Code:
C:\DOKUME~1\Tobias\LOKALE~1\Temp\cc6ddaaa.o(.text+0x71) In function `WinMain':
[Linker error] undefined reference to `GetStockObject@4'
C:\DOKUME~1\Tobias\LOKALE~1\Temp\cc6ddaaa.o(.text+0x71) ld returned 1 exit status
 
Das Problem kenn ich. Du benutzt GCC mit Cygwin, stimmts? Da ist mir das nämlich auch passiert. Dein Problem besteht darin, dass die Funktion nicht richtig eingebunden wird. Das ist mir bei allen Funktionen aus der gdi32.dll passiert. Ich habe sie dann dynamisch eingebunden, hab auch irgendwo den Code, find ihn nur gerade nicht. Aber es gibt bestimmt mehr als eine Internet-Quelle zum dynamischen Import vom DLL-Funktionen in C++. Da gibts ja sogar für Pascal mehr als 100.
Ich weis noch, wie der Funktionsprototyp aussah:
PHP:
HGDIOBJ GetSObject (int);
Und dann hab ich im Quelltext diese Funktion statt GetStockObject aufgerufen. Und wenn du jetzt fragen willst, woher ich den Rückgabetyp von GSO kenne: MSDN.
Tschö,
nullplan
 
Linker Error bedeutet meistens, dass einfach vergessen wurde ne .lib anzugeben GetStockObject ist in der Lib Gdi32.lib. Gib die in den Linker Optionen an bei Dev-C++ heißt die dann libgdi32.a
 
Flegmon hat gesagt.:
Linker Error bedeutet meistens, dass einfach vergessen wurde ne .lib anzugeben GetStockObject ist in der Lib Gdi32.lib. Gib die in den Linker Optionen an bei Dev-C++ heißt die dann libgdi32.a
Die Meldung hab ich schon so oft gehört und nach allen möglichen Dateien mit gdi im Namen gesucht. War nichts zu finden. Glaub mir, mit dynamischer Einbindung passiert dir am allerwenigsten.
Tschö,
nullplan
 
Zurück