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

Вниз

Как нарисовать рамку вокруг TEdit?   Найти похожие ветки 

 
AlexTregubov   (2005-06-01 15:54) [0]

Вообще, как что-то нарисовать на TEdit?
Заранее спасибо.


 
Digitman ©   (2005-06-01 16:25) [1]

на TEdit и вокруг (т.е. вне) TEdit, согласись, разные вещи, ты уж определись что точно тебе нужно

на TEdit ты ничего не нарисуешь.
вокруг же рисий себе на здоровье что угодно - положи, например, на форму панель, на панель положи TEdit, укажи у TEdit св-во Align=Client, у панели установи св-ва, имеющие отношение к бордюру


 
Marser ©   (2005-06-01 16:48) [2]

Используем класс TControlCanvas.

 with TControlCanvas.Create do
   try
     Control:=Edit;
//Дальше как с обічной канвой.
   finally
     free
   end;
Ещё можно непосредственно с DC, но канва намного удобнее.


 
alpet ©   (2005-06-01 17:05) [3]

По сабжу - установи свойство Ctrl3D компонента в false, будет обычная рамка (черная).
Вот самый простой способ измения цветов контрола (всех точнее TEdit), с перекраской:

type TForm1 = class (TForm)
...
public
   procedure WMCtrlColor (var msg: TMessage); message WM_CTLCOLOREDIT;
end;

procedure TForm1.WMCtrlColor(var msg: TMessage);
begin
// Decoment this, to use for single control
// if msg.LParam = edit1.Handle then
 begin
  SetTextColor (msg.WParam, GetSysColor (COLOR_CAPTIONTEXT));
  // SetBkColor (msg.WParam, GetSysColor (COLOR_3DHILIGHT)); // backgnd color
  SetBkMode (msg.wParam, TRANSPARENT); // прозрачный цвет текста
  msg.Result := GetSysColorBrush (COLOR_ACTIVECAPTION);
 end;
end;


 
AlexTregubov   (2005-06-02 11:48) [4]

Что-то не получается.
Пробую применять TControlCanvas - рамка рисуется, а потом часть стирается текстом.

Вообще, мне нужно сделать компонент, похожий на Edit (BorderStyle:=bsNone) и вокруг рамка, как у Bevel (Shape=Frame).

Может подскажете как.


 
Игорь Шевченко ©   (2005-06-02 12:34) [5]


> Может подскажете как.


unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, HSVisualStyler;

type
 TfMain = class(TForm)
   Edit: TEdit;
   Edit1: TEdit;
   procedure FormCreate(Sender: TObject);
 private
   FStyler: THSVisualStyler;
   FOldEditWndProc: TWndMethod;
   procedure EditWndProc (var Message: TMessage);
   procedure PaintEditBorder;
 end;

var
 fMain: TfMain;

implementation

{$R *.dfm}

{ TfMain }

procedure TfMain.EditWndProc(var Message: TMessage);
begin
 if Message.Msg = WM_NCCALCSIZE then begin
   FOldEditWndProc (Message);
   InflateRect(TWmNcCalcSize(Message).CalcSize_Params^.rgrc[0],
     -Succ(FStyler.BorderWidth), -Succ(FStyler.BorderWidth));
 end else if Message.Msg = WM_NCPAINT then begin
   PaintEditBorder;
   Message.Result := 0;
 end else if (Message.Msg = CM_MOUSEENTER) or
    (Message.Msg = WM_SETFOCUS) then begin
   if Message.Msg = WM_SETFOCUS then
     FOldEditWndProc (Message);
   FStyler.Color := clRed;
   SetWindowPos (Edit.Handle, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or
     SWP_NOZORDER or SWP_NOACTIVATE or SWP_DRAWFRAME);
 end else if (Message.Msg = CM_MOUSELEAVE) or
    (Message.Msg = WM_KILLFOCUS) then begin
   if Message.Msg = WM_KILLFOCUS then begin
     FOldEditWndProc (Message);
     FStyler.Color := clBlue;
     SetWindowPos (Edit.Handle, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or
       SWP_NOZORDER or SWP_NOACTIVATE or SWP_DRAWFRAME);
   end else if (GetFocus <> Edit.Handle) then begin
     FStyler.Color := clBlue;
     SetWindowPos (Edit.Handle, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or
       SWP_NOZORDER or SWP_NOACTIVATE or SWP_DRAWFRAME);
   end;
 end else
   FOldEditWndProc (Message);
end;

procedure TfMain.FormCreate(Sender: TObject);
begin
 FStyler := THSVisualStyler.Create(Self);
 FStyler.Color := clBlue;
 FStyler.BorderStyle := hbsFlat;
 FStyler.SolidBorderKind := sbkSingle;
 FOldEditWndProc := Edit.WindowProc;
 Edit.WindowProc := EditWndProc;
end;

procedure TfMain.PaintEditBorder;
var
 ARect: TRect;
 ACanvas: TCanvas;
begin
 ACanvas := TCanvas.Create;
 try
   ACanvas.Handle := GetWindowDC(Edit.Handle);
   try
     GetWindowRect (Edit.Handle, ARect);
     OffsetRect (ARect, -ARect.Left, -ARect.Top);
     FStyler.DrawBorder(ACanvas, ARect, true);
     ACanvas.Brush.Color := Edit.Color;
     ACanvas.FrameRect(ARect);
   finally
     ReleaseDC (Edit.Handle, ACanvas.Handle);
   end;
   ACanvas.Handle := 0;
 finally
   ACanvas.Free;
 end;
end;

end.

ЗЫ: Это идея, а не готовый для компиляции код.



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

Текущий архив: 2005.07.31;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
14-1120102166
cyborg
2005-06-30 07:29
2005.07.31
Socket 754 vs Socket 939


14-1121147519
Керк
2005-07-12 09:51
2005.07.31
Посоветуйте две ссылки. Электронные. Можно больше.


14-1120799849
Aldor
2005-07-08 09:17
2005.07.31
Можно ли восстановить функцию по ее коэффициентам Фурье?


14-1120589298
Просто Джо
2005-07-05 22:48
2005.07.31
Конкурс на самый тупой спам


14-1120815109
GRAND25
2005-07-08 13:31
2005.07.31
По просьбе Игорька...