Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.019 c
2-1183133790
Nyo
2007-06-29 20:16
2007.07.22
Запуск внешнего приложения в окне своего


9-1156801560
Pierre
2006-08-29 01:46
2007.07.22
Пишу игру Bowling мужна идея падения кегли при сбивании.


15-1182315123
Slider007
2007-06-20 08:52
2007.07.22
Глюки FireBird 1.5.4


15-1182762432
xozain
2007-06-25 13:07
2007.07.22
gprs модем


15-1180946373
Voproshay
2007-06-04 12:39
2007.07.22
Компьютерный тир