Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.01.2011, 14:58

problem mit RegisterClassEx

Guten Tag,

ich habe ein kleines Problem mit der RegisterClassEx Methode. Mein Code sieht so aus:

erzeugen eines Fensters

C-/C++-Quelltext

1
mWindow = std::auto_ptr<CWindow> (new CWindow("IIIIVIIIIVIIIIVI", CVector(1024, 768), Instance));


der konstruktor sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
CWindow::CWindow(const std::string Title, const CVector Size, const HINSTANCE Instance, const CVector Position, const std::string Icon)
{
    mWindow = 0;
    Create(Title, Size, Instance, Position, Icon);
}


und die create methode so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
void CWindow::Create(const std::string Title, const CVector Size, const HINSTANCE Instance, const CVector Position, const std::string Icon)
{
    //zero the WindowClass
    WNDCLASSEX WindowClass;
    ZeroMemory(&WindowClass, sizeof(WNDCLASSEX));

    //set WindowClass properties
    WindowClass.cbSize          = sizeof (WNDCLASSEX);
    WindowClass.style           = CS_HREDRAW | CS_VREDRAW;
    WindowClass.lpfnWndProc     = reinterpret_cast<WNDPROC>(WindowProc);
    WindowClass.hInstance       = Instance;
    WindowClass.hIcon           = (Icon.c_str()!=NULL)?static_cast<HICON>(LoadImage(NULL, Icon.c_str(), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE)):LoadIcon (NULL, IDI_APPLICATION);
    WindowClass.hIconSm         = (Icon.c_str()!=NULL)?static_cast<HICON>(LoadImage(NULL, Icon.c_str(), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE)):LoadIcon (NULL, IDI_APPLICATION);
    WindowClass.hCursor         = LoadCursor (NULL, IDC_ARROW);
    WindowClass.hbrBackground   = reinterpret_cast<HBRUSH>(16);
    WindowClass.lpszClassName   = Title.c_str();

    //register WindowClass
    if(RegisterClassEx(&WindowClass) == 0)
    {
        throw(CException(0x00));
    }

    //create window
    mWindow = CreateWindowEx(   NULL,
                                Title.c_str(),
                                Title.c_str(),
                                WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                                static_cast<int>(Position.mX),
                                static_cast<int>(Position.mY),
                                static_cast<int>(Size.mX),
                                static_cast<int>(Size.mY),
                                NULL,
                                NULL,
                                Instance,
                                NULL);

    //check wether window was created successfully and set not closed
    if(mWindow != 0) mClosed[mWindow] = false;
    else throw(CException(0x01));
}


er sagt mir jetzt es gebe ein problem mit dem heap, oder der benutzer hat F12 gedrückt...
das problem tritt nicht auf, wenn ich für den Fenstertitel IIIIVIIIIVIIIIV eingebe, also ein Zeichen weniger.
es scheint also ein problem mit dem string zu sein, scheitern tut aber der aufruf von RegisterClassEx.
Habt ihr eine Idee woran das liegen könnte?

2

03.01.2011, 15:12

C-/C++-Quelltext

1
  WindowClass.hIcon           = (Icon.c_str()!=NULL)?static_cast<HICON>(LoadImage(NULL,

Meinst du nicht, es gibt bessere Methoden um zu prüfen, ob der String nen Inhalt hat?
Ich glaub nicht, das das so funktioniert ;)

Zudem übergib die Parameter lieber als referenz auf const ;)

3

03.01.2011, 15:14

sicher gibt's empty() aber das hatte irgendeinen grund warum ich das so gemacht habe, habe ich aber vergessen, ist schon ein bisschen her dass ich das geschrieben habe ;)

4

03.01.2011, 15:27

sehr komisch, mit konstanter referenz geht aufeinmal alles so wie es soll, danke ;)

5

03.01.2011, 21:51

Aha und der Grund dafür soll sein? http://www.cppreference.com/wiki/string/basic_string/c_str ... du wirst da nie und nimmer nen NULL-Zeiger zurück bekommen.

Haben deine sonderbaren Nummern bei den Exceptions ne bedeutung? UFOs? Magic Number schimpft sich das und sollte vermieden werden. Davon mal abgesehen das hier evtl. GetErrorState oder wie die Funktion grad heißt eindeutigere Fehlerergebnisse liefern würde.

Und Referenzen sind bei den konst. Werten auf (jeden) Fall zu empfehlen.

Initialisierungslisten sind nen Hit.

Fensterklasse und Fenstertitel sind bei dir identisch?

Achja, du nimmst std::string, d.h. nimm auch die WinAPI A-Funktionen.

Ach und was das fürn Kikki:

C-/C++-Quelltext

1
2
if(mWindow != 0) mClosed[mWindow] = false;
    else throw(CException(0x01));
...

C-/C++-Quelltext

1
2
 if (!mWindow) throw CException(0x01);
mClosed[mWindow] = false;

nebenbei: wofür willst du mClosed nutzen was du nicht einfach per WinAPI-Funktion abrufen kannst?
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige