Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Вниз

Button focus dots   Найти похожие ветки 

 
mc2!   (2007-06-23 19:59) [0]

Странный вопрос наверное у меня. Знаете, у кнопок в винде есть такие "точки" по контуру при фокусе кнопки. Ну так вот, в любой стандартной кнопке, например взять TButton, всё нормально, всё как я и видел всегда. Но столкнулся я с двумя приложениями, в которые эти самые точки фокуса имеют немного более приятную на мой взгляд вариацию этих точек фокуса. Они более прижаты к краям. Два этих приложения - это: Firefox и QIP Infium. Скриншот прилагаю.

первые две - это firefox и qip infium, а которая ниже - это стандартная кнопка. Посмотрите повнимательней, увидите разницу межу нижней и двумя верхними.

http://img230.imageshack.us/my.php?image=btns1ft3.gif

Хочу найти любую информацию о том, как сделать подобным образом выделение фокуса.

Спасибо заранее.


 
VirEx ©   (2007-06-23 20:07) [1]

что курил?


 
Yanis ©   (2007-06-24 00:19) [2]

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TDrawButtonEvent = procedure(Control: TWinControl;
   Rect: TRect; State: TOwnerDrawState) of object;
 TButton = class(StdCtrls.TButton)
 private
   FCanvas: TCanvas;
   IsFocused: Boolean;
   FOnDrawButton: TDrawButtonEvent;
 protected
   procedure CreateParams(var Params: TCreateParams); override;
   procedure SetButtonStyle(ADefault: Boolean); override;
   procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
   procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
   procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
   procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
   procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
   procedure DrawButton(Rect: TRect; State: UINT);
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   property Canvas: TCanvas read FCanvas;
 published
   property OnDrawButton: TDrawButtonEvent read FOnDrawButton write FOnDrawButton;
   property Color;
 end;
 TForm1 = class(TForm)
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
{ TButton }
constructor TButton.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FCanvas := TCanvas.Create;
end;
destructor TButton.Destroy;
begin
 inherited Destroy;
 FCanvas.Free;
end;
procedure TButton.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 with Params do Style := Style or BS_OWNERDRAW;
end;
procedure TButton.SetButtonStyle(ADefault: Boolean);
begin
 if ADefault <> IsFocused then
   begin
     IsFocused := ADefault;
     Refresh;
   end;
end;
procedure TButton.CNMeasureItem(var Message: TWMMeasureItem);
begin
 with Message.MeasureItemStruct^ do
   begin
     itemWidth := Width;
     itemHeight := Height;
   end;
end;
procedure TButton.CNDrawItem(var Message: TWMDrawItem);
var
 SaveIndex: Integer;
begin
 with Message.DrawItemStruct^ do
   begin
     SaveIndex := SaveDC(hDC);
     FCanvas.Lock;
     try
       FCanvas.Handle := hDC;
       FCanvas.Font := Font;
       FCanvas.Brush := Brush;
       DrawButton(Self.ClientRect, itemState);
     finally
       FCanvas.Handle := 0;
       FCanvas.Unlock;
       RestoreDC(hDC, SaveIndex);
     end;
   end;
 Message.Result := 1;
end;
procedure TButton.CMEnabledChanged(var Message: TMessage);
begin
 inherited;
 Invalidate;
end;
procedure TButton.CMFontChanged(var Message: TMessage);
begin
 inherited;
 Invalidate;
end;
procedure TButton.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
 Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos));
end;
procedure TButton.DrawButton(Rect: TRect; State: UINT);
const
 r_div = 1;
var
 Flags, OldMode: Longint;
 IsDown, IsDefault, IsDisabled: Boolean;
 OldColor: TColor;
 OrgRect: TRect;
begin
 OrgRect := Rect;
 Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
 IsDown := State and ODS_SELECTED <> 0;
 IsDefault := State and ODS_FOCUS <> 0;
 IsDisabled := State and ODS_DISABLED <> 0;
 if IsDown then Flags := Flags or DFCS_PUSHED;
 if IsDisabled then Flags := Flags or DFCS_INACTIVE;
 if IsFocused or IsDefault then
   begin
     FCanvas.Pen.Color := clWindowFrame;
     FCanvas.Pen.Width := 1;
     FCanvas.Brush.Style := bsClear;
     FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
     InflateRect(Rect, -1, -1);
   end;
 if IsDown then
   begin
     FCanvas.Pen.Color := clBtnShadow;
     FCanvas.Pen.Width := 1;
     FCanvas.Brush.Color := clBtnFace;
     FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
     InflateRect(Rect, -1, -1);
   end
 else
   DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);
 if IsDown then OffsetRect(Rect, 1, 1);
 OldColor := FCanvas.Brush.Color;
 FCanvas.Brush.Color := Color;
 FCanvas.FillRect(Rect);
 FCanvas.Brush.Color := OldColor;
 OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT);
 FCanvas.Font.Color := clBtnText;
 if IsDisabled then
   DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0,
     ((Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2,
     ((Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2,
     0, 0, DST_TEXT or DSS_DISABLED)
 else
   DrawText(FCanvas.Handle, PChar(Caption), -1, Rect,
     DT_SINGLELINE or DT_CENTER or DT_VCENTER);
 SetBkMode(FCanvas.Handle, OldMode);
 if Assigned(FOnDrawButton) then
   FOnDrawButton(Self, Rect, TOwnerDrawState(LongRec(State).Lo));
 if IsFocused and IsDefault then
   begin
     Rect := OrgRect;
     InflateRect(Rect, -4, -4);
     FCanvas.Pen.Color := clWindowFrame;
     FCanvas.Brush.Color := clBtnFace;
     with Rect do
       DrawFocusRect(FCanvas.Handle, Classes.Rect(Left - r_div,
         Top - r_div,
         Right + r_div,
         Bottom + r_div));
   end;
end;
end.


http://img158.imageshack.us/img158/3639/btnnsfocusrectsm7.png


 
Yanis ©   (2007-06-24 00:20) [3]

http://forum.vingrad.ru/index.php?show_type=forum&showtopic=160443


 
Nic ©   (2007-06-24 02:03) [4]


> Yanis ©   (24.06.07 00:19) [2]

А такой перехват прорисовки будет работать для всей программы или только для формы этого модуля?


 
Yanis ©   (2007-06-24 10:48) [5]

Только для формы модуля, где объявлен новый класс TButton.
Но ничего не мешает оформить этот класс отдельным компонентом или модулем и объявлять в uses, там где надо.


 
Yanis ©   (2007-06-24 11:09) [6]

Проглазел… Последнюю процедуру можног заменить на:
procedure TButton.DrawButton(Rect: TRect; State: UINT);
const
 r_div = 2;
var
 Flags, OldMode: Longint;
 IsDown, IsDefault, IsDisabled: Boolean;
 OldColor: TColor;
 OrgRect: TRect;
begin
 OrgRect := Rect;
 Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
 IsDown := State and ODS_SELECTED <> 0;
 IsDefault := State and ODS_FOCUS <> 0;
 IsDisabled := State and ODS_DISABLED <> 0;

 if IsDown then Flags := Flags or DFCS_PUSHED;
 if IsDisabled then Flags := Flags or DFCS_INACTIVE;

 if IsFocused or IsDefault then
   begin
     FCanvas.Pen.Color := clWindowFrame;
     FCanvas.Pen.Width := 1;
     FCanvas.Brush.Style := bsClear;
     FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
     InflateRect(Rect, -1, -1);
   end;

 if IsDown then
   begin
     FCanvas.Pen.Color := clBtnShadow;
     FCanvas.Pen.Width := 1;
     FCanvas.Brush.Color := clBtnFace;
     FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
     InflateRect(Rect, -1, -1);
   end
 else
   DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);

 if IsDown then OffsetRect(Rect, 1, 1);

 OldColor := FCanvas.Brush.Color;
 FCanvas.Brush.Color := Color;
 FCanvas.FillRect(Rect);
 FCanvas.Brush.Color := OldColor;
 OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT);
 FCanvas.Font.Color := clBtnText;
 if IsDisabled then
   DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0,
     ((Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2,
     ((Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2,
     0, 0, DST_TEXT or DSS_DISABLED)
 else
   DrawText(FCanvas.Handle, PChar(Caption), -1, Rect,
     DT_SINGLELINE or DT_CENTER or DT_VCENTER);
 SetBkMode(FCanvas.Handle, OldMode);

 if Assigned(FOnDrawButton) then
   FOnDrawButton(Self, Rect, TOwnerDrawState(LongRec(State).Lo));

 if IsFocused and IsDefault then
   begin
     Rect := OrgRect;
     InflateRect(Rect, -r_div, -r_div);
     with FCanvas do
       begin
         Pen.Color := clWindowFrame;
         Brush.Color := clBtnFace;
         DrawFocusRect(Rect);
       end
   end;
end;



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.04 c
2-1182890452
Сорокин М
2007-06-27 00:40
2007.07.22
qreport


5-1157439365
vodvorezlaya
2006-09-05 10:56
2007.07.22
Помогите создать компонент.


15-1182509369
sergeyst
2007-06-22 14:49
2007.07.22
Видео


1-1179238940
Смецкая Катя
2007-05-15 18:22
2007.07.22
TreeView


15-1182439946
Ricks
2007-06-21 19:32
2007.07.22
BMW использует самый мощный комрьютер в мире





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский