Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать что форма находиться в фокусе? 
V
    Опции темы
Alca
Дата 28.10.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Как узнать что форма находиться в фокусе?


--------------------
PM WWW ICQ Skype Jabber   Вверх
mrbrooks
Дата 28.10.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



TApplicationEvents - событие OnActivate
PM MAIL   Вверх
Alca
Дата 28.10.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Делаю так:
Код

/****************************************************************************
* TfrmInputCaptcha - ввод каптчи
*
*****************************************************************************/

//--------------------------------------------------------------------------- 
#ifndef uInputCaptchaH
#define uInputCaptchaH
//--------------------------------------------------------------------------- 
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>

#include "uMain.h"
#include <Buttons.hpp>
#include <ExtCtrls.hpp>      //frmMain
//--------------------------------------------------------------------------- 
class TfrmInputCaptcha : public TForm {
    __published:
        TImage *imgCaptcha;
        TBitBtn *btnCancel;
        TBitBtn *btnOk;
        TEdit *edtCaptcha;
        TLabel *Label1;
        TTimer *tmrFlashWindow;

        void __fastcall btnOkClick         (TObject *Sender);
        void __fastcall btnCancelClick     (TObject *Sender);
        void __fastcall tmrFlashWindowTimer(TObject *Sender);

    public:
        __fastcall      TfrmInputCaptcha   (TComponent* Owner, TMemoryStream *pmsMS);

    private:
        //фокус
        void __fastcall             vOnActivate          (TWMActivate &a);
        BEGIN_MESSAGE_MAP
            MESSAGE_HANDLER(WM_ACTIVATE,   TWMActivate, vOnActivate)
        END_MESSAGE_MAP(TForm)
};
//--------------------------------------------------------------------------- 
#endif





/****************************************************************************
* TfrmInputCaptcha - ввод каптчи
*
*****************************************************************************/

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "uInputCaptcha.h"    //frmInputCaptcha
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
//DONE: конструктор
__fastcall TfrmInputCaptcha::TfrmInputCaptcha(TComponent *Owner, TMemoryStream *pmsMS) :
    TForm(Owner)
{
    /*DEBUG*/XASSERT(NULL != pmsMS);

    tmrFlashWindow->Interval = 500;
    tmrFlashWindow->Enabled  = true;
}
//---------------------------------------------------------------------------
//TODO: мигание в панели задач
void __fastcall TfrmInputCaptcha::tmrFlashWindowTimer(TObject *Sender) {
    ::FlashWindow(Application->Handle, true);
}
//---------------------------------------------------------------------------
//TODO: фокус формы
void __fastcall TfrmInputCaptcha::vOnActivate(TWMActivate &a) {
    if (WA_INACTIVE == a.Active) {
        //покинули форму

    } else {
        //активировали форму
     ShowMessage(_T("активировали форму"));  //<<<<<< форма еще не получила фокус, а мсжбокс вывалился
        tmrFlashWindow->Enabled = false;

        a.Result = 0;
    }
}
//---------------------------------------------------------------------------

Нажимая кнопку из главной формы ("Старт") , при создании дочекрней формы запускается таймер.
Пока он не сработал "кладу" форму на под какое-нибудь окно (т.е. форма не имеет фокуса).
Вроде бы дочерняя форма фокуса не получала, но мсжбокс вываливатся (см. код).

Добавлено через 10 минут и 11 секунд
Получилось так:
Код

//TODO: мигание в панели задач
void __fastcall TfrmInputCaptcha::tmrFlashWindowTimer(TObject *Sender) {
    HWND          hWnd                 = NULL;
    TCHAR         szBuff[MAX_PATH + 1] = {0};
    const tString csWndText            = Caption;

    hWnd = ::GetForegroundWindow();
    int iSize = ::GetWindowText(hWnd, szBuff, MAX_PATH);

    if (csWndText == tString(szBuff, iSize)) {
        tmrFlashWindow->Enabled = false;         

        return;
    }

    ::FlashWindow(Application->Handle, true);
}


Это сообщение отредактировал(а) Alca - 28.10.2009, 17:37


--------------------
PM WWW ICQ Skype Jabber   Вверх
dumb
Дата 29.10.2009, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



а чем не устроил обычный frmInputCaptcha->Focused()?
PM MAIL   Вверх
Alca
Дата 29.10.2009, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Цитата

а чем не устроил обычный frmInputCaptcha->Focused()?

Тем, что не работает (скока не клацал по форме):
Код

void __fastcall TfrmInputCaptcha::tmrFlashWindowTimer(TObject *Sender) {
    HWND          hWnd                 = NULL;
    TCHAR         szBuff[MAX_PATH + 1] = {0};
    const tString csWndText            = Caption;

    hWnd = ::GetForegroundWindow();
    /*DEBUG*///not need

    int iSize = ::GetWindowText(hWnd, szBuff, MAX_PATH);
    /*DEBUG*///not need

    if (Focused() == true/*csWndText == tString(szBuff, iSize)*/) {
        tmrFlashWindow->Enabled = false;

        return;
    }

    ::FlashWindow(Application->Handle, true);
}



--------------------
PM WWW ICQ Skype Jabber   Вверх
dumb
Дата 29.10.2009, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



а, пардон, один из контролов на этой форме будет иметь Focused() = true.
а нужная тебе проверка: if (Screen->ActiveForm == this)
PM MAIL   Вверх
Alca
Дата 29.10.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Цитата

а, пардон, один из контролов на этой форме будет иметь Focused() = true.
а нужная тебе проверка: if (Screen->ActiveForm == this)

Та же фигня, что и с WA_INACTIVE  smile 
Код
//---------------------------------------------------------------------------
//DONE: конструктор
__fastcall TfrmInputCaptcha::TfrmInputCaptcha(TComponent *Owner, TMemoryStream *pmsMS) :
    TForm(Owner)
{
    tmrFlashWindow->Interval = 500;

    ActiveControl = edtCaptcha;

    tmrFlashWindow->Enabled  = true;
}
//---------------------------------------------------------------------------
//TODO: мигание в панели задач
void __fastcall TfrmInputCaptcha::tmrFlashWindowTimer(TObject *Sender) {

    if (Screen->ActiveForm == this) {
        tmrFlashWindow->Enabled = false;

        return;
    }

    ::FlashWindow(Application->Handle, true);
}
//---------------------------------------------------------------------------
void __fastcall TfrmInputCaptcha::FormShow(TObject *Sender) {
    edtCaptcha->SetFocus();
}
//---------------------------------------------------------------------------




--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.