Romeo » 25 ноя 2007, 23:21
Смысл сабклассинга ты описал верно. Сабклассинг - это наследование поведения контрола. Как и в случае наследования класов, ты можешь либо сохранить поведение базовой сущности, либо изменить это поведение (уберя функциональность, заместив её или дополнив).
Реализуется саклассинг, как ты верно подметил, простой подменой WndProc при программировании на чистом Win32 API. Библиотечные надстройки (MFC, ATL), естественно, предоставляют специальные методы для сабклассинга, например SubcalssWindow, так что о прямой подмене WinProc в этом случае не идёт. Так же замечу, что в WinXP появились специализированные функции уровня ядра для забклассинга, которые позволяют избежать некоторых минусов, таких как невозможность произвести повторный сабклассин уже отсабклассинного контрола и некоторые другие, которые налагались на старый подход. Благо в эти ограничения конечный программист упирается крайне редко и вариант простой подмены WndProc функционален для подовляющего большинства случаев. Подробности о разнице сабклассинга до WinXP и после его выхода можно прочитать здесь:
http://msdn2.microsoft.com/en-us/library/bb773183.aspx
Теперь по поводу "жёсткого харкода". Я сгоряча подумал, что ты засунул такую проверку прямо в главный цикл обработки сообщений приложения. Потому и сильно удивился. Если ты это делаешь в PreTranslateMessage самого контрола, то ничего страшного в этом нет, хотя, я настаиваю на этом, сабклассинг является более академичным подходом.
Какая разница между if'ом в PreTranslateMessega и написанием обработчика WM_PAINT в отсабклашеном классе-контроле? Для твоего крайне простого случая - никакой. Но сабклассинг является более мощныи средством и об этом следует помнить. В помощью сабклассинга можно обрабатывать так называемый message reflection в то время, как втискивая код в PreTranslateMessage класса-контрола это будет сделать не то, что не возможно, но крайне затруднительно.
Если ты говоришь, что попробовал сабклассинг, и всё равно не работает, то нужно разбираться в чём дело более детально. Предлагая скинуть сюда имплементацию WM_PAINT для твоего класса-контрола и также участок кода, в котором происходит сабклассинг. Попробую тебе помочь.
Смысл сабклассинга ты описал верно. Сабклассинг - это наследование поведения контрола. Как и в случае наследования класов, ты можешь либо сохранить поведение базовой сущности, либо изменить это поведение (уберя функциональность, заместив её или дополнив).
Реализуется саклассинг, как ты верно подметил, простой подменой WndProc при программировании на чистом Win32 API. Библиотечные надстройки (MFC, ATL), естественно, предоставляют специальные методы для сабклассинга, например SubcalssWindow, так что о прямой подмене WinProc в этом случае не идёт. Так же замечу, что в WinXP появились специализированные функции уровня ядра для забклассинга, которые позволяют избежать некоторых минусов, таких как невозможность произвести повторный сабклассин уже отсабклассинного контрола и некоторые другие, которые налагались на старый подход. Благо в эти ограничения конечный программист упирается крайне редко и вариант простой подмены WndProc функционален для подовляющего большинства случаев. Подробности о разнице сабклассинга до WinXP и после его выхода можно прочитать здесь:
[url]http://msdn2.microsoft.com/en-us/library/bb773183.aspx[/url]
Теперь по поводу "жёсткого харкода". Я сгоряча подумал, что ты засунул такую проверку прямо в главный цикл обработки сообщений приложения. Потому и сильно удивился. Если ты это делаешь в PreTranslateMessage самого контрола, то ничего страшного в этом нет, хотя, я настаиваю на этом, сабклассинг является более академичным подходом.
Какая разница между if'ом в PreTranslateMessega и написанием обработчика WM_PAINT в отсабклашеном классе-контроле? Для твоего крайне простого случая - никакой. Но сабклассинг является более мощныи средством и об этом следует помнить. В помощью сабклассинга можно обрабатывать так называемый message reflection в то время, как втискивая код в PreTranslateMessage класса-контрола это будет сделать не то, что не возможно, но крайне затруднительно.
Если ты говоришь, что попробовал сабклассинг, и всё равно не работает, то нужно разбираться в чём дело более детально. Предлагая скинуть сюда имплементацию WM_PAINT для твоего класса-контрола и также участок кода, в котором происходит сабклассинг. Попробую тебе помочь.