[hpp-file]
protected:
DYNAMIC void __fastcall MouseDown (TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
public:
__published:
__property TabOrder;
__property TabStop;
[cpp-file]
в конструкторе:
TabStop = true;
// переопределяем
void __fastcall TGraphCustomControl::MouseDown (TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
{
SetFocus();
TCustomControl::MouseDown(Button, Shift, X, Y);
}
//---------------------------------------------------------------------------
// небольшой довесок - по мотивам WinApi
MESSAGE void __fastcall TGraphCustomControl::WMSetFocus (TWMSetFocus &Message)
{
Message.Result = 0;
if (FOnGetFocus) FOnGetFocus(this);
}
//---------------------------------------------------------------------------
MESSAGE void __fastcall TGraphCustomControl::WMKillFocus (TWMKillFocus &Message)
{
Message.Result = 0;
if (FOnLostFocus) FOnLostFocus(this);
}
//---------------------------------------------------------------------------
Как мышью перекинуть фокус на ::TCustomControl
Что надо переключить у потомков TCustomControl чтобы клик мыши передавал фокус объекту?
(кроме варианта SetFocus() в OnMouseDown)
Цитата: Zor
Помогите, похоже этот момент я прохлопал :)
Что надо переключить у потомков TCustomControl чтобы клик мыши передавал фокус объекту?
(кроме варианта SetFocus() в OnMouseDown)
Что надо переключить у потомков TCustomControl чтобы клик мыши передавал фокус объекту?
(кроме варианта SetFocus() в OnMouseDown)
Я смотрю, ты сам столкнулся с подобной проблемой ;)
Вот мой тестовый компонент. Я в нём сделал как ты говорил. Не работает.
Может кто-то ещё его посмотрит и ответит на вопрос.
Осмотр исходников Borland дал результат:
Ко всему вышеперечисленному добавляем (вытаскиваем/переопределяем):
Код:
+что получилось
Цитата: Zor
Разобрался :)
Осмотр исходников Borland дал результат:
Ко всему вышеперечисленному добавляем (вытаскиваем/переопределяем):
работает на ура...
Осмотр исходников Borland дал результат:
Ко всему вышеперечисленному добавляем (вытаскиваем/переопределяем):
Код:
[hpp-file]
protected:
DYNAMIC void __fastcall MouseDown (TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
...
// переопределяем
void __fastcall TGraphCustomControl::MouseDown (TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
{
SetFocus();
TCustomControl::MouseDown(Button, Shift, X, Y);
}
ну ясен пень если ты фокус не устанавливаешь откуда он у тебя возьметЦа:) По другому ни как.
Не понятно нахрена вводить новые обработчики FOnGetFocus-FOnSetFocus они же уже есть OnEnter, OnExit!?
[code]
// hpp
class PACKAGE TCustomControl1 : public TCustomControl
{
private:
bool FFocus;
protected:
virtual void __fastcall Paint();
DYNAMIC void __fastcall DoEnter();
DYNAMIC void __fastcall DoExit();
DYNAMIC void __fastcall MouseDown(TMouseButton Button,
Classes::TShiftState Shift, int X, int Y);
public:
__fastcall TCustomControl1(TComponent* Owner);
__published:
__property OnEnter;
__property OnExit;
__property TabOrder;
__property TabStop;
};
// cpp
#pragma hdrstop
#include "CustomControl1.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TCustomControl1 *)
{
new TCustomControl1(NULL);
}
//---------------------------------------------------------------------------
__fastcall TCustomControl1::TCustomControl1(TComponent* Owner)
: TCustomControl(Owner)
{
FFocus = false;
}
//---------------------------------------------------------------------------
namespace Customcontrol1
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TCustomControl1)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
void __fastcall TCustomControl1::Paint()
{
//TODO: Add your source code here
TCustomControl::Paint();
if(FFocus)
{
Canvas->FillRect(ClientRect);
Canvas->TextOut(0, 0, "Focused");
}
else
{
Canvas->FillRect(ClientRect);
Canvas->TextOut(0, 0, "UnFocused");
}
}
void __fastcall TCustomControl1::DoEnter()
{
TCustomControl::DoEnter();
FFocus = true;
Invalidate(); // Pour afficher le rectangle de focus.
}
//---------------------------------------------------------------------------
void __fastcall TCustomControl1::DoExit()
{
TCustomControl::DoExit();
FFocus = false;
Invalidate();
}
void __fastcall TCustomControl1::MouseDown(TMouseButton Button,
Classes::TShiftState Shift, int X, int Y)
{
SetFocus();
FFocus = true;
Invalidate();
}
protected:
DYNAMIC void __fastcall MouseDown (TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
...
// переопределяем
void __fastcall TGraphCustomControl::MouseDown (TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
{
SetFocus();
TCustomControl::MouseDown(Button, Shift, X, Y);
}
ну ясен пень если ты фокус не устанавливаешь откуда он у тебя возьметЦа:) По другому ни как.
Не понятно нахрена вводить новые обработчики FOnGetFocus-FOnSetFocus они же уже есть OnEnter, OnExit!?
[code]
// hpp
class PACKAGE TCustomControl1 : public TCustomControl
{
private:
bool FFocus;
protected:
virtual void __fastcall Paint();
DYNAMIC void __fastcall DoEnter();
DYNAMIC void __fastcall DoExit();
DYNAMIC void __fastcall MouseDown(TMouseButton Button,
Classes::TShiftState Shift, int X, int Y);
public:
__fastcall TCustomControl1(TComponent* Owner);
__published:
__property OnEnter;
__property OnExit;
__property TabOrder;
__property TabStop;
};
// cpp
#pragma hdrstop
#include "CustomControl1.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TCustomControl1 *)
{
new TCustomControl1(NULL);
}
//---------------------------------------------------------------------------
__fastcall TCustomControl1::TCustomControl1(TComponent* Owner)
: TCustomControl(Owner)
{
FFocus = false;
}
//---------------------------------------------------------------------------
namespace Customcontrol1
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TCustomControl1)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
void __fastcall TCustomControl1::Paint()
{
//TODO: Add your source code here
TCustomControl::Paint();
if(FFocus)
{
Canvas->FillRect(ClientRect);
Canvas->TextOut(0, 0, "Focused");
}
else
{
Canvas->FillRect(ClientRect);
Canvas->TextOut(0, 0, "UnFocused");
}
}
void __fastcall TCustomControl1::DoEnter()
{
TCustomControl::DoEnter();
FFocus = true;
Invalidate(); // Pour afficher le rectangle de focus.
}
//---------------------------------------------------------------------------
void __fastcall TCustomControl1::DoExit()
{
TCustomControl::DoExit();
FFocus = false;
Invalidate();
}
void __fastcall TCustomControl1::MouseDown(TMouseButton Button,
Classes::TShiftState Shift, int X, int Y)
{
SetFocus();
FFocus = true;
Invalidate();
}
работает на ура...
// вообще то уже есть ::Focused() на кой ляд FFocus ?