Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » CreateWindowEx - Ungültiges Fensterhandle

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.11.2006, 17:48 Uhr
xXx
Devil


Also folgender Code:

C++:
bool rcWindow::_RegisterWindow(HINSTANCE hInstance)
{
    if (hInstance == NULL)
        return false;

    WNDCLASSEX wc;
    wc.cbSize            = sizeof(wc);
    wc.style            = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc        = (WNDPROC)rcApplication::Instance().WindowProc;
    wc.cbClsExtra        = 0;
    wc.cbWndExtra        = 0;
    wc.hInstance        = hInstance;
    wc.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_RCCONFIG));
    wc.hIconSm            = static_cast<HICON>(LoadImage(wc.hInstance, MAKEINTRESOURCE(IDI_RCCONFIG), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR));
    wc.hCursor            = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground    = CreateSolidBrush(RGB(50, 50, 50));
    wc.lpszMenuName        = NULL;
    _sntprintf(m_szClassName, 128, _T("rcWindow"));
    wc.lpszClassName    = m_szClassName;

    return (RegisterClassEx(&wc) == 0 ? false : true);
}
Das sollte ja selbsterklärend sein


C++:
unsigned long rcWindow::Create(unsigned short x, unsigned short y, unsigned short nWidth, unsigned short nHeight, unsigned long dwStyle, rcWindow* pParentWnd, LPCTSTR lpstWindowCaption)
{
    if (lpstWindowCaption == NULL)
        return error_invalid_parameter;

    HWND hWndParent = NULL;

    if (pParentWnd != NULL)
        pParentWnd->GetSafeHwnd(hWndParent); // GetSafeHwnd(HWND& hWnd) ..

    _RegisterWindow(rcApplication::Instance().GetSafeHandle());

    m_hWnd = CreateWindowEx(0, m_szClassName, lpstWindowCaption, dwStyle, x, y, nWidth, nHeight, hWndParent, (HMENU)NULL, rcApplication::Instance().GetSafeHandle(), this); // THIS-Pointer übergeben... wird in WM_NCCREATE und WM_CREATE übergeben.

    rcApplication::Instance().ErrorMessageBox();

    if(m_hWnd == NULL)
        return error_could_not_create_window;

    return error_none;
}
ErrorMessageBox formatiert die Fehlermeldung die ich mit GetLastError hole ... Nun meldet sie mir aber, das ein ungeültiges Fensterhandle existieren würde... jemand ne Idee woran das liegen soll? bis dahin ist doch da garkein fehler drin?!

Aja ... hmm evt. liegt es auch an der MessageProc... also:

C++:
LRESULT CALLBACK rcApplication::WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    rcWindow* pWindow = NULL;
    
    if (message == WM_NCCREATE)
    {
        pWindow = reinterpret_cast<rcWindow*>(((LPCREATESTRUCT)lParam)->lpCreateParams); // Übergebener this-Pointer ...
        SetWindowLong(hWnd, GWL_USERDATA, reinterpret_cast<LONG>(pWindow)); // Als Userdata setzen ...
    }
    else
        pWindow = reinterpret_cast<rcWindow*>(GetWindowLong(hWnd, GWL_USERDATA));
  
    if (pWindow != NULL)
        return pWindow->MessageProc(message, wParam, lParam); // Die MessageProc des Windows aufrufen
  
    if (rcApplication::Instance().GetWindow() != NULL) // Wenn der WIndow-Pointer net existierte den der Anwendung selbst versuchen zu bekommen
        return rcApplication::Instance().GetWindow()->MessageProc(message, wParam, lParam); // Wenn möglich dessen MessageProc aufrufen ...

    return DefWindowProc(hWnd, message, wParam, lParam); // Notfalls Standardverarbeitung wählen...
}
Einmal die static die das ganze dann an die einzellnen Windows weiterleitet ... eine der wenigen Möglichkeiten dieses dumme Problem mit den Klassen zu lösen

