Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alamar5  
Кусок кода DrawButtons
 
 
Добавлено:
alamar5  
Кусок кода DrawButtons

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 12:30 03-03-2010
alamar5

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RedPromo
Спасибо за пример.
Но в нем все необходимые отступы и размеры формируются вручную с использованием неких констант (зазор в 2 пиксела и т.п).  
Ну ладно, когда темы нет, там по части координат всё достаточно жестко и неизменно и не ошибешься.
 
А при рисовании с использованием темы, например, той же темы Aero в Win7, кнопки могут рисоваться как внутри заголовка (виртуальная Win7 под VMWare Workstation 6.5, 3D в виртуальной машине не поддерживается), так и выходить на его край (обычная, "невиртуальная" Win7, 3D есть).  
Т.е., получается, что координаты прямоугольника кнопки тут должны как-то по-другому вычисляться.  
 
Я понимаю, в принципе (при отсутствии 3D), в Win7 можно теми же эмпирическими (во всяком случае, недокументированными) константами пользоваться, т.к. схема размещения кнопок вроде бы совпадает с тем, что делается в WinXP.
 
Но, всё равно, по сути выходит, что иначе, чем задавать смещения вручную, никак и не сделать?
 
 

Всего записей: 439 | Зарегистр. 09-07-2005 | Отправлено: 16:52 03-03-2010 | Исправлено: alamar5, 16:53 03-03-2010
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alamar5
Да формирование размеров кнопок задается темой и получить эти размеры можно но отступы скорее всего прийдется через константы. Хотя может искать TopLeft от нижней части Caption тогда согласно размерам вылезет хоть за край.
Можно еще посмотреть эту функцию с использованием themes Options.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 17:25 03-03-2010 | Исправлено: RedPromo, 17:32 03-03-2010
alamar5

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RedPromo
В этой ф-ции всё строится на том, что координаты кнопки передаются извне в качестве параметра. Причем GetThemePartSize выдает размер кнопки по умолчанию (у меня 20х20 пикселов) и это значение не зависит от пользовательских настроек.
Чтобы получить реальный размер кнопки, можно вызвать GetThemePartSize с параметром TS_DRAW, задав в качестве входного пр-ка 0,0,GetSystemMetrics(SM_CXSIZE),GetSystemMetrics(SM_CYSIZE).  
Если GetSystemMetrics выдает размер кнопки 20х20, то на выходе GTPS получим пр-к 2,2,18,18. Что, вроде бы, и надо, но у меня под WinXP это работает, а под Win7 нет. Там выходной пр-к совпадает со входным и нужные отступы так не получить.
 
В общем, похоже, что иначе, чем через константы, не сделать.  
Ни GetThemeMargins, ни GetThemePosition, ни GetThemeRect для кнопок в заголовке не работают.
Может, что-то через GetThemeInt (или типа того) можно выжать, пока не знаю. Инфы-то практически нет.  

Всего записей: 439 | Зарегистр. 09-07-2005 | Отправлено: 18:17 03-03-2010
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alamar5
Понял проблема закралась в Windows 7 в работе функций Theme.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 19:04 03-03-2010
alamar5

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RedPromo
Насчет тем Windows я по ходу нашел вот такую статью.
Для меня, во всяком случае, она хоть как-то по полочкам тему раскладывает.
 

Всего записей: 439 | Зарегистр. 09-07-2005 | Отправлено: 20:54 03-03-2010 | Исправлено: alamar5, 20:54 03-03-2010
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alamar5
Интересно Демонстрационное приложение для исследования Visual Styles API.
Затра проверю какие параметры оно мне выдает на Win7 размера buttons caption.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 23:10 03-03-2010
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alamar5
У меня программа выдает адеватные правильные размеры согласно текущему стилю на Вин7
Информация

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 15:55 04-03-2010
alamar5

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RedPromo
Различие, возможно, объясняется тем, что у меня Win7 виртуальная и в ней под VMWare 6.5, как я говорил, неклиентская область (в т.ч. заголовок) окна рисуется не так, как в обычной. В VMWare Workstation 7 всё, возможно, будет рисоваться как положено, но у меня ее пока нет.
 
Сейчас, под VMWare 6.5 у меня GetThemePartSize для кнопок выдает (при минимальной выставленной в настройках виртуальной Win7 высоте заголовка, 20, кажется) размер 35х21, а реальный размер кнопки 31х15 (т.е., отступы совсех сторон по 2 пиксела).
 
А что за демонстрационное приложение?

Всего записей: 439 | Зарегистр. 09-07-2005 | Отправлено: 18:40 04-03-2010 | Исправлено: alamar5, 18:40 04-03-2010
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alamar5
Демонстрационное приложение для исследования Visual Styles API и его исходные тексты (Delphi). Исходные тексты также включают в себя пример работы с Microsoft XML 2.0. Отмечу, что в силу природной лени я не определил полностью все константы для элементов и состояний, но Вы всегда можете либо доработать это приложение, либо создать и дополнить XML-документ, определяющий схему визуального стиля. Загрузить >>>.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 19:50 04-03-2010
alamar5

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RedPromo
Спасибо. Но я, в итоге, решил оствить это рисование Windows. Я думал, можно относительно простыми средствами (вызовами Theme-функций)  получить расположение кнопок.  
Я решил, что эта нестандартная рамка будет рисоваться только в случае, когда выбрана классическая тема WinXP, т.е., когда размер и расположение кнопок хорошо предсказуемы.  
 
