Как сделать всплывающее изображение? wxWidgets

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

посмотрите, как это выглядит в 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();
};

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

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


person Pillar    schedule 14.03.2012    source источник


Ответы (1)


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

Вы смотрели на 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();
}

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

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

person ravenspoint    schedule 14.03.2012
comment
Я пробовал это: 'класс PictureFrame: public wxPopupTransientWindow { .... };' помогло, но не полностью. Поскольку изображение появляется не под курсором мыши, а рядом с ним (как на картинке моего вопроса), всплывающее окно не может улавливать движения мыши. Я пытался поймать движения мыши в главном диалоге, но это не удалось, потому что фокус перехватывается всплывающим окном. Моя цель - закрыть всплывающее окно после любого движения мыши. - person Pillar; 16.03.2012
comment
Кажется, у вас появились новые вопросы. Пожалуйста, отредактируйте свой вопрос или задайте новый. Не забудьте включить код, который «сбой». Если мой ответ на ваш первый вопрос был полезен, пожалуйста, проголосуйте за него или даже примите его. - person ravenspoint; 16.03.2012