|
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 67
|
|
Как расположить клиентскую область стороннего окна в определённой позиции экрана08.11.2014, 19:32. Показов 2873. Ответов 13
Метки нет (Все метки)
Собственно, задача проста: надо расположить стороннее приложение так, что бы его клиентская область начиналась с позиции Х, Y и была размером Width, Height.
Что пробовалось: Win32.SetWindowPos - задаёт позицию и размер всего окна, при этом клиентская область урезается согласно настройкам персонализации Виндовс. класс SystemInformation - так и не нашёл в нём толщин бордюров для разных стилей винды. Нашёл волшебную функцию AdjustWindowRectEx, которая в связке с SetWindowPos обещает решить проблему, но не получается совладать с её параметрами (непонятно что писать на месте стилей/какие текущие стили брать). Xотелось бы решить этот вопрос средствами С# (мне почему то кажется, что он всё же должен обладать необходимыми инструментами). На худой конец, если это невозможно без импорта сторонних библиотек, то любым доступным способом.
0
|
|
| 08.11.2014, 19:32 | |
|
Ответы с готовыми решениями:
13
Вывести системное время в определенной позиции экрана Ввести символ. Вывести его в определённой позиции экрана Как перерисовать всю клиентскую область? |
|
Администратор
|
||||||
| 09.11.2014, 15:44 | ||||||
|
Andreys5, код достаточно простой, если использовать MoveWindow()
0
|
||||||
|
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 67
|
|
| 09.11.2014, 19:04 [ТС] | |
|
tezaurismosis, код действительно простой, но задачи не решает. MoveWindow, равно как и SetWindowPos, перемещает всё окно в нужную позицию и делает его нужного размера. Но.. Клиентская область опять же неопределённого размера.
Что я имею ввиду под клиентской областью: запустим cmd.exe - всё что чёрное - это клиентская область. Т.е. полоса прокрутки, бордюры, заголовок (толщины которых зависят от личных установок/стилей Винды на разных ПК) - сужают нашу клиентскую область. И если я сделаю MoveWindow(hWnd, 100, 100, 600, 600, true) - то я получу всё окно приложения размером 600*600, но сама клиентская область (та чёрная область в cmd.exe) будет в зависимости от стилей - разная. Вопрос по прежнему открыт.
0
|
|
|
Администратор
|
||||||
| 09.11.2014, 20:05 | ||||||
|
Тогда код будет чуть сложнее, но принцип всё же прост
0
|
||||||
|
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 67
|
|
| 09.11.2014, 23:06 [ТС] | |
|
Спасибо большое.. Похоже, это уже в нужном направлении... Этот код делает в итоге клиентское окно размером 184*84. Если я правильно понял, оно должно было быть 500*200. Где ошибка?
Ещё вопрос, почему GWL_STYLE и GWL_EXSTYLE принимают именно такие значения? Добавлено через 17 минут Подозреваю, что размер прямоугольника должен задаваться как Rect newRect = new Rect(0, 0, 500, 200). Но даже в этом случае размер клиентского окна 497*197 (как раз, наверное, видим влияние стилей Виндовс). Так что пока результата нет Но решение явно где то рядом...
0
|
|
|
Администратор
|
|||
| 10.11.2014, 08:03 | |||
|
Короче вся работа впустую.
0
|
|||
|
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 67
|
|
| 10.11.2014, 12:08 [ТС] | |
|
tezaurismosis, не обижайтесь пожалуйста. Я ценю вашу работу... Возможно, имеет место просто недопонимание вопроса...
Да, мне нужно что бы клиентская область начиналась с позиции Х, Y и была размером Width, Height (например 500*200). Давайте на примере cmd.exe, т.к. там проще объяснять. В нашем конкретном примере мне надо что бы клиентская область cmd (всё что чёрное) - была размером 500*200 и располагалась в позиции например 100, 100. MoveWindow(hWnd, 100, 100, 500, 200, true) - уложит всё окно консоли в этот размер - бордюры, шапку, полосы прокрутки и чёрную клиентскую область. Т.е. сама область будет меньше на эти значения. Какая именно у конкретного пользователя она будет - неизвестно. А надо что бы было 500*200, а всё остальное что бы было вокруг этого размера. Согласно MSDN AdjustWindowRectEx() призвана вернуть нам необходимый размер окна, если ей скормить нужный размер клиентской области и некие стили. Согласно стилям она выяснит ширину бордюров и прочего, прибавит это к нашему прямоугольнику и вернёт новый размер, который и необходимо указать при вызове MoveWindow. Но, по факту, в приведённом вами коде AdjustWindowRectEx возвращает значение, которое в итоге не даёт нам требуемый размер клиентской области (а требуем мы его явно, указывая 500, 200 - а получили почему то 497 на 197). Но всё же размер возвращаемого окна увеличен, а это значит, что AdjustWindowRectEx всё же пытается что то делать, но, либо она неправильно работает, либо ей неправильно заданы входные параметры (а именно стили, о которых я спрашивал). Вот и получается, что вопрос упирается вызов AdjustWindowRectEx() с правильными параметрами. Надеюсь, теперь я доступно объяснил суть проблемы...
0
|
|
|
Администратор
|
|||||||||||||
| 10.11.2014, 12:47 | |||||||||||||
|
Я поменял параметры, поступающие в метод AdjustWindowRectEx (изменил newRect)
Это было нужно? Добавлено через 6 минут
0
|
|||||||||||||
|
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 67
|
|
| 10.11.2014, 14:01 [ТС] | |
|
Похоже, я в той ситуации, когда не знаешь что сказать, проще показать..
Копировал код один к одному, лишь заменил GetProcessesByName("notepad") на GetProcessesByName("cmd"), запустил, получил это: Что из этого считать необходимым мне 500*100 я не знаю, т.к. тут его нигде нет( В чём может быть проблема? Добавлено через 6 минут рассматривая картинку я подметил, что 505 и 101 больше необходимых 500 и 100 на 1% Вероятно совпадение... Или...
0
|
|
|
Администратор
|
||
| 10.11.2014, 14:05 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 67
|
|
| 10.11.2014, 14:05 [ТС] | |
|
Я согласен уже и на то что бы хотя бы хоть какие то размеры соответствовали заданным, хотя, в идеале, мне бы размер чёрного прямоугольника без полей прокрутки...
0
|
|
|
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 67
|
|
| 10.11.2014, 14:13 [ТС] | |
|
Проверил на Блокноте - отрабатывает чётко 500*100 (но это с учётом полос прокрутки). Спасибо огромное.
Консоль проверю на разных компах с разными настройками Виндовс. Как всё же избавиться от учёта толщин полос прокрутки?
0
|
|
|
Администратор
|
|||||||
| 10.11.2014, 14:25 | |||||||
|
(код переработан)
0
|
|||||||
|
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 67
|
|
| 10.11.2014, 15:27 [ТС] | |
|
tezaurismosis, спасибо большое.
Идея ясна, дальше буду допиливать напильником) (а именно: сейчас код учитывает только правую полосу прокрутки и не учитывает нижнюю, располагает в нужной позиции не клиентскую область а само окно(клиентская получается ниже на некую высоту), странные координаты для перемещаемого консольного приложения).
0
|
|
| 10.11.2014, 15:27 | |
|
Помогаю со студенческими работами здесь
14
Как сделать клиентскую область формы во весь экран Растянуть контрол на всю клиентскую область Скопировать часть строки с определенной позиции и определенной длины в другую строку Строка: Скопировать часть строки с определенной позиции и определенной длины в другую строку Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|