Как сделать всплывающее изображение?WxWidgets - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь создать всплывающее окно предварительного просмотра изображений, как в Autodesk Revit Architecture:

see how it looks in Revit

Поведение всплывающего изображения:

  1. Когда мышь останавливается на 500 миллисекунд над усеченным изображением, рядом с курсором мыши появляется всплывающее изображение в натуральную величину.
  2. Всплывающее изображение не является модальным диалоговым окном, поэтому элементы управления главного окна (wxDialog) по-прежнему включены.
  3. Всплывающее окно исчезает при движении мыши.

Я пытался это сделать, но мне не удалось. Сначала я ставлю wxStaticBitmap на wxDialog и использую ShowModal(), чтобы показать это полноразмерное изображение. Он отлично работает, но так как он модальный, главное окно отключается. Я пытался сделать это диалоговое окно не модальным, но когда я пытаюсь это сделать, главное окно открывается (главное окно является модальным) и изображение исчезает.

обн. Теперь мой код:

class PictureFrame: public wxPopupTransientWindow
{
  wxStaticBitmap *m_picture;
public:
  PictureFrame( wxWindow *parent );
  ~PictureFrame();
};

Структура кода панели выглядит следующим образом:

class MaterialsPane: public wxPanel
{
  PictureFrame* m_popup;
  wxTimer* m_timer;
public:
  MaterialsPane( wxWindow* parent);
  ~MaterialsPane();
  void OnTimer( wxTimerEvent& event);
  void OnMouseMove( wxMouseEvent& event );
  ....
  DECLARE_EVENT_TABLE()
};

Панель размещается в главном модальном диалоге:

class MaterialsFrame: public wxDialog {
  MaterialsPane* m_materialsPane;
public:
  MaterialsFrame( wxWindow* parent, wxWindowID id = wxID_ANY);
  ~MaterialsFrame();
};

это помогло, но не полностью. Поскольку изображение появляется не под курсором мыши, а рядом с ним (как на картинке моего вопроса), всплывающее окно не может поймать движения мыши. Я пытался отследить движения мыши в главном диалоговом окне, но это не удалось, потому что всплывающее окно сфокусировано на фокусе.

Моя цель - закрыть всплывающее окно после любого движения мыши.

1 Ответ

0 голосов
/ 14 марта 2012

Вы должны опубликовать свой код, который «не работает». Трудно дать конкретный совет, когда у нас нет информации о том, что вы делаете.

Вы смотрели на wxPopupWindow? http://docs.wxwidgets.org/trunk/classwx_popup_window.html

Лично мне легче накатить свою. Вот как выглядит тот, над которым я сейчас работаю

cNewDataPopup::cNewDataPopup(  cPatDataset& data )
    : wxDialog(NULL,-1,L"New data",wxPoint(200,200),wxSize(570,242),
        wxDEFAULT_DIALOG_STYLE|wxSTAY_ON_TOP )
    , myData( data )
{ 
    ...
    Show();
}

Чтобы это всплывающее окно появилось, просто вызовите конструктор.

Вы хотели бы передать свое изображение для отображения, сохранить его в атрибуте, обработать событие рисования, рисуя свое изображение в клиентской области.

...