Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы и WindowProc 
:(
    Опции темы
EnergoHokum
Дата 14.12.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: 3
Всего: 6



Я определил указатель на функцию-обработчик (которая внутри класса) вне класса,
Код

typedef LRESULT (TestClass::*pButton10Proc) (HWND,UINT,WPARAM,LPARAM);
pButton10Proc pTCB10P;

В классе определил саму функцию-обработчик
Код

// dll5.h
class TestClass
{
 public:
    TestClass(HWND hwnd);
    ~TestClass();
    LRESULT CALLBACK Button10Proc(HWND hwnd,UINT message,            \
                            WPARAM wParam,LPARAM lParam    \
                            );
};

Код

// dll5.cpp

TestClass::TestClass(HWND hwnd)
{
    hButton10=::CreateWindowEx(WS_EX_STATICEDGE,                \
                             "Button","Button 10",        \
                             WS_CHILD | WS_VISIBLE,        \
                             180,25,180,35,                        \
                             hWnd,0,NULL,NULL                    \
                             );

    pTCB10P=(pButton10Proc) (::SetWindowLong(hButton10,GWL_WNDPROC,(LONG)pTC));// pTC - указатель на TestClass, определён в h-ке
}

LRESULT CALLBACK TestClass::Button10Proc(HWND hwnd,UINT message,        \
                                 WPARAM wParam,LPARAM lParam    \
                                 )
{// пока пустая, потому что не работает
    return 0;
}


И на вызове SetWindowLong говорит, что не может привести результат SetWindowLong (LONG) к указателю, и про (LONG)pTC тоже говорит, что так нельзя.
Я скоро уйду, приду только в понедельник (может, в воскресенье). Если что надумаю -- напишу.
PM MAIL ICQ   Вверх
586
Дата 14.12.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Код
class TestClass
{
 public:
    TestClass(HWND hwnd);
    ~TestClass();
    static LRESULT  CALLBACK StaticButton10Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    LRESULT Button10Proc(HWND hwnd,UINT message,            \
                            WPARAM wParam,LPARAM lParam    \
                            );
};


Код
TestClass::TestClass(HWND hwnd)
{
    hButton10=::CreateWindowEx(WS_EX_STATICEDGE,                \
                             "Button","Button 10",        \
                             WS_CHILD | WS_VISIBLE,        \
                             180,25,180,35,                        \
                             hWnd,0,NULL,NULL                    \
                             );

    pTCB10P=(pButton10Proc) (::SetWindowLong(hButton10,GWL_WNDPROC,(LONG)StaticButton10Proc));
    SetWindowLong(hButton10, GWL_USERDATA, (long)this);
}

LRESULT CALLBACK TestClass::StaticButton10Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
     return ((TestClass*)GetWindowLong(hWnd, GWL_USERDATA))->Button10Proc(hWnd, uMsg, wParam, lParam);
}

LRESULT TestClass::Button10Proc(HWND hwnd,UINT message,        \
                                 WPARAM wParam,LPARAM lParam    \
                                 )
{
    return CallWindowProc(pTCB10P, hWnd, uMsg, wParam, lParam);
}

Код не проверял, могут быть ошибки

Это сообщение отредактировал(а) 586 - 14.12.2007, 17:07
PM   Вверх
Earnest
Дата 14.12.2007, 18:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



EnergoHokum, ты с упорством, достойным лучшего применения, пытаешься таки подсунуть метод класса в качестве WndProc. Что показывает, что ты не понимаешь сути. Это не просто придурь компилятора. Ты думаешь, раз сигнатуры статической или глобальной функции выглядят так же как сигнатура метода, то одно можно подсунуть вместо другого? У метода есть дополнительный неявный аргумент - this, который и нарушает похожесть сигнатур. При вызове метода он идет первым аргументом. А CALLBACK-функции его просто взять неокуда. Поэтому оконная функция может быть только статической. Далее, она может как-то определить, какой объект твоего класса соответствует hWnd и вызвать для этого объекта метод. Как определить - дело техники. Можно, как тебе показали, засунуть указатель в доп. память hWnd. Можно поддерживать внешний глобальный map hWnd->pWnd. Можно еще что-нибуль придумать. Но обойтись без этого "что-нибудь" не удастся. 


--------------------
...
PM   Вверх
EnergoHokum
Дата 17.12.2007, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: 3
Всего: 6



Я понимал, но "местами" (какими -- не скажу smile). Теперь ясно. Спасибо за разъяснение!
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0996 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.