Главная страница
    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.47 MB
Время: 0.046 c
1-1121287971
ANB
2005-07-14 00:52
2005.07.31
Как определить, по какому контроллу кликнули мышей ?


4-1117805575
ctranik
2005-06-03 17:32
2005.07.31
RegEnumKeyEx непоказывает все подключи,


14-1120674661
Cheater
2005-07-06 22:31
2005.07.31
Подскажите какую-нибудь небольшую игрушку....


3-1118910194
злобная танька
2005-06-16 12:23
2005.07.31
SQL и дата/время


1-1121323224
Руслана
2005-07-14 10:40
2005.07.31
Объясните почему





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский