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) ?
[cpp]
void mojaFunkcja(int a) {
cout << a << endl;
}
void (*wskNaFunkcje)(int) = mojaFunkcja;
(*wskNaFunkcje)(10);
[/cpp]
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;
}
Ah... Fakt, Nie potrzebowałem wracać do głównej procedury. Przepraszam za kłopot.