Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: winapi Property sheet  (Прочитано 22995 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kultura
Помогающий

ru
Offline Offline

« : 17-12-2009 16:23 » 

Возникла необходимость реализовать в своей программе (пишу на vs 2008 express) property sheet с помощью winapi. Желательно сделать примерно как в студии: убраны стандартные кнопки, размер окна неограничен, используется прокрутка.

В связи с этим 3 проблемы-вопроса:
1) При работе с окошком property sheet главное окно теряет фокус, и наоборот (см. картинку).
2) Неограниченный размер окна симулируется заданием больших значений размеров в ресурсных шаблонах для страниц  контрола. Может быть возможно динамически изменять их размер? Или есть способ лучше для симуляции такого поведения?
3) Не совсем по property sheet, более общая: как сменить стиль отображения стандартных контролов? (см. картинку)

Код не привожу, в связи с достаточно общими вопросами, но собрал тестовый пример. Посмотрите, подскажите, если не трудно.
Пример состоит из простого окошка с дочерними статус баром, рабочим скролл баром и листом свойств. Так же см. картинку.
P.S. Про конкурентов - ну, наверное, не стоит уточнять, что это такой дерзкий юмор Улыбаюсь


* PropertySheets.jpg (134.56 Кб - загружено 1061 раз.)
* PropertySheets.7z (21.16 Кб - загружено 964 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Помогающий

ru
Offline Offline

« Ответ #2 : 18-12-2009 16:14 » 

Алексей1153++, вряд ли они этот контрол сами рисовали. Сравни рабочий стол->свойства в ХР и их программу (см. картинку с этим сообщением). Поведение одинаковое, нет, у них как раз property sheet xp-style.
Приложить программу не получится, она 800 кб. весит. Но ее можно скачать отсюда:
h**p://mh-nexus.de/en/hxd/  (это бесплатный хекс-редактор).

Цитата
как сменить стиль отображения стандартных контролов
нууу... как обычно ) Установка/удаление стилей

Я не про те стили спрашиваю, а про visual styles. Т.е. чтобы все стандартные контролы стали выглядеть по-другому, в соотвествии с предустановленным в ОС стилем отображения.
Там надо добавлять в свое приложение манифест, и это я делаю. Но все равно включить стили не получается, чего-то упускаю. Вот и вопрос, как все таки их включить? Может быть, есть возможность показать на примере моего тестового приложения?

* Compare.jpg (29.74 Кб - загружено 952 раз.)
« Последнее редактирование: 18-12-2009 18:54 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 18-12-2009 16:35 » 

гы, результаты анализа довольно прикольные

1) ни одной русской буквы в их программе не видно, даже в инсталляхе, - всё битое. Ну это ладно, мы телепаты, всё же ))
2) таб-контрол (спай выделил его красным (вернее он то чёрным, но я перекрасил) ) - тут использован некий класс "TTntTabControl.UnicodeClass". Явно самописный (или борландовский ? )



вообще, вот дерево окон приложения


* hxd_autopsy.PNG (26.48 Кб - загружено 2761 раз.)
* hxd_autopsy2.PNG (29.24 Кб - загружено 2666 раз.)
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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++, имхо, много лишней работы делаешь Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 18-12-2009 20:13 » 

Цитата
имхо, много лишней работы делаешь Улыбаюсь
ну это не так уж часто случается Улыбаюсь Зато это интересно, узнаёшь много нового и работает так, как хочешь
Записан

zubr
Гость
« Ответ #7 : 18-12-2009 20:17 » 

Хорошо, когда на это есть время.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 18-12-2009 20:40 » 

Ночью, если не спать, это время обязательно есть Ага
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #9 : 18-12-2009 20:44 » 

Насколько я помню для VC++ проектов надо ресурс с файлом XP-манифеста подключать. Поиск в MSDN по ключевой фразе: Using Windows XP Visual Styles

Там не только манифест, еще надо что-то где-то прописать, вот на этом пока и застрял.
Записан
Kultura
Помогающий

ru
Offline Offline

« Ответ #10 : 20-12-2009 07:30 » 

Ну а что насчет фокуса? Можно его убрать со страницы свойств на главное окно?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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;
...
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 20-12-2009 09:29 » 

Только это будет плохо. Может, стиль какой не указан ?
« Последнее редактирование: 20-12-2009 10:25 от Sel » Записан

Kultura
Помогающий

ru
Offline 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
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 20-12-2009 14:02 » 

опа... А что, без WS_CHILD не ронялось работало вообще ? )))

А WS_VISIBLE без нужды - этот стиль так-контрол меняет динамически, чтоб показать только нужную вкладку

По остальной части вопроса не знаю - всё это от диавола, дефолтный стиль XP вообще уродлив.
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #15 : 21-12-2009 18:15 » 

Все, разобрался. См. картинку.
Оказывается, строка
Код:
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "PropertySheets.exe.manifest"
уже включена по умолчанию, хотя этот момент я еще не до конца понимаю (может кто объяснит подробнее?). Поэтому и выскакивала ошибка дублирования ресурса.

Итак, что бы включить визуальные стили в vs 2008 express нужно:
- Добавить
Код:
comctl32.lib
- Включить
Код:
<commctrl.h>
- Сделать
Код:
InitCommonControls ();
- Добавить в проект файл - манифест, о котором говорится в  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


* Compare2.jpg (73.4 Кб - загружено 957 раз.)
Записан
Kultura
Помогающий

ru
Offline Offline

« Ответ #16 : 22-12-2009 17:54 » 

Вопрос вдогонку: как узнать размеры списка свойств? Конкретно расстояние от верха до начала поля страницы. См. картинку.

Вычисление с помощью размеров окон property sheet и property page не работает. GetWindowRect выдает для обоих окон примерно одни и те же значения: разница +\- 3 точки, видимо из-за граничной рамки. Может быть есть стандартные функции вроде GetSystemMetrics () ?


* Sizes.jpg (14.4 Кб - загружено 928 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 23-12-2009 04:06 » 

Начнём с того, что точно можно определить расстояние от верха корешка до верха клиентской области вьюхи (вью - это подложка, где лежит таб , но не считая меню сверху)

это узенькая полоска над табом)
Код:
RECT rT;
GetWindowRect(хендл таба,&rT);

RECT rView;
tabctrl->GetWindowRect(хендл вьюхи,&rT);

высота полоски=rView.top-rT.top;


Затем надо прибавить высоту корешка - а вот как его достать, надо рыть мсдн, щас попробую
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 23-12-2009 05:10 » 

zubr, это всего лишь для получение хендла вкладки же
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #21 : 23-12-2009 15:33 » 

Первый способ вычитания RECT-в друг из друга дает размер только какой-то узкой полоски, но не размер поля, где находятся переключатели. Интересно, что функция ClientToScreen (), с координатами (0,0) , вызванная для вкладки (вью? - надо определиться с терминами  Улыбаюсь ) выдает точку на поле переключателей, а вовсе не на рабочей области вкладки.

А что за GetItemRect ()? Такой есть в mfc и еще INameSpaceTreeControl::GetItemRect (). Если речь идет о первом, так mfc у меня нету, а если о втором, то, как им пользоваться ?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 24-12-2009 06:22 » 

Kultura, да, это mfc, всё время забываю

не пользовался ClientToScreen , а GetWindowRect выдаёт координаты окна в абсолютных координатах. Поэтому, если надо лишь разницу найти - то вычитаем абсолютные координаты и всё. Ну и с отладчиком в случае непонятностей посидеть Улыбаюсь Но обычно всё решается на бумаге

Проецирую координаты только АПИ шной ::MapWindowPoints , потому что MFC-шная, с её указателем на окно, часто запутывает
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines