[C++]Winapi&Klassen

mootsch

Grünschnabel
Hi,

ich habe da ein kleines Problem mit meiner Klasse. Die Klasse soll mein Fenster erstellen und verwalten. Das hier ist sie :

Code:
class HCView {
private:
    
public:
    HCView();
    void Messagepump(void);
    static LRESULT CALLBACK WndProc(HWND hWnd, UINT message ,WPARAM wParam, LPARAM lParam);
    int CreateInstance(HINSTANCE hTheInstance);
    HWND handleWnd;
};

Mein Problem ist, das mein Fenster keine Messages verarbeitet :( ich weiss auch schon grob woran es liegt (sollte das nicht stimmen, berichtigt mich bitte :rolleyes: ):

static ist meine WNDPROC deswegen weil eine klasse bei jeder funktion einen *this Zeiger übergibt. Ich kann aber meine HWND variable nicht meiner WNDPROC übergeben, weil HWND im WNDPROC HWND sein MUSS, und kein *this Zeiger.

Wie lässt sich mein Problem lösen?!?Wie muss ich meine globale hwnd variable den deklarieren das sie meine WNDPROC auch an nimmt?

Danke im voraus!
MFG,
mootsch

ps: sorry für meine komische fehler erklärung, aber ich bin c++ ein bzw. umsteiger und kann solche probleme noch nicht wirklich in worte fassen :rolleyes:
 
Wenn ich Dich richtig verstanden habe, willst Du mit der WIN-API ein Fenster erzeugen und Nachrichten empfangen!

Da Du nur die Klassenbeschreibung geschickt hast kann man daraus relativ wenig ableiten!
Es ist schon ein weilchen her, dass ich mit dem SDK (sprich WIN-API) programmiert habe!

Aber auf jedenfall musst Du ja irgendwo erst mal eine Fensterklasse registrieren, dann kannst Du Dir das Fenster erstellen!

Ab Besten Du schaust Dir mal folgendes Beispiel an. Es ist zwar nicht objektorientiert aber damit kannst Du erst mal das Prinzip verstehen.
Das ganze dann in eine Klasse zu verpacken (sog. Wrapperklasse) ist nicht schwer!

Da kannst Du dann auch sehen, wo Du den Zeiger auf die WinProc übergeben kannst!

Ich glaube, dieses Beispiel hilft Dir sehr gut weiter!
 
Zuletzt bearbeitet:
Hi,

[stolzsei]
so, es ist vollbracht und funktioniert :)
[/stolzsei]

Ich teile mein Wissen mit euch, hier der code :

Die Klasse
Code:
#ifndef _GOWINDOWCLASSH_
#define _GOWINDOWCLASSH_

#include <windows.h>
#include <stdio.h>

class GOWindowObject
{
public:
    HWND hwnd;
    HINSTANCE hInstance;
    bool CreateInstance(HINSTANCE hTheInstance);
    void Messagepump(void);
    GOWindowObject();
    ~GOWindowObject();
    HWND GetHandleWindow();
    //FILE *WinProtokoll;
private:
    static LRESULT CALLBACK WndProc(HWND hwndProc,UINT message, WPARAM wparam, LPARAM lparam);
};
#endif

Die dazugehörigen Funktionen :
Code:
#include "goWindowClass.h"

GOWindowObject::GOWindowObject()
{
//
}

GOWindowObject::~GOWindowObject()
{
//
}

bool GOWindowObject::CreateInstance(HINSTANCE hTheInstance)
{
    WNDCLASSEX winclass;
    const char chClassName[] ="TestProjekt";
    
    GOWindowObject::hwnd = GOWindowObject::GetHandleWindow();
    
    winclass.cbSize = sizeof(WNDCLASSEX);
    winclass.style = CS_HREDRAW|CS_VREDRAW;
    winclass.lpfnWndProc = GOWindowObject::WndProc;
    winclass.cbClsExtra = 0;
    winclass.cbWndExtra = 0;
    winclass.hInstance = hTheInstance;
    winclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    winclass.hCursor = LoadCursor(NULL,IDC_ARROW);
    winclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    winclass.lpszMenuName = NULL;
    winclass.lpszClassName = chClassName;
    winclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
    
    if(!RegisterClassEx(&winclass))
        return false;
        
    if(!(GOWindowObject::hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,chClassName,"WindowCaption",WS_POPUPWINDOW | WS_VISIBLE,10,10,20,20,NULL,NULL,hTheInstance,GOWindowObject::hwnd)))
        return false;
}

LRESULT CALLBACK GOWindowObject::WndProc(HWND hwndProc,UINT message, WPARAM wparam, LPARAM lparam)
{
    switch(message) {
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    } break;
    
    case WM_KEYDOWN:
    switch(wparam) {
        case VK_ESCAPE:
        {
                PostMessage(hwndProc,WM_CLOSE,0,0);
                return 0;
        } break;
    } break;
    default:break;
    }
    return (DefWindowProc(hwndProc,message,wparam,lparam));
}

void GOWindowObject::Messagepump(void)
{
    MSG msg;
    while (GetMessage(&msg,NULL,0,0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

HWND GOWindowObject::GetHandleWindow()
{
    return hwnd;
}

Und die main.cpp , damit man sieht wie mans verwendet :
Code:
#include "goWindowClass.h"

GOWindowObject Window; 
bool stop = false;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hprevInst, LPSTR lpCmdLine, int nShowCmd)
{
    if(!Window.CreateInstance(hInstance))
        return 0;
    
    while (!stop) {
        Window.Messagepump();
    }
    
    return true;
}

Vielleicht braucht es ja irgendwann mal einer ;-).

mfg,
mootsch
 
Vorbildlich, dass Du Deinen Beispielcode abgedruckt hast! Sehr gut!!!

Jetzt könntest Du das ganze noch erweitern indem Du Dir aus Deinen Wrapperklassen allgemeine Basisklassen erstellst. Ähnlich wie in der MFC die CWnd oder CWindow-Klasse.
Davon kannst Du dann andere Fensterklassen ableiten und die Funktionalität spezialisieren.

Noch ein paar Anmerkung:
Code:
GOWindowObject::hwnd = GOWindowObject::GetHandleWindow();
kannst Du getrost so schreiben, spart Dir schreibarbeit:
Code:
hwnd = GetHandleWindow();

Bei WINAPI-Befehlen kannst Du dann so schreiben:
Code:
hwnd = ::CreateWindowEx(WS_EX_CLIENTEDGE,chClassName...

Weiterhin deklariere Deine Membervariablen immer am Besten mit einem vorangestellten m_! Damit siehst Du sofort, ob es sich um eine lokale oder um eine Membervariable handelt.
 

Neue Beiträge

Zurück