Kultura
Помогающий
Offline
|
|
« : 17-12-2009 16:23 » |
|
Возникла необходимость реализовать в своей программе (пишу на vs 2008 express) property sheet с помощью winapi. Желательно сделать примерно как в студии: убраны стандартные кнопки, размер окна неограничен, используется прокрутка. В связи с этим 3 проблемы-вопроса: 1) При работе с окошком property sheet главное окно теряет фокус, и наоборот (см. картинку). 2) Неограниченный размер окна симулируется заданием больших значений размеров в ресурсных шаблонах для страниц контрола. Может быть возможно динамически изменять их размер? Или есть способ лучше для симуляции такого поведения? 3) Не совсем по property sheet, более общая: как сменить стиль отображения стандартных контролов? (см. картинку) Код не привожу, в связи с достаточно общими вопросами, но собрал тестовый пример. Посмотрите, подскажите, если не трудно. Пример состоит из простого окошка с дочерними статус баром, рабочим скролл баром и листом свойств. Так же см. картинку. P.S. Про конкурентов - ну, наверное, не стоит уточнять, что это такой дерзкий юмор
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 18-12-2009 04:23 » |
|
Kultura, отбрось этот нехороший property shit ) У него структура такая , что тебе показываются страницы - диалоги, они и держат на себе фокус. А у конкурентов всё нарисовано ручками, похоже. А прикрепи ка ихнюю программу, я кое-что спаем проверю как сменить стиль отображения стандартных контролов
нууу... как обычно ) Установка/удаление стилей //достать стили окна LONG GetWindowLong( HWND hWnd, GWL_STYLE //или GWL_EXSTYLE );
//установить стили LONG SetWindowLong( HWND hWnd, GWL_STYLE, //или GWL_EXSTYLE LONG dwNewLong// набор стилей );
|
|
« Последнее редактирование: 18-12-2009 04:30 от Алексей1153++ »
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #2 : 18-12-2009 16:14 » |
|
Алексей1153++, вря д ли они этот контрол сами рисовали. Сравни рабочий стол->свойства в ХР и их прог рамму (см. картинку с этим сообщением). Поведение одинаковое, нет, у них как раз property sheet xp-style. Приложить прог рамму не получится, она 800 кб. весит. Но ее можно скачать о тсюда: h**p://mh-nexus.de/en/hxd/ (это бесплатный хекс-редактор). как сменить стиль отображения стандартных контролов
нууу... как обычно ) Установка/удаление стилей Я не про те стили спрашиваю, а про visual styles. Т.е. чт обы все стандартные контролы стали выглядеть по-другому, в соотвествии с предустановленным в ОС стилем отображения. Там надо добавлять в свое приложение манифест, и это я делаю. Но все равно включить стили не получается, чего-то упускаю. Вот и вопрос, как все таки их включить? Может быть , есть возможность показать на примере моего тестового приложения?
|
|
« Последнее редактирование: 18-12-2009 18:54 от Sel »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 18-12-2009 16:35 » |
|
гы, результаты анализа довольно прикольные 1) ни одной русской буквы в их программе не видно, даже в инсталляхе, - всё битое. Ну это ладно, мы телепаты, всё же )) 2) таб-контрол (спай выделил его красным (вернее он то чёрным, но я перекрасил) ) - тут использован некий класс "TTntTabControl.UnicodeClass". Явно самописный (или борландовский ? ) вообще, вот дерево окон приложения
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 18-12-2009 16:41 » |
|
свойства рабстола - класс таб-контрола называется "SysTabControl32" и спай выделяет весь прямоугольник вкладки вместе с закладками. Так что это разное Я не за те стили спрашиваю, а за visual styles. Т.е. что бы все стандартные контролы стали выглядеть по-другому, в соотвествии с предустановленным в ОС стилем отображения.
это не знаю, никогда не делал. Сам рисую контролы, если стандартные не устраивают
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #5 : 18-12-2009 19:05 » |
|
Это явно XP-стили. В Borland последние версии IDE их автоматом к проекту подключают. Насколько я помню для VC++ проектов надо ресурс с файлом XP-манифеста подключать. Поиск в MSDN по ключевой фразе: Using Windows XP Visual Styles Сам рисую контролы, если стандартные не устраивают Алексей1153++, имхо, много лишней работы делаешь
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 18-12-2009 20:13 » |
|
имхо, много лишней работы делаешь ну это не так уж часто случается Зато это интересно, узнаёшь много нового и работает так, как хочешь
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #7 : 18-12-2009 20:17 » |
|
Хорошо, когда на это есть время.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 18-12-2009 20:40 » |
|
Ночью, если не спать, это время обязательно есть
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #9 : 18-12-2009 20:44 » |
|
Насколько я помню для VC++ проектов надо ресурс с файлом XP-манифеста подключать. Поиск в MSDN по ключевой фразе: Using Windows XP Visual Styles
Там не только манифест, еще надо что-то где-то прописать, вот на этом пока и застрял.
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #10 : 20-12-2009 07:30 » |
|
Ну а что насчет фокуса? Можно его убрать со страницы свойств на главное окно?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 20-12-2009 09:16 » |
|
попробуй в диалоге вкладки: ... ... case WM_SETFOCUS: { HWND tabctrl=GetParent(<хендл этой вкладки>); if(tabctrl) { HWND dialog=GetParent(tabctrl); if(dialog) { SetFocus(dialog); } } } break; ...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 20-12-2009 09:29 » |
|
Только это будет плохо. Может, стиль какой не указан ?
|
|
« Последнее редактирование: 20-12-2009 10:25 от Sel »
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #13 : 20-12-2009 12:06 » |
|
Алексей1153++, WM_SETFOCUS вкладки даже не получают. Во, стили помогли, спасибо. Нужно было WS_CHILD | WS_VISIBLE и все. Остался вопрос по визуальным стилям win XP, как их все таки подключить? Создал манифест, как в msdn написано, добавил его в ресурстный файл: CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "PropertySheets.exe.manifest" не компилится, выдает ошибки: 1>CVTRES : fatal error CVT1100: duplicate resource. type:MANIFEST, name:1, language:0x0409 1>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 20-12-2009 14:02 » |
|
опа... А что, без WS_CHILD не ронялось работало вообще ? )))
А WS_VISIBLE без нужды - этот стиль так-контрол меняет динамически, чтоб показать только нужную вкладку
По остальной части вопроса не знаю - всё это от диавола, дефолтный стиль XP вообще уродлив.
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #15 : 21-12-2009 18:15 » |
|
Все, разобрался. См. картинку. Оказывается, строка CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "PropertySheets.exe.manifest" уже включена по умолчанию, хотя этот момент я еще не до конца понимаю (может кто объяснит подробнее?). Поэтому и выскакивала ошибка дублирования ресурса. Итак, что бы включить визуальные стили в vs 2008 express нужно: - Добавить - Включить - Сделать - Добавить в проект файл - манифест, о котором говорится в msdn (искать "Enabling Visual Styles") Или включить строку #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") Кроме того, если возникнет необходимость рисовать свои контролы, которые могли бы реагировать на изменение стилей, можно посмотреть следующие примеры: - Класс для работы с визуальными стилями: http://www.codeproject.com/KB/winsdk/xpvisualstyle.aspx- Тоже, что и предыдущий, усовершенствованный: http://www.codeproject.com/KB/winsdk/themewrapper.aspx- Пример рисования кнопки с учетом XP стилей: http://www.codeproject.com/KB/buttons/NativeWin32XPThemes.aspx
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #16 : 22-12-2009 17:54 » |
|
Вопрос вдогонку: как узнать размеры списка свойств? Конкретно расстояние от верха до начала поля страницы. См. картинку.
Вычисление с помощью размеров окон property sheet и property page не работает. GetWindowRect выдает для обоих окон примерно одни и те же значения: разница +\- 3 точки, видимо из-за граничной рамки. Может быть есть стандартные функции вроде GetSystemMetrics () ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 23-12-2009 04:06 » |
|
Начнём с того, что точно можно определить расстояние от верха корешка до верха клиентской области вьюхи (вью - это подложка, где лежит таб , но не считая меню сверху) это узенькая полоска над табом) RECT rT; GetWindowRect(хендл таба,&rT);
RECT rView; tabctrl->GetWindowRect(хендл вьюхи,&rT);
высота полоски=rView.top-rT.top;
Затем надо прибавить высоту корешка - а вот как его достать, надо рыть мсдн, щас попробую
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 23-12-2009 04:13 » |
|
в принципе, вот решение - GetItemRect() (правда , я не уверен, что это размеры корешка, возсожно, это размеры всей вкладки - поэкспериментируй) Но надо просканировать все элементы и максимальнуые top/bottom достать, ибо корешки могут быть в несколько рядов Но, зато, можно точно определить расстояние между верхом диалога вкладки и верхом вьюхи
|
|
« Последнее редактирование: 23-12-2009 04:25 от Алексей1153++ »
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #19 : 23-12-2009 05:04 » |
|
PSM_GETCURRENTPAGEHWND
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 23-12-2009 05:10 » |
|
zubr, это всего лишь для получение хендла вкладки же
|
|
|
Записан
|
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #21 : 23-12-2009 15:33 » |
|
Первый способ вычитания RECT-в друг из друга дает размер только какой-то узкой полоски, но не размер поля, где находятся переключатели. Интересно, что функция ClientToScreen (), с координатами (0,0) , вызванная для вкладки (вью? - надо определиться с терминами ) выдает точку на поле переключателей, а вовсе не на рабочей области вкладки. А что за GetItemRect ()? Такой есть в mfc и еще INameSpaceTreeControl::GetItemRect (). Если речь идет о первом, так mfc у меня нету, а если о втором, то, как им пользоваться ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 24-12-2009 06:22 » |
|
Kultura, да, это mfc, всё время забываю не пользовался ClientToScreen , а GetWindowRect выдаёт координаты окна в абсолютных координатах. Поэтому, если надо лишь разницу найти - то вычитаем абсолютные координаты и всё. Ну и с отладчиком в случае непонятностей посидеть Но обычно всё решается на бумаге Проецирую координаты только АПИ шной ::MapWindowPoints , потому что MFC-шная, с её указателем на окно, часто запутывает
|
|
|
Записан
|
|
|
|
|