2012-03-14 3 views
0

Je suis en train de faire une fenêtre de prévisualisation d'image contextuelle comme il est fait dans Autodesk Revit Architecture:Comment faire une image popup? wxWidgets

see how it looks in Revit

Le comportement de l'image pop-up est:

  1. Lorsque la souris arrête pour 500 millisecondes sur l'image tronquée, une image contextuelle pleine taille apparaît près du curseur de la souris. L'image contextuelle n'est pas une boîte de dialogue modale, par conséquent les contrôles de la fenêtre principale (wxDialog) sont toujours activés.
  2. La fenêtre contextuelle disparaît lors du mouvement de la souris.

J'ai essayé de le faire, mais j'ai échoué. D'abord je mets wxStaticBitmap sur wxDialog et utilise ShowModal() pour afficher cette image en taille réelle. Cela fonctionne très bien mais comme c'est Modal, la fenêtre principale devient désactivée. J'ai essayé de rendre cette boîte de dialogue non modale, mais quand j'essaye de le faire, la fenêtre principale augmente (la fenêtre principale est modale) et l'image disparaît.

mise à jour. Maintenant, mon code:

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

structure du code du panneau est comme ceci:

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() 
}; 

Panel est placé dans le principal dialogue modale:

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

il a aidé, mais pas complètement. Comme l'image n'apparaît pas sous le curseur de la souris mais à proximité (comme dans l'image de ma question), la fenêtre contextuelle ne peut pas intercepter les mouvements de la souris. J'ai essayé d'attraper les mouvements de la souris dans la boîte de dialogue principale, mais cela a échoué, car la mise au point est effectuée par une fenêtre contextuelle.

Mon but est de fermer la popup après tout mouvement de la souris.

Répondre

0

Vous devriez publier votre code qui 'échoue'. Il est difficile de donner des conseils spécifiques lorsque nous n'avons aucune information sur ce que vous faites.

Avez-vous regardé wxPopupWindow? http://docs.wxwidgets.org/trunk/classwx_popup_window.html

Personnellement, je trouve qu'il est plus facile de rouler le mien. Voici à quoi ressemble celui sur lequel je travaille en ce moment

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(); 
} 

Pour que cette fenêtre apparaisse, appelez simplement le constructeur.

Vous souhaitez transmettre votre image pour l'afficher, la stocker dans un attribut, gérer l'événement paint en dessinant votre image dans la zone client.

+0

J'ai essayé ceci: 'classe PictureFrame: wxPopupTransientWindow publique { .... };' cela a aidé mais pas complètement. Comme l'image n'apparaît pas sous le curseur de la souris mais à proximité (comme dans l'image de ma question), la fenêtre contextuelle ne peut pas intercepter les mouvements de la souris. J'ai essayé d'attraper les mouvements de la souris dans la boîte de dialogue principale, mais cela a échoué, car la mise au point est effectuée par une fenêtre contextuelle. Mon but est de fermer la popup après tout mouvement de la souris. – Pillar

+0

Vous semblez avoir de nouvelles questions. S'il vous plaît modifier votre question, ou en demander un nouveau. N'oubliez pas d'inclure le code qui 'échoue'. Si ma réponse à votre première question était utile, veuillez voter, ou même l'accepter. – ravenspoint

+0

sujet mis à jour, ne fonctionne toujours pas comme j'ai besoin – Pillar