powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / непонятки с DrawFocusRect
8 сообщений из 8, страница 1 из 1
непонятки с DrawFocusRect
    #39557328
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaintBox два штука. У первого цвет шрифта черный, у второго белый.

Код: pascal
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.
procedure TForm1.PaintBox1Paint(Sender: TObject);
const
  Caption = '?';
var
  TextRect, FocusRect: TRect;
begin
  with TPaintBox(Sender) do
  begin
//    Canvas.Brush.Color := $0075C675;
    Canvas.FillRect(ClientRect);

    TextRect := ClientRect;
    with Canvas.TextExtent(Caption) do
    begin
      TextRect.Top := Height div 2 - cy div 2;
      TextRect.Left := Width div 2 - cx div 2;
    end;
    Canvas.TextRect(TextRect, TextRect.Left, TextRect.Top, Caption);

    FocusRect := ClientRect;
    InflateRect(FocusRect, -1, -1);
    Canvas.DrawFocusRect(FocusRect);
  //  DrawFocusRect(Canvas.Handle, FocusRect);
  end;
end;


У первого рамка фокуса рисуется как надо - пунктиром, у второго рамка получается сплошной линией.
А хочется, чтобы одинаково, т.е. тоже пунктиром.
Я встречал информацию, что DrawFocusRect что-то там инвертирует, но как победить ?
Такую же картину можно наблюдать у TBitBtn
...
Рейтинг: 0 / 0
непонятки с DrawFocusRect
    #39557342
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот таким образом получилось, но хотелось бы без костылей
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    // финт ушами
    Canvas.Pen.Color := clBtnFace;
    Canvas.Brush.Color := clBtnFace;
    Canvas.Font.Color := clWindowText;
    FintRect := ClientRect;
    FintRect.Left := FintRect.Left-1;
    FintRect.Right := FintRect.Left;
    FintRect.Bottom := FintRect.Top;
    Canvas.FillRect(FintRect);

//  + Window.DrawFocusRect вместо Canvas.DrawFocusRect
...
Рейтинг: 0 / 0
непонятки с DrawFocusRect
    #39557382
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел у себя:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    //От этого вызова зависит цвет промежутков у Focus Rectangle - если
    // вызов не произведен, то цвет равен цвету фоновой заливки (HIGHLIGHT),
    // если произведен, то желтому :)
    SetTextColor (Canvas.Handle, GetSysColor(COLOR_HIGHLIGHTTEXT));
    Canvas.Brush.Color := clHighlight;
    Canvas.FillRect(ARect);
    ExtTextOut (Canvas.Handle, ARect.Left+2, ARect.Top+1,
      ETO_OPAQUE or ETO_CLIPPED, @ARect, PChar(Cursel),
      Length(Cursel), nil);
    DrawFocusRect(Canvas.Handle, ARect);
...
Рейтинг: 0 / 0
непонятки с DrawFocusRect
    #39557385
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ghost Writer
Код: pascal
1.
//  + Window.DrawFocusRect вместо Canvas.DrawFocusRect


Думаешь, что есть разница?
авторCall DrawFocusRect for the perimeter of the image of a control when the control gets or loses input focus. Because DrawFocusRect uses an XOR function, calling it a second time while specifying the same rectangle removes the rectangle from the screen.

Ищи проблему в коде. Может height и wdth левые?
...
Рейтинг: 0 / 0
непонятки с DrawFocusRect
    #39557398
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanДумаешь, что есть разница?В данном случае результат разный. Можешь сам проверить. Canvas.DrawFocusRect вызывает еще RequiredState, та, в свою очередь, CreateFont, CreatePen, CreateBrush... SetBkColor, SetTextColor и т.д.

height и wdth не левые. даже заменив на 33 результат тот же.
...
Рейтинг: 0 / 0
непонятки с DrawFocusRect
    #39557402
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

спасибо, строчка SetTextColor(Canvas.Handle, ColorToRGB(clWindowText)) после отрисовки текста помогает.

Теперь у меня еще вопрос появился:
т.к. цвет фона и текста может быть любым, то цвет для SetTextColor наверно надо как-то вычислять, чтобы рамка при любом цвете фона и текста была видна.
...
Рейтинг: 0 / 0
непонятки с DrawFocusRect
    #39557463
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ghost Writerschi,

спасибо, строчка SetTextColor(Canvas.Handle, ColorToRGB(clWindowText)) после отрисовки текста помогает.

Теперь у меня еще вопрос появился:
т.к. цвет фона и текста может быть любым, то цвет для SetTextColor наверно надо как-то вычислять, чтобы рамка при любом цвете фона и текста была видна.

http://rsdn.org/forum/winapi/3464551.hot
...
Рейтинг: 0 / 0
непонятки с DrawFocusRect
    #39557499
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

вот теперь красиво, еще раз спасибо!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / непонятки с DrawFocusRect
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]