Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

Есть ли альтернатива функции DrawFocusRect?

23.08.2018, 00:01. Показов 3348. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
API-функция DrawFocusRect выделяет прямоугольник серой пунктирной линией толщиной в 1 пиксель. Хотелось бы чуть подчеркнуть выделение, например не пунктиром, а сплошной линией, не серой, а чёрной. Существуют ли в C++Builder подобные функции?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.08.2018, 00:01
Ответы с готовыми решениями:

Есть ли альтернатива функции strtok
Есть строка типа: "01/06/2011 17:00:00|189570|189625|187855|188020|182644|" Ее нужно порубить на составляющие. Написал: uk =...

Как изменить тип линии в функции DrawFocusRect?
Всем здравствуйте. Пытаюсь заставить DrawFocusRect рисовать выделение сплошной линией вместо пунктира. Возможно ли это? Толщину линии,...

GETS: есть ли альтернатива?
Ходят слухи, что функция get опасна (кому интересно, эта тема есть на форуме, чуть раньше). Есть ли какая-то функция, которая так же...

10
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
23.08.2018, 00:38
Существуют, начиная с WinXP (в WinAPI, а не в Билдере), но они тебе не понравятся. Придется менять SPI_SETFOCUSBORDERWIDTH / SPI_SETFOCUSBORDERHEIGHT через SystemParametersInfo, а они меняются не только для твоего приложения, а для всех приложений в системе.

Так что выбирай, либо все будут с такими "подчеркнутыми" обрисовками, либо извращайся и рисуй поверх системного прямоугольника свой
1
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
23.08.2018, 00:55
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Цитата Сообщение от volvo Посмотреть сообщение
рисуй поверх системного прямоугольника свой
Самое правильное решение! Хотел так же ответить, опередили

Добавлено через 10 минут
Например, можно так:
Обработчик MouseDown
C++
1
2
3
4
5
6
7
8
9
10
11
if(Button == Left)
{
   oX=X; oY=Y;
   lX=X; lY=Y;
 
     Canvas->Pen->Color = clRed;
     Canvas->Pen->Width = 2;
     Canvas->Pen->Mode = pmNotXor;
     Canvas->Brush->Style = bsClear;
     DrawSelectionRegion = true;    
}
MouseMove
C++
1
2
3
4
5
6
7
8
9
   TRect MyRect;
   if(DrawSelectionRegion)
   {
       MyRect = TRect(oX, oY, lX, lY);
       Canvas->Rectangle(MyRect);
       lX=X; lY=Y;
       MyRect = TRect(oX, oY, lX, lY);
       Canvas->Rectangle(MyRect);
    }
MouseUp
C++
1
2
3
4
5
6
7
   TRect MyRect;
   if(DrawSelectionRegion)
   {
       MyRect = TRect(oX, oY, lX, lY);
       Canvas->Rectangle(MyRect);
       DrawSelectionRegion = false;
    }
Добавлено через 1 минуту
Но если нужно сделать штриховую и толщиной более 1 пиксела, тогда нужно последовательно выводить несколько прямоугольников
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
23.08.2018, 05:28  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
SystemParametersInfo
знакомая тема, извращался. "Это не наш метод". Каков смысл в использовании DrawFocusRect, если я рисую (выделяю мышкой) прямоугольник самостоятельно как предложил TrollHammer, ведь отпуская мышку я имею всю информацию о выделенном прямоугольнике. Зачем же мне рисовать поверх системного прямоугольника?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
23.08.2018, 11:45
Цитата Сообщение от jkrnd Посмотреть сообщение
Зачем же мне рисовать поверх системного прямоугольника?
А система тебя с каких пор спрашивать стала, когда ей отрисовать focus rect, а когда - нет? Вот и придется тебе рисовать ПОВЕРХ того, что успела накорябать система.

Или ты сам DrawFocusRect вызываешь, и хочешь, чтобы оно по-другому выглядело?

Не по теме:

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

1
23.08.2018, 13:15

Не по теме:

volvo, это не "Не по теме", а нужно прибить на входе в форум!!

0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
23.08.2018, 14:26  [ТС]
volvo, nick42, TrollHammer, не хотел вас обидеть. Не понял, что не так спросил. Честно, не догоняю . Вот мой проект (начал тупо переделывать с другого языка программирования то, что уже довольно давно и исправно работает). Ещё раз извините. Молодой, исправлюсь.
Вложения
Тип файла: rar Ver1.0.rar (7.1 Кб, 4 просмотров)
0
23.08.2018, 14:32  [ТС]

Не по теме:

я спросил, потому, что альтернатива функции DrawFocusRect в MSNet есть, но работает коряво и "моргает". Пришлось обращаться к API

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
23.08.2018, 14:39
А я спросил, что тебе нужно? Зачем вообще привязываться к DrawFocusRect, если ты отметил лучшим ответом решение, когда обрабатываются события клика/перемещения/отпускания мыши? Ну вот при чем тут системная отрисовка focus rect-а? А если я Tab-ом переведу фокус на другую кнопку, что будет? Вот если бы тебе понадобилось выделить активную кнопку (причем всегда, когда меняется активная кнопка - это выделение тоже перемещалось бы туда, где обычно рисуется рамка фокуса) более, чем малозаметной штриховой линией - тогда понятно, надо было бы связываться с системными функциями. А пока - непонятно, при чем тут вообще оно.

Проект даже открывать не буду. Во-первых - терпеть не могу переводы с одного языка на другой, а во-вторых, пока так и нет объяснения, ЧТО ЖЕ НУЖНО в конце концов выделять - он вообще бесполезен.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
23.08.2018, 15:08  [ТС]
volvo, я cвою ошибку понял. В дальнейшем постараюсь не тупить.

Не по теме:

Переделываю графики теплотехнических параметров со сплошного API+VB6 на С++Builder+TChart. Одна из опций старой программы позволяла выделить (выбрать) мышкой кусок захваченного экрана и сохранить захваченную картинку в одном из сжатых форматов (png, gif, jpg). Видимо тогда я не думал, что рисовать "резиновый" прямоугольник, каждый раз стирая предыдущий можно и самому.

0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
25.08.2018, 11:33  [ТС]
TrollHammer, Если на форму добавить объект TImage, выставив его свойства:
Align = alClient, AutoSize = False, Stretch = False, затем
вставить в него картинку копии текущего экрана следующим способом:
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    // Процедура захвата экрана в TImage
    Graphics::TBitmap* bmp = new Graphics::TBitmap;
    bmp->Width = Screen->Width;
    bmp->Height = Screen->Height;
    BitBlt(bmp->Canvas->Handle, 0, 0, Screen->Width, Screen->Height, GetDC(GetDesktopWindow()), 0, 0, SRCCOPY);
    Image1->Picture->Assign(bmp);
    delete bmp;
}
а теперь будем выделять мышью прямоугольник, но уже на канве Image1, то получается мерцание картинки.
Я понимаю, что в процедуре OnMouseMove объекта Image1 стирается старый прямоугольник и рисуется новый.
Почему моргает картинка и как этого можно избежать?

Не по теме:

Мне нужно выделить мышкой кусок текущего экрана и поместить его в bmp для последующего сохранения в графическом файле. Может я на ложном пути?



Добавлено через 1 час 33 минуты
вышел из положения так:
C++
1
2
3
4
void __fastcall TForm1::FormPaint(TObject *Sender)
{
    Canvas->Draw(0,0, bmp);    
}
отказавшись от использования TImage.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.08.2018, 11:33
Помогаю со студенческими работами здесь

Есть ли альтернатива Compiz?
Доброго дня всем! собственно вопрос: установлен Debian 7.1 x64 (Xfce) , есть ли какая замена Compizu? в виду "смерти" последнего,...

Есть ли альтернатива bmp?
Господа есть ли возможность использовать CMP компоненты для oc4j или orion, при условии что все обращения к СУБД возможны только через...

Альтернатива Nadavi.ru есть?
Они платят за клики по банеру с разделами: Сотовые телефоны GPS навигаторы и т.д. Если пользователь кликнул на ссылку в банере,...

Есть ли альтернатива фреймам
При создании сайта возникла следующая проблема - страница разбита на три фрейма. 1 - заголовок. 2 - меню. 3 - Содержимое. Так вот проблема...

Есть ли альтернатива DataGridView
Подскажите какой-нибудь бесплатный или взломанный Grid-компонент для VB.NET вместо тормознутого DataGridView.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru