![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| nitnat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 4.8.2010 Репутация: нет Всего: нет |
Здравствуйте!
Уселся писать довольно сложное приложение на Win32API и решил сделать полностью уникальный графический интерфейс. Задумал совершенно уму не постижимые вещи, которые стандартными средствами винды не сделать, придется отрисовывать вручную, так что "создавать виндовые контролы и натягивать на них картинки" прошу не предлагать В общем, я так понял, собственный контрол можно создать, зарегистрировав его класс, создав окно и обрабатывая в его оконной процедуре события взаимодействия пользователя с ним и отрисовывать при получении WM_PAINT. Ну не грех ли не применять ООП в такой ситуации? Задумал я сделать класс, скажем, MyButton, там среди всего прочего метод Paint(void), в котором непосредственно отрисовка; этот метод надо вызывать в оконной процедуре по получению WM_PAINT. Объектов класса может быть сколько угодно, поэтому и оконные процедуры наверно удобнее лепить для каждого из них, т.е. тоже как член класса, но проблема состоит в том, что линкер ругается, если я подсовываю в структуру WNDCLASS non-static метод, а в static методе я не могу использовать this, а как тогда вызывать this->Paint()? А теперь, собственно, вопрос: есть ли способ сделать так, как я хочу, и если нет, то как лучше сделать? Заранее огромное спасибо. Это сообщение отредактировал(а) nitnat - 4.8.2010, 20:50 |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
есть. Например использовать можно связку SetWindowLong\GetWindowLong с параметром GWL_USERDATA
уверен, существуют и другие методы... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| nitnat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 4.8.2010 Репутация: нет Всего: нет |
Я не понимаю. Пожалуйста, объясните поподробнее, что вы предлагаете сделать. Спасибо.
|
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
nitnat, в общем тут пример http://www.gamedev.net/community/forums/to...?topic_id=59171
и гугл по словам "static wnd proc this" -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| ASMatic |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 254 Регистрация: 14.3.2009 Репутация: 1 Всего: 1 |
можно сделать все на одном окне и по координатам определять к какому контролу относиться данное сообщение....ИМХО
|
|||
|
||||
| nitnat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 4.8.2010 Репутация: нет Всего: нет |
По-моему это вообще извращение. Так можно докатиться до свалки тяжелочитаемого кода, который я потом сам понимать с трудом буду. Я собираюсь свой проект развивать и там будет столько этих кнопок(и не только кнопок), что я попросту запутаюсь в этих многочисленных проверках по координатам. Ух.. да вы не представляете, сколько я гуглил, прежде чем начать задавать вопросы во всевозможных чатах и форумах. Сейчас гляну, ссылочку, которую вы мне дали. |
|||
|
||||
| ASMatic |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 254 Регистрация: 14.3.2009 Репутация: 1 Всего: 1 |
nitnat,
кому как... думаете виндовс по другому определяет? пс. у моей(совмесной) программы интерфейс построен на таком принципе - хотите верте, хотите нет - все там читаемо и с помощью "двух кликов" добавляються новые контролы... учитесь абстрагировать - будет код читабельней. удачного написания!! |
|||
|
||||
| nitnat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 4.8.2010 Репутация: нет Всего: нет |
Огромное спасибо! Вроде вкурил, буду пробовать. Еще хотел попросить совета: стоит ли для каждого "типа" контрола(кнопка, поле ввода, список) регить свой WNDCLASS, или тупо везде юзать виндовый STATIC ? И если стоит, то тогда что, у всех указывать одну и ту же "hidden" оконную процедуру? Спасибо. Это сообщение отредактировал(а) nitnat - 4.8.2010, 23:26 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Ты ведь в основном внешний вид поменять хочешь? А ведь внешний вид - это даже не половина функциональности, а гораздо меньше. Так что не занимайся фигней, а настраивай стандартные контролы, по крайней мере кнопки точно глупо самому писать. Есть ведь OWNERDRAW и CUSTOMDRAW, с внешним видом можно что угодно сделать. А с помощью перехвата других сообщений можно и другое поведение изменить. Так что для каждого контрола подумай сначала, какую функциональность он реализует, и не использовать ли в качестве основы один из стандартных контролов. А STATIC использовать глупо, он тупо даже клики на себя хреново обрабатывает - ну процедура такая у него стандартная. Что касается метода связывания "зыза" с HWND я знаю 2 метода - первый тебе описал joinie (засунуть this в данные окна), второй - регистратор (т.е. при создании объекта-окна соответствие HWND->CBaseWnd* записывается в статический контейнер, откуда потом и достается при получении сообщений). -------------------- ... |
|||
|
||||
| Maks1509 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 22.8.2007 Где: г. Тольятти Репутация: нет Всего: 5 |
Статик подходит для обработки нажатий мышки, для этого надо стиль поменять у него на SS_NOTIFY, после этого можно хоть полноценную свою кнопку сделать на его основе. Делаю большинство своих контролов на основе статика. Правда немного корректнее нахлобучивать на контролы свои данные через SetProp, ежели через SetWindowLong - этих свойств может быть несколько, а вот GWL_USERDATA всего одна. Вот так вот захочешь перезасабклассить сдуру окно и затрёшь GWL_USERDATA.
Это сообщение отредактировал(а) Maks1509 - 5.8.2010, 13:37 |
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Я в курсе... Это совет типа: берем Мерс, сдираем краску, меняем двигатель на оный от мопеда и получаем классный Запорожец, hand-made. Ты можешь объяснить, зачем делать кнопку из статика, если есть Button? Можно еще таблицу на основе эдита сварганить. Добавлено через 4 минуты и 56 секунд
Смотри, как бы твое приложение одним интерфейсом и не ограничилось. А то перегоришь на самопальных кнопках и получишь кучу никому не нужного кода. Интерфейс (в смысле форму кнопок, а не логику взаимодействия) - это последнее, что нужно шлифовать. Сначала добейся того, чтобы твое приложение работало и делало что-то полезное. А кнопки можно и потом раскрасить, если желание и энтузиазм останутся... Или поумнеешь, пока над функционалом работать будешь, и возьмешь какое-нибудь готовое решение... -------------------- ... |
||||
|
|||||
| Maks1509 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 22.8.2007 Где: г. Тольятти Репутация: нет Всего: 5 |
Могу объяснить, мне нужен был контрол гиперссылки, но с некоторыми наворотами, а это практически кнопка полноценная (у меня шлёт родительскому окну STN_CLICKED - аналог BN_CLICKED). Так что путём нехитрых махинаций ради интереса и тренировки отрисовал потом целую кнопку, поддерживающую темы оформления на основе наработок со статиком. Ну и со статиком проще, достаточно WM_PAINT обработать, если не ошибаюсь, с кнопкой пришлось повозиться, не хватало WM_UPDATEUISTATE, иначе вся красота пропадала при потере фокуса и рисовалось всё стандартно, я пока узнал об этом сообщении уйму времени потратил на решение проблемы с отрисовкой стандартных кнопок. Но это опять же дело вкуса, кому как удобнее. |
|||
|
||||
| nitnat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 4.8.2010 Репутация: нет Всего: нет |
||||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: нет Всего: 17 |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Какая самонадеянность. И задаваемые вопросы прямо-таки гарантируют выполнение этих заяв. Не знаешь простых вещей, а собираешься сваять нечто сногсшибательное. Не смеши людей, парень. Но даже если так, то самый офигенно красивый и экзотический интерфейс никому не нужен, если программа ничего полезного не делает. И функционал гораздо важнее. А насчет "перегоришь" на кнопочках - ну не веришь, сам убедишься. Ничего страшного, конечно, "сын ошибок трудных" никому не повредит... -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |