Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > вернуть фокус на DBGrid


Автор: pharrell 24.9.2009, 20:03
Есть DBGrid в нем хранятся путь к pdf файлам, их открываю на этой же форме с помощью AcroPDF.Проблема в том что при открытии pdf фокус перескакивает на AcroPDF, что не очень удобно.Приходится кликать по Гриду. Есть ли способ запретить смену фокуса или как вернуть после открытия файла???

Автор: Данкинг 24.9.2009, 20:35
А у AcroPDF есть событие получения фокуса? Если есть, то в нём и возвращай фокус назад на DBGrid. smile 

Автор: pharrell 24.9.2009, 20:54
Не проходит. Тут дело мне кажется даже не в фокусе, открывается pdf при этом создается новый процесс и переключение на него...Или может я чего-то не понимаю))

Автор: dumb 24.9.2009, 22:20
а какой смысл открывать pdf не переводя на него фокус?
сделай форме FormStyle = fsStayOnTop - фокус с pdf'а уходить не будет, но форма будет видна.

Автор: pharrell 25.9.2009, 10:10
смысл в том чтобы сделать предпросмотр документа, т.е. фактически и не нужно открывать его.А из компанентов только AcroPDF знаю.А фокус наоборот с DBGrid уходить не должен.

Автор: dumb 26.9.2009, 10:13
а. понял. проблема в слишком активном захвате фокуса этим компонентом.

если не нужно управление pdf'ом, то наименьшим "головняком" будет просто сделать AcroPDF1->Enabled = false
если нужно хотя бы полистать, то можно управлять через   AcroPDF1->gotoNextPage(), AcroPDF1->gotoPreviousPage()
а если немого заморочиться, то можно сделать возможность управления:
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "AcroPDFLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
HHOOK hHookMC = 0;
//---------------------------------------------------------------------------
LRESULT CALLBACK LowLevelMouseProc(int code, WPARAM wParam, LPARAM lParam)
{
  HWND hWnd = Form1->Handle;
  if (code == HC_ACTION && wParam == WM_MOUSEMOVE && GetForegroundWindow() == hWnd)
  {
    MSLLHOOKSTRUCT *ms = reinterpret_cast<MSLLHOOKSTRUCT *>(lParam);
    TPoint pt = ms->pt;
    ScreenToClient(hWnd, &pt);
    static TWinControl *ac = 0;
    TRect r = Form1->AcroPDF1->BoundsRect;
    if (pt.x > r.left && pt.x < r.right && pt.y > r.top && pt.y < r.bottom)
    {
      if (!ac)
      {
        ac = Form1->ActiveControl;
        Form1->AcroPDF1->Enabled = true;
      }
    }
    else
    {
      if (ac)
      {
        Form1->AcroPDF1->Enabled = false;
        Form1->ActiveControl = ac;
        ac = 0;
      }
    }
  }
  return CallNextHookEx(0, code, wParam, lParam);
}
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  hHookMC = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)LowLevelMouseProc, GetModuleHandle(0), 0);
  ListBox1->Items->Add("1.pdf");
  ListBox1->Items->Add("2.pdf");
  ListBox1->Items->Add("3.pdf");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1DblClick(TObject *Sender)
{
  int idx = ListBox1->ItemIndex;
  if (idx == -1) return;
  AcroPDF1->Enabled = false;
  AcroPDF1->LoadFile(WideString(ListBox1->Items->Strings[idx]));
  AcroPDF1->setView (L"Fit");
  AcroPDF1->setShowToolbar(false);
//  AcroPDF1->setShowScrollbars(false);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  UnhookWindowsHookEx(hHookMC);
}
//---------------------------------------------------------------------------

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)