2010-02-17 55 views
6

Tôi đã viết một chương trình wxPython mà tôi đang dịch sang wxWidgets. Chương trình có một cửa sổ cuộn hiển thị một hình ảnh. Sau Rappin, wxPython Trong Hành động (Liệt kê 12.1), tôi đã sử dụng một StaticBitmap trong một bảng điều khiển. Trong khi lướt tài liệu wxWidgets mới nhất, tôi tìm thấy dire warning rằng wxStaticBitmap chỉ nên được sử dụng cho những hình ảnh rất nhỏ. Nó nói, "... bạn nên sử dụng điều khiển của riêng bạn nếu bạn muốn hiển thị hình ảnh lớn hơn một cách hợp lý." Đuợc. Cho tôi xem. Tôi không có "kiểm soát của riêng tôi".Cách xây dựng hiển thị hình ảnh wxWidgets đơn giản

Rappin sai, hoặc là tài liệu lỗi thời?

Câu hỏi - một người mới, không nghi ngờ gì - là cách đúng đắn để làm một cửa sổ xem hình ảnh đơn giản trong wxWidgets là gì? Một thay thế drop-in cho wxStaticBitmap sẽ là tốt đẹp. Tôi nhìn vào chương trình "hình ảnh" trong thư mục "mẫu" wxWidgets. Đó là một chiến tranh và hòa bình dài . Chắc chắn phải có một lớp học đóng hộp hoặc một công thức đơn giản.

+0

có lẽ thay vì 'Invalidate()', mghie có nghĩa là 'Refresh()'. (Đây phải là một mod để trả lời 0, nhưng tôi không thấy làm thế nào để thực hiện điều đó.) – contributor

Trả lời

3

Đừng để kích thước của mẫu "hình ảnh" đánh lừa bạn, chỉ cần một vài dòng mã để thực hiện những gì bạn muốn.

Tìm kiếm lớp MyImageFrame trong image.cpp tập tin, nó là gì khác hơn là một lớp học với một lĩnh vực tin bitmap, một constructor tùy chỉnh để thiết lập các bitmap và kích thước cửa sổ khách hàng, và một event handler cho EVT_PAINT :

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

Vì bạn không muốn có một lớp khung đây là công thức nấu ăn của bạn: bạn tạo một hậu duệ đơn giản của wxWindow mà có một nhà xây dựng tương tự, xử lý sơn và bản sao các phương pháp wxStaticBitmap mà bạn sử dụng trong mã của bạn. Có lẽ chỉ đơn giản là một phương pháp để thiết lập một bitmap mới và thay đổi kích thước điều khiển thành các kích thước bitmap mới.

+0

Tôi đang đánh dấu đó là câu trả lời. Có vẻ dễ dàng. Tôi chưa thực sự làm việc đó, nhưng tôi mới bắt đầu. :-) –

+0

Một ví dụ làm việc thực tế sẽ là tuyệt vời. Tôi đã tìm ra rằng tôi phải ném vào "PrepareDC (dc)" sau "wxPaintDC dc (this);" Tôi không biết đó là cái gì hay tại sao nó lại cần thiết. Chỉ cần khỉ-nhìn thấy khỉ-làm. Tôi đã có nó hiển thị hình ảnh một cách chính xác ngay bây giờ. Nhưng tôi vẫn chưa thể chụp được một cú click chuột vào hình ảnh. Vẫn còn đấu tranh. Trở đi qua sương mù! –

+0

@Jive: Xem http://docs.wxwidgets.org/2.8/wx_wxscrolledwindow.html#wxscrolledwindowpreparedc, tuy nhiên điều này nằm ngoài việc viết một thay thế đơn giản 'wxStaticBitmap'. Đối với các lần nhấp chuột, hãy xem http://docs.wxwidgets.org/2.8/wx_wxmouseevent.html#wxmouseevent, lớp của bạn sẽ có thể xử lý chúng, vì vậy bạn chỉ cần kết nối một trình xử lý. * view.cpp * trong mẫu * docvwmdi * có một lớp canvas (hậu duệ của 'wxScrolledWindow') mà cả thao tác vẽ và xử lý chuột, có thể nghiên cứu điều này sẽ giúp ích. – 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

Bạn có lẽ không nên gọi bất kỳ mã vẽ nào trong 'LoadImage()', gọi 'Invalidate()' là đủ, điều khiển sẽ được vẽ lại khi nó thuận tiện cho hệ thống. Nó có thể không cần thiết hoặc thậm chí nó không thể vẽ vào lúc 'LoadImage()' được gọi. – mghie

+0

1> ------ Bắt đầu xây dựng: Dự án: Munsell_picker, Cấu hình: Gỡ lỗi Win32 ------ 1> Biên dịch ... 1> main.cpp 1>. \ Main.cpp (114): lỗi C3861: 'Invalidate': không tìm thấy mã định danh –

Các vấn đề liên quan