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

Вниз

Как нарисовать рамку вокруг 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 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.038 c
3-1119440610
stelius
2005-06-22 15:43
2005.07.31
регулярные выражения в oracle


14-1120721677
Магнум
2005-07-07 11:34
2005.07.31
Delphi 5 and Delphi 2005


1-1121339957
Vadik
2005-07-14 15:19
2005.07.31
Реинжинеринг


1-1120482687
Антоныч
2005-07-04 17:11
2005.07.31
Построение графика в Excel через TExcelApplication


3-1119601311
salexn
2005-06-24 12:21
2005.07.31
СУБД Cache и его использование вмести с Delphi





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