Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как мышью перекинуть фокус на ::TCustomControl

8.4K
10 декабря 2007 года
Zor
104 / / 23.04.2006
Помогите, похоже этот момент я прохлопал :)
Что надо переключить у потомков TCustomControl чтобы клик мыши передавал фокус объекту?
(кроме варианта SetFocus() в OnMouseDown)
3.2K
10 декабря 2007 года
nikipelovav
152 / / 12.04.2006
Цитата: Zor
Помогите, похоже этот момент я прохлопал :)
Что надо переключить у потомков TCustomControl чтобы клик мыши передавал фокус объекту?
(кроме варианта SetFocus() в OnMouseDown)



Я смотрю, ты сам столкнулся с подобной проблемой ;)

Вот мой тестовый компонент. Я в нём сделал как ты говорил. Не работает.
Может кто-то ещё его посмотрит и ответит на вопрос.

8.4K
10 декабря 2007 года
Zor
104 / / 23.04.2006
Разобрался :)
Осмотр исходников Borland дал результат:

Ко всему вышеперечисленному добавляем (вытаскиваем/переопределяем):

Код:
[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);
}
//---------------------------------------------------------------------------


+что получилось
246
10 декабря 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: Zor
Разобрался :)
Осмотр исходников 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();
}

работает на ура...
8.4K
10 декабря 2007 года
Zor
104 / / 23.04.2006
Да кто ж заставляет то ;)
// вообще то уже есть ::Focused() на кой ляд FFocus ?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог