RAD Studio VCL Reference
|
Provides specific message responses for the control.
procedure WndProc(var Message: TMessage); virtual;
virtual __fastcall WndProc(TMessage Message);
Override WndProc to change the initial Windows message handler for the control. The WindowProc property is initialized to WndProc.
WndProc implements the mouse behavior specified by the ControlStyle and DragMode properties, and updates the ControlState property. It passes any unhandled messages on to the Dispatch method.
When overriding WndProc to provide specialized responses to messages, be sure to call the inherited WndProc at the end to dispatch any unhandled messages.
C++ Examples:
/* This example shows how to use the WndProc method and the WindowProc property to subclass a custom control’s window procedure. This example subclasses the window procedure of a TListBox descendant to respond to a user-defined message called WM_STYLEMESSAGE. The subclassed window procedure can be turned on or off by pressing a radio button. */ class TMyListBoxDescendant : public TListBox { __published: // IDE-managed Components void __fastcall SubClassWndProc(Messages::TMessage &Message); void __fastcall ToggleSubClass(bool On); void __fastcall OnDrawItemProc( TWinControl *Control, int Index, const TRect &Rect, TOwnerDrawState State); private: // User declarations public: // User declarations __fastcall TMyListBoxDescendant(TComponent* Owner); }; TForm1 *Form1; TMyListBoxDescendant *MyListBoxDescendant1; Graphics::TBitmap *bitmap0; const WM_STYLEMESSAGE = WM_USER + 2000; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } __fastcall TMyListBoxDescendant::TMyListBoxDescendant(TComponent* Owner) : TListBox(Owner) { } void __fastcall TForm1::Button1Click(TObject *Sender) { PostMessage( MyListBoxDescendant1->Handle, WM_STYLEMESSAGE, Integer(lbOwnerDrawFixed), 0); } void __fastcall TForm1::Button2Click(TObject *Sender) { PostMessage( MyListBoxDescendant1->Handle, WM_STYLEMESSAGE, Integer(lbStandard), 0); } void __fastcall TForm1::SubClassRadioGroup1Click(TObject *Sender) { MyListBoxDescendant1->ToggleSubClass(SubClassRadioGroup1->ItemIndex == 0); } void __fastcall TMyListBoxDescendant::SubClassWndProc(Messages::TMessage &Message) { if (Message.Msg == WM_STYLEMESSAGE) Style = (TListBoxStyle)Message.WParam; else WndProc(Message); } void __fastcall TMyListBoxDescendant::ToggleSubClass(bool On) { if (On) WindowProc = SubClassWndProc; else WindowProc = WndProc; } #include <memory> //for STL auto_ptr class void __fastcall TMyListBoxDescendant::OnDrawItemProc(TWinControl *Control, int Index, const TRect &Rect, TOwnerDrawState State) { Graphics::TBitmap *bitmap; // temporary variable for item’s bitmap int Offset = 2; // default text offset width // note that we draw on the listbox’s canvas, not on the form TCanvas *canvas = dynamic_cast<TListBox *>(Control)->Canvas; canvas->FillRect(Rect); // clear the rectangle bitmap = dynamic_cast<Graphics::TBitmap *>((dynamic_cast<TListBox *>(Control))->Items->Objects[Index]); if (bitmap) { canvas->BrushCopy( Bounds(Rect.Left + Offset, Rect.Top, bitmap->Width, bitmap->Height), bitmap, Bounds(0, 0, bitmap->Width, bitmap->Height), clRed); // render bitmap Offset += bitmap->Width + 4; // add four pixels between bitmap and text } // display the text canvas->TextOut(Rect.Left + Offset, Rect.Top, dynamic_cast<TListBox *>(Control)->Items->Strings[Index]); } void __fastcall TForm1::FormCreate(TObject *Sender) { MyListBoxDescendant1 = new TMyListBoxDescendant(Form1); // The owner cleans this up. MyListBoxDescendant1->Visible = True; MyListBoxDescendant1->Parent = Form1; MyListBoxDescendant1->Visible = True; MyListBoxDescendant1->Left = SubClassRadioGroup1->Left + SubClassRadioGroup1->Width + 30;; MyListBoxDescendant1->Top = SubClassRadioGroup1->Top; MyListBoxDescendant1->Height = SubClassRadioGroup1->Height; MyListBoxDescendant1->OnDrawItem = MyListBoxDescendant1->OnDrawItemProc; static std::auto_ptr<Graphics::TBitmap> _bitmap0Cleaner(bitmap0 = new Graphics::TBitmap); ImageList1->GetBitmap(0, bitmap0); MyListBoxDescendant1->Items->AddObject("Butterfly", bitmap0); SubClassRadioGroup1->Items->Add("SubClassWndProc"); SubClassRadioGroup1->Items->Add("WndProc"); SubClassRadioGroup1->ItemIndex = 2; }
Delphi Examples:
{ This example shows how to use the WndProc method and the WindowProc property to subclass a custom control’s window procedure. This example subclasses the window procedure of a TListBox descendant to respond to a user-defined message called WM_STYLEMESSAGE. The subclassed window procedure can be turned on or off by pressing a radio button. } type TMyListBoxDescendant = class(TlistBox) procedure SubClassWndProc(var Message: TMessage); procedure ToggleSubClass(On: Boolean); procedure OnDrawItemProc( Control: TWinControl; Index: Integer; Rect:TRect; State: TOwnerDrawState); end; TForm1 = class(TForm) SubClassRadioGroup1: TRadioGroup; Button1: TButton; ImageList1: TImageList; Button2: TButton; procedure SubClassRadioGroup1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; MyListBoxDescendant1: TMyListBoxDescendant; bitmap0: TBitmap; implementation {$R *.dfm} const WM_STYLEMESSAGE = WM_USER + 2000; procedure TForm1.Button1Click(Sender: TObject); begin PostMessage( MyListBoxDescendant1.Handle, WM_STYLEMESSAGE, Integer(lbOwnerDrawFixed), 0); end; procedure TForm1.Button2Click(Sender: TObject); begin PostMessage( MyListBoxDescendant1.Handle, WM_STYLEMESSAGE, Integer(lbStandard), 0); end; procedure TMyListBoxDescendant.SubClassWndProc(var Message: TMessage); begin if (Message.Msg = WM_STYLEMESSAGE) then Style:= TListBoxStyle(Message.WParam) else WndProc(Message); end; procedure TMyListBoxDescendant.ToggleSubClass(On: Boolean); begin if On then WindowProc := SubClassWndProc else WindowProc := WndProc; end; procedure TForm1.SubClassRadioGroup1Click(Sender: TObject); begin MyListBoxDescendant1.ToggleSubClass( SubClassRadioGroup1.ItemIndex = 0); end; procedure TForm1.FormCreate(Sender: TObject); begin MyListBoxDescendant1:= TMyListBoxDescendant.Create(self); MyListBoxDescendant1.Visible:= True; MyListBoxDescendant1.Parent:= Form1; MyListBoxDescendant1.Visible:= True; MyListBoxDescendant1.Left:= SubClassRadioGroup1.Left + SubClassRadioGroup1.Width + 30;; MyListBoxDescendant1.Top:= SubClassRadioGroup1.Top; MyListBoxDescendant1.Height:= SubClassRadioGroup1.Height; MyListBoxDescendant1.OnDrawItem:= MyListBoxDescendant1.OnDrawItemProc; bitmap0 := TBitmap.Create; ImageList1.GetBitmap(0, bitmap0); MyListBoxDescendant1.Items.AddObject('Butterfly', bitmap0); SubClassRadioGroup1.Items.Add('SubClassWndProc'); SubClassRadioGroup1.Items.Add('WndProc'); SubClassRadioGroup1.ItemIndex := 2; end; procedure TMyListBoxDescendant.OnDrawItemProc( Control: TWinControl; Index: Integer; Rect:TRect; State: TOwnerDrawState); var Bitmap: TBitmap; { temporary variable for the item’s bitmap } Offset: Integer; { text offset width } begin { draw on control canvas, not on the form } with (Control as TListBox).Canvas do begin FillRect(Rect); { clear the rectangle } Offset := 2; { provide default offset } Bitmap := TBitmap((Control as TListBox).Items.Objects[Index]); { get the bitmap } if Bitmap <> nil then begin BrushCopy( Bounds(Rect.Left + Offset, Rect.Top, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed); {render bitmap} Offset := Bitmap.width + 6; { add four pixels between bitmap and text} end; TextOut(Rect.Left + Offset, Rect.Top, (Control as TListBox).Items[Index]) { display the text } end; end;
Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
|
What do you think about this topic? Send feedback!
|