У меня сейчас другой вопрос.
Для случая, когда рисуется эта нестандартная тонкая рамка, системное меню (меню окна) получается расположенным внутри клиентской области (со сдвигом по диагонали на пару пикселов, но тем не менее).
Чтобы оно располагалось вплотную к левому верхнему краю клиентской области, в обработчике WM_NCLBUTTONDOWN делаю следующее:

Код:
 
            POINT pt = { 0, 0 };
            ClientToScreen(hWnd, &pt);
            int sys_cmd = TrackPopupMenuEx(
                GetSystemMenu(hWnd, FALSE),  
                TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_RETURNCMD|TPM_NONOTIFY, pt.x, pt.y, hWnd, NULL);
            if (sys_cmd) PostMessage(hWnd, WM_SYSCOMMAND, sys_cmd, 0);
 

 
В результате меню рисуется там, где надо, но я не могу воспроизвести поведение меню при последовательных нажатиях на иконку с заголовке окна.  
Система по умолчанию отображает меню по следующей схеме:
1) левый клик на иконке -> меню появляется
2) отпустили мышку -> без изменений
3) нажали снова -> без изменений
4) снова отпустили -> меню исчезло.
 
Я попробовал использовать флажок, разрешающий отображение меню "через раз". Это работает, но я не понимаю, как добиться, чтобы меню "пережило" п.3.  
т.к. оно (меню )исчезает до того, как в п.3 приходит уведомление WM_NCLBUTTONDOWN. Т.е., ичезновение меню, получается, не предотвратить.  
 
В общем, мне непонятно пока, как реализовать то поведение меню, которое по умолчанию обеспечивает система при кликах мышкой на иконке в заголовке?
 
 
 
 

Всего записей: 439 | Зарегистр. 09-07-2005 | Отправлено: 17:28 15-03-2010
CruelCrow

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно ли выполнить JS/VBScript прямо из памяти, не записывая временный файл на диск для передачи его потом параметром wscript.exe через system() или CreateProcess()?

Всего записей: 109 | Зарегистр. 21-05-2006 | Отправлено: 22:14 14-04-2010 | Исправлено: CruelCrow, 22:15 14-04-2010
vlary



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем доброе время суток!
Написал некое десктопное приложение, которое собирает некоторую информацию в сети, визуализирует ее и пишет лог. При нажатии кнопки или меню запускает с помощью CreateProcess() notepad.exe с параметром в виде имени файла лога.
При работе на локальном компьютере блокнот с содержимым лога без проблем возникает на экране.
Однако, при ее работе в терминальной сессии на 2003 сервере (для этого, собственно, и предназначалась), ничего при нажатии кнопки не происходит.
Каким образом запустить блокнот из программы, чтобы это работало и в терминальной сессии?

Всего записей: 17280 | Зарегистр. 13-06-2007 | Отправлено: 22:32 06-07-2010 | Исправлено: vlary, 22:34 06-07-2010
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vlary
ИМХО ShellExecute более в тему.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:55 07-07-2010
vlary



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt ShellExecute тоже пробовал. Результат аналогичный, на компе все работает, в терминалке - нет.

Всего записей: 17280 | Зарегистр. 13-06-2007 | Отправлено: 10:44 07-07-2010
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vlary
Приведи код запуска, попробую у себя.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 11:58 07-07-2010
vlary



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt Все, отбой! Дело оказалось в функции GetWindowsDirectory(), которая в терминалке возвращает отнюдь не директорию Виндовс, поэтому блокнота в том месте, где я его рассчитывал найти, просто не было. Добавил проверку на работу в терминале по GetSystemMetrics( SM_REMOTESESSION ), скорректировал путь к  директории Виндовс, убрав лишнее, после этого все заплясало.

Всего записей: 17280 | Зарегистр. 13-06-2007 | Отправлено: 14:13 07-07-2010
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vlary
При ShellExecute вообще не надо заботиться о поиске блокнота - операционка сама должна определить приложение для открытия файла.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 15:38 07-07-2010
vlary



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Цитата:
При ShellExecute вообще не надо заботиться о поиске блокнота
Да я знаю... Просто при замене CreateProcess на ShellExecute оставил тот же полный пункт к блокноту. Ну и не прокатило.

Всего записей: 17280 | Зарегистр. 13-06-2007 | Отправлено: 15:57 07-07-2010
getwellsoon

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Дурацкий вопрос - при использовании функции WriteFile для записи в файл на диске, надо ли проверять возвращенный параметр с информацией о количестве реально записанных данных? Или в данном случае это совершенно излишне?

Всего записей: 382 | Зарегистр. 26-07-2008 | Отправлено: 14:30 11-07-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru