Wskaźnik na Procedurę Obsługi Komunikatów WinApi

0

Witam. Piszę własnie własną klasę ListBoxów, Scrollbarów i ProgressBarów w Dll - ce. Jednak w procedurze obsługi komunikatów muszę powrócić do procedury głównego okna ( return WindowProcedure ). Skąd mam ją wziąć, skoro w dllce nie mam jeszcze tej funkcji? Można jakoś uzyskać adres tej procedury mając wskaźnik na uchwyt instancji (*hInstance) lub uchwyt głównego okna (hwnd) ?

0

[cpp]
void mojaFunkcja(int a) {
cout << a << endl;
}

void (*wskNaFunkcje)(int) = mojaFunkcja;

(*wskNaFunkcje)(10);
[/cpp]

0

Zwykłe return costam powraca do funkcji wywołującej. Dlaczego chcesz zwracać wskaźnik na główną procedurę okna? W ogóle po to przecież rejestrujemy daną procedurę okna, że była ona automatycznie wołana przez przez DispatchMessage. Dlaczego chcesz ją wywoływać własnoręcznie? To się mija z celem.

gswidwa napisał(a):

Można jakoś uzyskać adres tej procedury mając wskaźnik na uchwyt instancji (*hInstance) lub uchwyt głównego okna (hwnd) ?
Zapewne nie jest ci to potrzebne, ale skoro już pytanie padło to odpowiedzią jest GetWindowLong+GWLP_WNDPROC.

Nie wiem jaki masz ogólny zamysł, ale generalnie jeśli chce się podpiąć własną klasą pod kontrolkę WinAPI to zapisz w GWLP_USERDATA wskaźnika na instancję tejże klasy. Wtedy przetwarzanie komunikatów może wyglądać tak:

class Kontrolka
{
private:
    HWND uchwyt_okna;
    WNDPROC oryginalna_procedura_okna;

protected:
    static LRESULT CALLBACK ProceduraOknaKontrolki(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    virtual LRESULT ObsluzKomunikat(UINT uMsg, WPARAM wParam, LPARAM lParam);

public:
    Kontrolka();
};

/* tworzenie kontrolki */
Kontrolka::Kontrolka()
{
    // tworzymy okno
    this->uchwyt_okna = CreateWindow(...);
    // podmieniamy procedurę okna kontrolki na własną
    this->oryginalna_procedura_okna = (WNDPROC)SetWindowLongPtr(kontrolka->uchwyt_okna, GWL_WNDPROC, Kontrolka::ProceduraOknaKontrolki);
    // wiążemy wskaźnik na instancję kontrolki z uchwytem do jej okna
    SetWindowLongPtr(this->uchwyt_okna, GWLP_USERDATA, (LONG_PTR)this);
}

/* obsługa komunikatów */
LRESULT CALLBACK Kontrolka::ProceduraOknaKontrolki(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    // odczytujemy wcześniej przypisany do uchwytu okna wskaźnik na instancję kontrolki
    Kontrolka *kontrolka = dynamic_cast<Kontrolka*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));
    // wywołujemy metodę obsługującą komunikat
    return (kontrolka != NULL) ?
            kontrolka->ObsluzKomunikat(uMsg, wParam, lParam) :
            DefWindowProc(hwnd, uMsg, wParam, lParam);
}

LRESULT Kontrolka::ObsluzKomunikat(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    /* tu robimy swoje udziwnienia */
    /* ... */

    /* ewentualnie wywołujemy oryginalną procedurę (którą podmieniliśmy) np. żeby odmalować kontrolkę */
    LRESULT ret = this->oryginalna_procedura_okna(this->uchwyt_okna, uMsg, wParam, lParam);

    /* tu robimy kolejne udziwnienia */
    /* ... */

    return ret;
}
0

Ah... Fakt, Nie potrzebowałem wracać do głównej procedury. Przepraszam za kłopot.

1 użytkowników online, w tym zalogowanych: 0, gości: 1