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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пользовательские контролы на Win32API, Отрисовка пользовательских контролов 
:(
    Опции темы
nitnat
Дата 4.8.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.8.2010

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



Здравствуйте!
Уселся писать довольно сложное приложение на Win32API и решил сделать полностью уникальный графический интерфейс. Задумал совершенно уму не постижимые вещи, которые стандартными средствами винды не сделать, придется отрисовывать вручную, так что "создавать виндовые контролы и натягивать на них картинки" прошу не предлагать smile Сторонние библиотеки тоже не приветствую: это лишнее.
В общем, я так понял, собственный контрол можно создать, зарегистрировав его класс, создав окно и обрабатывая в его оконной процедуре события взаимодействия пользователя с ним и отрисовывать при получении WM_PAINT. Ну не грех ли не применять ООП в такой ситуации? Задумал я сделать класс, скажем, MyButton, там среди всего прочего метод Paint(void), в котором непосредственно отрисовка; этот метод надо вызывать в оконной процедуре по получению WM_PAINT. Объектов класса может быть сколько угодно, поэтому и оконные процедуры наверно удобнее лепить для каждого из них, т.е. тоже как член класса, но проблема состоит в том, что линкер ругается, если я подсовываю в структуру WNDCLASS non-static метод, а в static методе я не могу использовать this, а как тогда вызывать this->Paint()?
А теперь, собственно, вопрос: есть ли способ сделать так, как я хочу, и если нет, то как лучше сделать? smile
Заранее огромное спасибо.

Это сообщение отредактировал(а) nitnat - 4.8.2010, 20:50
PM MAIL   Вверх
jonie
Дата 4.8.2010, 20:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 7
Всего: 118



есть. Например использовать можно связку SetWindowLong\GetWindowLong с параметром GWL_USERDATA
уверен, существуют и другие методы...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
nitnat
Дата 4.8.2010, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.8.2010

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



Я не понимаю. Пожалуйста, объясните поподробнее, что вы предлагаете сделать. Спасибо.
PM MAIL   Вверх
jonie
Дата 4.8.2010, 21:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 7
Всего: 118



nitnat, в общем тут пример http://www.gamedev.net/community/forums/to...?topic_id=59171
и гугл по словам "static wnd proc this"


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ASMatic
Дата 4.8.2010, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 14.3.2009

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



можно сделать все на одном окне и по координатам определять к какому контролу относиться данное сообщение....ИМХО
PM MAIL   Вверх
nitnat
Дата 4.8.2010, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.8.2010

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



Цитата(ASMatic @  4.8.2010,  21:38 Найти цитируемый пост)
можно сделать все на одном окне и по координатам определять к какому контролу относиться данное сообщение....ИМХО 

По-моему это вообще извращение. Так можно докатиться до свалки тяжелочитаемого кода, который я потом сам понимать с трудом буду. Я собираюсь свой проект развивать и там будет столько этих кнопок(и не только кнопок), что я попросту запутаюсь в этих многочисленных проверках по координатам.
Цитата(jonie @  4.8.2010,  21:37 Найти цитируемый пост)
и гугл по словам "static wnd proc this"

Ух.. да вы не представляете, сколько я гуглил, прежде чем начать задавать вопросы во всевозможных чатах и форумах.
Сейчас гляну, ссылочку, которую вы мне дали.
PM MAIL   Вверх
ASMatic
Дата 4.8.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 14.3.2009

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



nitnat, 
кому как...
думаете виндовс по другому определяет?

пс. у моей(совмесной) программы интерфейс построен на таком принципе - хотите верте, хотите нет - все там читаемо и с помощью "двух кликов" добавляються новые контролы...
учитесь абстрагировать - будет код читабельней.
удачного написания!!
PM MAIL   Вверх
nitnat
Дата 4.8.2010, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.8.2010

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



Цитата(jonie @  4.8.2010,  21:37 Найти цитируемый пост)
nitnat, в общем тут пример http://www.gamedev.net/community/forums/to...?topic_id=59171

Огромное спасибо! Вроде вкурил, буду пробовать.
Еще хотел попросить совета: стоит ли для каждого "типа" контрола(кнопка, поле ввода, список) регить свой WNDCLASS, или тупо везде юзать виндовый STATIC ? И если стоит, то тогда что, у всех указывать одну и ту же "hidden" оконную процедуру? Спасибо.

Это сообщение отредактировал(а) nitnat - 4.8.2010, 23:26
PM MAIL   Вверх
Earnest
Дата 5.8.2010, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nitnat @  5.8.2010,  00:23 Найти цитируемый пост)
 стоит ли для каждого "типа" контрола(кнопка, поле ввода, список) регить свой WNDCLASS, или тупо везде юзать виндовый STATIC 

Ты ведь в основном внешний вид поменять хочешь? А ведь внешний вид - это даже не половина функциональности, а гораздо меньше. Так что не занимайся фигней, а настраивай стандартные контролы, по крайней мере кнопки точно глупо самому писать. Есть ведь OWNERDRAW и CUSTOMDRAW, с внешним видом можно что угодно сделать. А с помощью перехвата других сообщений можно и другое поведение изменить. Так что для каждого контрола подумай сначала, какую функциональность он реализует, и не использовать ли в качестве основы один из стандартных контролов. А STATIC использовать глупо, он тупо даже клики на себя хреново обрабатывает - ну процедура такая у него стандартная.
Что касается метода связывания "зыза" с HWND я знаю 2 метода - первый тебе описал joinie (засунуть this в данные окна), второй - регистратор (т.е. при создании объекта-окна соответствие HWND->CBaseWnd* записывается в статический контейнер, откуда потом и достается при получении сообщений). 


--------------------
...
PM   Вверх
Maks1509
Дата 5.8.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.8.2007
Где: г. Тольятти

Репутация: нет
Всего: 5



Статик подходит для обработки нажатий мышки, для этого надо стиль поменять у него на SS_NOTIFY, после этого можно хоть полноценную свою кнопку сделать на его основе. Делаю большинство своих контролов на основе статика. Правда немного корректнее нахлобучивать на контролы свои данные через SetProp, ежели через SetWindowLong - этих свойств может быть несколько, а вот GWL_USERDATA всего одна. Вот так вот захочешь перезасабклассить сдуру окно и затрёшь GWL_USERDATA.

Это сообщение отредактировал(а) Maks1509 - 5.8.2010, 13:37
PM MAIL ICQ   Вверх
Earnest
Дата 5.8.2010, 16:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Maks1509 @  5.8.2010,  14:36 Найти цитируемый пост)
Статик подходит для обработки нажатий мышки, для этого надо стиль поменять у него на SS_NOTIFY, после этого можно хоть полноценную свою кнопку сделать на его основе

Я в курсе... Это совет типа: берем Мерс, сдираем краску, меняем двигатель на оный от мопеда и получаем классный Запорожец, hand-made. Ты можешь объяснить, зачем делать кнопку из статика, если есть Button? Можно еще таблицу на основе эдита сварганить.

Добавлено через 4 минуты и 56 секунд
Цитата(nitnat @  4.8.2010,  21:49 Найти цитируемый пост)
Уселся писать довольно сложное приложение на Win32API и решил сделать полностью уникальный графический интерфейс.

Смотри, как бы твое приложение одним интерфейсом и не ограничилось. А то перегоришь на самопальных кнопках и получишь кучу никому не нужного кода. Интерфейс (в смысле форму кнопок, а не логику взаимодействия) - это последнее, что нужно шлифовать. Сначала добейся того, чтобы твое приложение работало и делало что-то полезное. А кнопки можно и потом раскрасить, если желание и энтузиазм останутся... Или поумнеешь, пока над функционалом работать будешь, и возьмешь какое-нибудь готовое решение...
 smile 



--------------------
...
PM   Вверх
Maks1509
Дата 5.8.2010, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.8.2007
Где: г. Тольятти

Репутация: нет
Всего: 5



Цитата(Earnest @ 5.8.2010,  16:22)
Я в курсе... Это совет типа: берем Мерс, сдираем краску, меняем двигатель на оный от мопеда и получаем классный Запорожец, hand-made. Ты можешь объяснить, зачем делать кнопку из статика, если есть Button? Можно еще таблицу на основе эдита сварганить.

Могу объяснить, мне нужен был контрол гиперссылки, но с некоторыми наворотами, а это практически кнопка полноценная (у меня шлёт родительскому окну STN_CLICKED - аналог BN_CLICKED). Так что путём нехитрых махинаций ради интереса и тренировки отрисовал потом целую кнопку, поддерживающую темы оформления на основе наработок со статиком. Ну и со статиком проще, достаточно WM_PAINT обработать, если не ошибаюсь, с кнопкой пришлось повозиться, не хватало WM_UPDATEUISTATE, иначе вся красота пропадала при потере фокуса и рисовалось всё стандартно, я пока узнал об этом сообщении уйму времени потратил на решение проблемы с отрисовкой стандартных кнопок. Но это опять же дело вкуса, кому как удобнее.
PM MAIL ICQ   Вверх
nitnat
Дата 6.8.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.8.2010

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



Цитата(Earnest @  5.8.2010,  08:31 Найти цитируемый пост)
Ты ведь в основном внешний вид поменять хочешь?

Перечитайте внимательно первый пост. Я хочу сделать то, чего ни один из вас в Windows-приложениях еще не видел.
PM MAIL   Вверх
Amp
Дата 7.8.2010, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



Цитата(nitnat @  6.8.2010,  23:22 Найти цитируемый пост)
Я хочу сделать то, чего ни один из вас в Windows-приложениях еще не видел. 

Ой ли? Заинтриговали smile
PM MAIL   Вверх
Earnest
Дата 9.8.2010, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nitnat @  7.8.2010,  00:22 Найти цитируемый пост)
Я хочу сделать то, чего ни один из вас в Windows-приложениях еще не видел. 

Какая самонадеянность. И задаваемые вопросы прямо-таки гарантируют выполнение этих заяв. 
Не знаешь простых вещей, а собираешься сваять нечто сногсшибательное.
Не смеши людей, парень. smile 
Но даже если так, то самый офигенно красивый и экзотический интерфейс никому не нужен, если программа ничего полезного не делает.
И функционал гораздо важнее. А насчет "перегоришь" на кнопочках - ну не веришь, сам убедишься. Ничего страшного, конечно, "сын ошибок трудных" никому не повредит... 


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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