Re[2]: Оконная функция - ЧЛЕН КЛАССА?!
От: av Россия  
Дата: 24.04.01 00:39
Оценка:
>Может, но только статическим, иначе ты всегда получишь первым параметром указатель на this.

Э-э-э... А каким таким образом статическая фнукция может получать доступ к нестатическим полям? По-моему все можно сделать двумя методами. Первый (дубовый, используктся в Borland VCL и по-моему в MFC) — это написать для каждого класса свою собственную функцию (не член класса), содержащая нечто вроде:

LRESULT CALLBACK MyClassWndProc (HWND hwndWindow, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
MYCLASS* MyClass;

// за правильность констант не ручаюсь, пишу по памяти
if (uMsg == WM_CREATE) {
// присоединить к окну адрес его класса, который должен передаваться как параметр
SetWindowLong (hwndWindow, GWL_USER, lParam);
}
MyClass = (MYCLASS*) GetWindowLong (hwndWindow, GWL_USER);
MyClass->MyMethod (uMsg, wParam, lParam);
}

void MyClass::CreateWindow (...)
{
...

hwndWindow = ::CreateWindow (... ,
(LPARAM) this); // параметр созания — как раз указатель на класс
}

Второй способ — поизящнее (но я его по памяти уже не напишу, изложу только идею). Смысл прост: создается класс/структура/массив/да_неавжо_что, содержащее в себе инструкции запихивания в стек адрес класса (то есть this). После этого просто выполняется jump на метод данного класса. И тогда вместо указателя на процедуру передаем указатель на _класс_ — все остальное он сделает сам. Минус — придется повозиться с реализацией. Плюс — один объект на всю программу. Если кому сильно надо — поищу равлизацию (где-то в архивах валялась).

Вот вроде все. Если у кого винды свалятся в результате применения написнного — ногами только не бейте! :-)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.