C++:
LRESULT    rcWindow::MessageProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    // Normal noch gucken ob FUnktionen zur Nachrichtenverarbeitung vom Benutzer registriert worden. Sonnst weiter arbeiten.
    switch (message)
    {
    case WM_CREATE:
        {
            return 0;
        }break;
    case WM_PAINT:
        {
            PAINTSTRUCT    ps;
            HDC            hDC = BeginPaint(m_hWnd, &ps);
            RECT        rcClient;
            GetClientRect(m_hWnd, &rcClient);
            LineTo(hDC, rcClient.right, rcClient.bottom);
            EndPaint(m_hWnd, &ps);
        } break;
    case WM_DESTROY:
        {
            PostQuitMessage(0);
        } break;
    default:
        return DefWindowProc(m_hWnd, message, wParam, lParam);
    }
    return 0;
}
Hab einfach mal nur so ne Linie zeichnen lassen. Seht ihr hier irgendnen Fehler?

Dieser Post wurde am 14.11.2006 um 18:39 Uhr von xXx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.11.2006, 18:36 Uhr
xXx
Devil


Naja ... den Rest des Quellcodes für die Registrierung einzelner Nachrichten werdet ihr ja nicht brauchen Hat da jemand eine Idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.11.2006, 21:14 Uhr
xXx
Devil



C++:
m_hWnd = CreateWindowEx(0, m_szClassName, lpstWindowCaption, dwStyle, x, y, nWidth, nHeight, (pParentWnd != NULL ? hWndParent : NULL), (HMENU)NULL, rcApplication::Instance().GetSafeHandle(), (LPVOID)this); // Hab noch extra nach LPVOID gecastet ...
Keiner ne Idee?? Meiner Meinung nach liegt es an der MessageProc ... aber die Fehlermeldung stimmt ja net so ganz damit überein :/


Noch ne andere Idee. Ich nehme ja das HWND was ich Nach CreateWindowEx habe und nutze das in der MessageProc. Das kann aber natürlich noch nicht bei den Messages da sein, die während des Aufrufes von CreateWindowEx eintreffen. D.h. weiß einer vllt. welche Nachrichten das alles sind? Also im Prinzip die, die vor WM_NCCREATE oder WM_CREATE ankommen...

Dieser Post wurde am 14.11.2006 um 21:29 Uhr von xXx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.11.2006, 17:31 Uhr
xXx
Devil


Naja ... ok danke für die Hilfe ...

C++:
LRESULT CALLBACK rcApplication::WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    rcWindow* pWindow = NULL;
    
    if (message == WM_NCCREATE)
    {
        pWindow = reinterpret_cast<rcWindow*>(((LPCREATESTRUCT)lParam)->lpCreateParams);
        SetWindowLong(hWnd, GWL_USERDATA, reinterpret_cast<LONG>(pWindow));
    }
    else
        pWindow = reinterpret_cast<rcWindow*>(GetWindowLong(hWnd, GWL_USERDATA));
  
    if (pWindow != NULL)
        return pWindow->MessageProc(hWnd, message, wParam, lParam);
  
    if (rcApplication::Instance().GetWindow() != NULL)
        return rcApplication::Instance().GetWindow()->MessageProc(hWnd, message, wParam, lParam);

    return DefWindowProc(hWnd, message, wParam, lParam);
}


und dann:

C++:
LRESULT    rcWindow::MessageProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    rcWindowMessageIterator it = GetMessageHandler(message);
    
    if (it != NULL)
        return (it->second)(wParam, lParam);

    switch (message)
    {
    case WM_PAINT:
        {
            PAINTSTRUCT    ps;
            HDC            hDC = BeginPaint(m_hWnd, &ps);
            RECT        rcClient;
            GetClientRect(m_hWnd, &rcClient);
            LineTo(hDC, rcClient.right, rcClient.bottom);
            EndPaint(m_hWnd, &ps);
        } break;
    case WM_DESTROY:
        {
            PostQuitMessage(0);
        } break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}


Wie ich bereits vermutete lag es daran, das der Handle der bei den Messages Vor WM_CREATE usw genutzt wird, nicht der Membervariable entsprach. Habe es jetzt angepasst und es funktioniert
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: