А можно ли такое?
От: Аноним  
Дата: 10.03.06 13:33
Оценка:
Здравствуйте!
Создаю обычное WinApi приложение в VC++ 7.1. Регистрирую свой класс окна, создаю окно-кнопку. Получаю адрес оконной процедуры:
g_buttonProc = ::GetClassLong(hwnd, GCL_WNDPROC);

Оконная процедура своего окна выглядит так:
LRESULT CALLBACK WndProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    return g_buttonProc(hWnd, message, wParam, lParam);
      // или:
      // return CallWindowProc(g_buttonProc, hWnd, message, wParam, lParam);
      // если добавить "return DefWindowProc(hWnd, message, wParam, lParam);", то окно хотя бы создается.
}

Т.е. как будто копия "настоящей" оконной процедуры. Но она совсем не хочет вести себя как копия — она просто не создает даже окно

ЗЫ. Я конечно же понимаю, что это из области "слабо?". Но эта проблема мне покоя не дает
Re: Неужели никто не сталкивался?
От: Аноним  
Дата: 10.03.06 13:56
Оценка:
Здравствуйте, Аноним, Вы писали:
На самом деле есть парочка окнонных классов, где функционал реализуется на 90% своими илами, а остальное необходимо брать из существующей оконной ф-ции. Именно оттуда у вопроса "ноги растут"
Re: А можно ли такое?
От: Andrew S Россия http://alchemy-lab.com
Дата: 10.03.06 20:33
Оценка: 1 (1)
А>Здравствуйте!
А>Создаю обычное WinApi приложение в VC++ 7.1. Регистрирую свой класс окна, создаю окно-кнопку. Получаю адрес оконной процедуры:
А>
А>g_buttonProc = ::GetClassLong(hwnd, GCL_WNDPROC);
А>

А>Оконная процедура своего окна выглядит так:
А>
А>LRESULT CALLBACK WndProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
А>    return g_buttonProc(hWnd, message, wParam, lParam);
А>      // или:
А>      // return CallWindowProc(g_buttonProc, hWnd, message, wParam, lParam);
А>      // если добавить "return DefWindowProc(hWnd, message, wParam, lParam);", то окно хотя бы создается.
А>}
А>

А>Т.е. как будто копия "настоящей" оконной процедуры. Но она совсем не хочет вести себя как копия — она просто не создает даже окно

А>ЗЫ. Я конечно же понимаю, что это из области "слабо?". Но эта проблема мне покоя не дает


Должно все работать. Подобная техника используется часто и называется суперклассированием. Примеров оного — вагон и маленькая тележка. Используйте поиск...
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: А можно ли такое?
От: SergH Россия  
Дата: 11.03.06 11:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте!

А>Создаю обычное WinApi приложение в VC++ 7.1. Регистрирую свой класс окна, создаю окно-кнопку. Получаю адрес оконной процедуры:
А>
А>g_buttonProc = ::GetClassLong(hwnd, GCL_WNDPROC);
А>

А>Оконная процедура своего окна выглядит так:
А>
А>LRESULT CALLBACK WndProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
А>    return g_buttonProc(hWnd, message, wParam, lParam);
А>      // или:
А>      // return CallWindowProc(g_buttonProc, hWnd, message, wParam, lParam);
А>      // если добавить "return DefWindowProc(hWnd, message, wParam, lParam);", то окно хотя бы создается.
А>}
А>

А>Т.е. как будто копия "настоящей" оконной процедуры. Но она совсем не хочет вести себя как копия — она просто не создает даже окно

Т.е. ты пытаешься окну одного класса (своего) присобачить оконную процедуру другого (в данном случае — кнопки). Имхо, работать такое будет, если повезёт, и классы окажутся совместимыми с точки зрения оконной процедуры. А могут и не оказаться, например, количество дополнительных байт на окно/класс может отличаться, или ещё что-нибудь. Но принципиальных противопоказаний быть не должно. Для начала получи у той же кнопки GetClassLong остальные параметры, сравни со своими.
Делай что должно, и будь что будет
Re[2]: А можно ли такое?
От: Аноним  
Дата: 11.03.06 15:05
Оценка:
Здравствуйте, Andrew S, Вы писали:
AS>Должно все работать. Подобная техника используется часто и называется суперклассированием. Примеров оного — вагон и маленькая тележка. Используйте поиск...
+10
Оно самое!

Здравствуйте, SergH, Вы писали:
SH>Т.е. ты пытаешься окну одного класса (своего) присобачить оконную процедуру другого (в данном случае — кнопки). Имхо, работать такое будет, если повезёт, и классы окажутся совместимыми с точки зрения оконной процедуры. А могут и не оказаться, например, количество дополнительных байт на окно/класс может отличаться, или ещё что-нибудь. Но принципиальных противопоказаний быть не должно. Для начала получи у той же кнопки GetClassLong остальные параметры, сравни со своими.
Не пробовал, но думаю что эффект бедет тот же самый, что при действиях суперклассинга.

Спасибо всем!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.