Newsgroup: it.comp.lang.c++
Titolo: hwnd & c da dentro un evento di un form

}
Direi che hwnd,wmsg,wparam e lparam non ti servono a niente in questo
caso.Essi sono infatti tipici della programmazione MFC ed OWL,mentre nella
libreria VCL sono totalmente inutili.Nel tuo esempio infatti(che parrebbe
scritto con il C++Builder) c'é già tutto quello che serve,ovvero:la form a
cui appartiene il bottone che tu vuoi gestire(Form1)e Sender,il puntatore
all'oggetto che ha richiamato quell'evento.Non c'é bisogno d'altro.
Il Ghenio


Sono d' accordo con il Ghenio. Uno strumento di alto livello come
il C++ Builder ti permette di concentrarti  su quello che devi fare e
di non preoccuparti troppo dei dettagli.
Ma se hai fatto questa domanda,vuol dire che, per qualche ragione,
hai bisogno di scendere al livello dello SDK, forse per utilizzare
direttamente delle API.
Devi allora capire come il C++ Builder intercetta i messaggi che
Windows genera, e li trasforma in eventi.
Presuppongo che tu sappia programmare con lo SDK.
Ebbene ogni componente windowed, ossia che ha un window
handle, e puo' ricevere il focus, deriva da TWinControl( o un suo derivato),
il quale ha un metodo virtuale che si chiama:
void __fastcall WndProc(Messages::TMessage &Message).
Tale metodo e' la window procedure di vecchia memoria. E' ad
esso che giungono TUTTI i messaggi windows. Il parametro e'
una struttura (definita in Messages.hpp) cosi' definita:
struct TMessage
{
 Cardinal Msg;
 union
 {
  struct
  {
   Word WParamLo;
   Word WParamHi;
   Word LParamLo;
   Word LParamHi;
   Word ResultLo;
   Word ResultHi;
  };
  struct
  {
   long WParam;
   long LParam;
   long Result;
  };
 };
} ;
Quindi i parametri WParam e LParam sono impacchettati in essa.
Il metodo WndProc poi, capito il messaggio, vede se l' utente ha definito
un evento per quel messaggio e lo chiama.
Ti riporto di seguito, un piccolo esempio, che intercetta i click su un form
e riporta in una list box le coordinate del mouse nel momento del click.
unit1.h
#include <vcl\Classes.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Forms.hpp>
class TForm1 : public TForm
{
protected:
void __fastcall WndProc(Messages::TMessage &Message);
void __fastcall TForm1::HandleClick(Messages::TWMMouse &Message);
__published: // IDE-managed Components
 TButton *Clear;
 TListBox *ListBox1;
 void __fastcall ClearClick(TObject *Sender);
private: // User declarations
public:  // User declarations
 __fastcall TForm1(TComponent* Owner);
};
extern TForm1 *Form1;
#endif
unit1.cpp
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
}
void __fastcall TForm1::HandleClick(Messages::TWMMouse &Message)
{
 Cardinal Msg=Message.Msg;
    long Keys=Message.Keys;
    short XPos=Message.XPos;
    short YPos=Message.YPos;
    /*se hai TMessage invece di TWMMouse
    long WParam=Message.WParam;
    long LParam=Message.LParam;
    long Result=Message.Result;*/
    AnsiString MsgStr;
    MsgStr=IntToStr(XPos)+" "+IntToStr(YPos);
    if (Form1->ListBox1)
  Form1->ListBox1->Items->Add(MsgStr);
}
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
if (Message.Msg==WM_LBUTTONDOWN) HandleClick( (TWMMouse&)Message);
TWinControl::WndProc(Message);
}
void __fastcall TForm1::ClearClick(TObject *Sender)
{
 ListBox1->Items->Clear();
}
In Form1::WndProc, prima di chiamare HandleClick, effettuo un cast di
Message a TWMMouse( una struttura equivalente a TMessage, ma piu' utile
quando si vogliono gestire messaggi del mouse).
Ultima cosa: la proprieta' Handle ti da' gia' l' handle del controllo
windowed.
Ciao.