2010-02-17 24 views
6

escribí un programa wxPython que estoy traduciendo a wxWidgets. El programa tiene una ventana desplazada que muestra una imagen. Siguiendo a Rappin, wxPython En Acción (Listado 12.1), utilicé un StaticBitmap dentro de un panel. Mientras navegaba por la última documentación de wxWidgets, encontré un dire warning que wxStaticBitmap solo debería usarse para imágenes muy pequeñas. Dice: "... debe usar su propio control si desea mostrar imágenes más grandes de forma portátil". Bueno. Muéstrame. No tengo mi "propio control".Cómo construir visualización de imagen sencilla wxWidgets

se Rappin mal, o es la documentación fuera de fecha?

La pregunta - un novato uno, sin duda - es ¿cuál es la manera correcta de hacer una simple ventana de la imagen-view en wxWidgets? Un reemplazo directo para wxStaticBitmap sería agradable. Busqué en el programa "imagen" en el directorio "samples" de wxWidgets. Es tan largo como Guerra y paz. Seguramente debe haber una clase enlatada o una receta simple.

+0

quizás en lugar de 'Invalidate()', mghie significa 'Actualizar()'. (Esto debería ser un mod para responder 0, pero no veo cómo lograr eso.) – contributor

Respuesta

3

No deje que el tamaño de la "imagen" tonto muestra que, sólo son necesarias unas pocas líneas de código para hacer lo que quiera.

Búsqueda de la clase MyImageFrame en el archivo image.cpp, no es nada más que una clase con un campo privado de mapa de bits, un constructor personalizada para establecer el mapa de bits y el tamaño de ventana del cliente, y un controlador de eventos para EVT_PAINT :

void OnPaint(wxPaintEvent& WXUNUSED(event)) 
{ 
    wxPaintDC dc(this); 
    dc.DrawBitmap(m_bitmap, 0, 0, true /* use mask */); 
} 

Ya que no quieren una clase de trama aquí tiene su receta: se crea un descendiente sencilla de wxWindow que tiene un constructor similares, manejador de pintura y duplica los métodos de wxStaticBitmap que se utiliza en el código. Tal vez simplemente sea un método para establecer un nuevo mapa de bits y cambiar el tamaño del control a las nuevas dimensiones del mapa de bits.

+0

Lo estoy marcando como la respuesta. Parece fácil. Todavía no lo hice funcionar, pero recién comencé. :-) –

+0

Un ejemplo de trabajo real sería genial. Me he dado cuenta de que tengo que lanzar "PrepareDC (dc)" después de "wxPaintDC dc (this);" No tengo idea de qué es eso o por qué es necesario. Solo mono: ver a los monos haciendo. Lo tengo mostrando las imágenes correctamente ahora. Pero aún no he podido capturar un clic del mouse en la imagen. Todavía luchando. ¡Adelante a través de la niebla! –

+0

@Jive: Ver http://docs.wxwidgets.org/2.8/wx_wxscrolledwindow.html#wxscrolledwindowpreparedc, sin embargo, esto está fuera de escribir una simple sustitución 'wxStaticBitmap'. Para clics del mouse, consulte http://docs.wxwidgets.org/2.8/wx_wxmouseevent.html#wxmouseevent, su clase debe poder manejarlos, por lo que solo necesita conectar un controlador. * view.cpp * en la muestra * docvwmdi * tiene una clase canvas (descendiente de 'wxScrolledWindow') que maneja tanto el dibujo como el mouse, tal vez estudiar esto ayude. – mghie

2
// A scrolled window for showing an image. 
class PictureFrame: public wxScrolledWindow 
{ 
public: 
    PictureFrame() 
     : wxScrolledWindow() 
     , bitmap(0,0) 
    {;} 

    void Create(wxWindow *parent, wxWindowID id = -1) 
    { 
     wxScrolledWindow::Create(parent, id); 
    } 

    void LoadImage(wxImage &image) { 
     bitmap = wxBitmap(image); 
     SetVirtualSize(bitmap.GetWidth(), bitmap.GetHeight()); 
     wxClientDC dc(this); 
     PrepareDC(dc); 
     dc.DrawBitmap(bitmap, 0, 0); 
    } 

protected: 
    wxBitmap bitmap; 

    void OnMouse(wxMouseEvent &event) { 
     int xx,yy; 
     CalcUnscrolledPosition(event.GetX(), event.GetY(), &xx, &yy); 
     event.m_x = xx; event.m_y = yy; 
     event.ResumePropagation(1); // Pass along mouse events (e.g. to parent) 
     event.Skip(); 
    } 

    void OnPaint(wxPaintEvent &event) { 
     wxPaintDC dc(this); 
     PrepareDC(dc); 
     dc.DrawBitmap(bitmap, 0,0, true); 
    } 
private: 
    DECLARE_EVENT_TABLE() 
}; 

BEGIN_EVENT_TABLE(PictureFrame,wxScrolledWindow) 
    EVT_PAINT(PictureFrame::OnPaint) 
    EVT_MOUSE_EVENTS(PictureFrame::OnMouse) 
END_EVENT_TABLE() 
+0

Usted probablemente no debería llamar a cualquier código de la pintura en 'LoadImage()', 'llamando Invalidar()' debería ser suficiente, el control a continuación, se vuelve a dibujar cuando es conveniente para el sistema. Puede no ser necesario o incluso puede ser imposible pintar en el momento en que se llama a 'LoadImage() '. – mghie

+0

1> ------ Build started: Project: Munsell_picker, Configuración: Debug Win32 ------ 1> Compilación ... 1> main.cpp 1>. \ Main.cpp (114): error C3861: 'Invalidar': identificador no encontrado –

Cuestiones relacionadas