2010-02-17 19 views
6

मैंने एक WxPython प्रोग्राम लिखा है जिसे मैं wxwidgets में अनुवाद कर रहा हूं। कार्यक्रम में एक स्क्रॉल विंडो है जो एक छवि प्रदर्शित करती है। रैपिन के बाद, कार्रवाई में wxPython (लिस्टिंग 12.1), मैंने एक पैनल के भीतर एक स्टेटिक बिटमैप का उपयोग किया। नवीनतम WxWidgets दस्तावेज़ सर्फ करते समय, मुझे dire warning मिला कि WxStaticBitmap का उपयोग केवल बहुत छोटी छवियों के लिए किया जाना चाहिए। यह कहता है, "... यदि आप बड़ी छवियों को पोर्टेबल रूप से प्रदर्शित करना चाहते हैं तो आपको अपने नियंत्रण का उपयोग करना चाहिए।" ठीक है। मुझे दिखाओ। मेरे पास मेरा "नियंत्रण नहीं है।"सरल wxwidgets छवि प्रदर्शन कैसे बनाएं

रैपिन गलत था, या दस्तावेज पुराना है?

प्रश्न - एक नौसिखिया, कोई संदेह नहीं - WxWidgets में एक साधारण छवि-दृश्य विंडो करने का सही तरीका क्या है? WxStaticBitmap के लिए एक ड्रॉप-इन प्रतिस्थापन अच्छा होगा। मैंने wxwidgets "नमूने" निर्देशिका में "छवि" प्रोग्राम में देखा। यह युद्ध और शांति के रूप में लंबे समय तक है। निश्चित रूप से एक डिब्बाबंद वर्ग या एक साधारण नुस्खा होना चाहिए।

+0

शायद 'अमान्य()' के बजाय, मागी का अर्थ 'ताज़ा करें))। (यह 0 का जवाब देने के लिए एक मोड होना चाहिए, लेकिन मुझे नहीं लगता कि इसे कैसे पूरा किया जाए।) – contributor

उत्तर

3

"छवि" नमूना के आकार को आप को मूर्ख मत होने दें, जो कुछ भी आप चाहते हैं उसे करने के लिए कोड की केवल कुछ पंक्तियां आवश्यक हैं।

image.cpp फ़ाइल में MyImageFrame वर्ग के लिए

खोजें, यह एक निजी बिटमैप क्षेत्र, बिटमैप और खिड़की ग्राहक आकार निर्धारित करने के लिए एक कस्टम निर्माता, और EVT_PAINT के लिए एक ईवेंट हैंडलर के साथ एक वर्ग से ज्यादा कुछ नहीं है :

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

जब से तुम नहीं एक फ्रेम वर्ग यहाँ नुस्खा है चाहते हैं: आप एक ऐसी ही निर्माता, पेंट हैंडलर है और wxStaticBitmap है कि आप अपने कोड में उपयोग के तरीकों डुप्लिकेट wxWindow का एक सरल वंशज पैदा करते हैं। हो सकता है कि एक नया बिटमैप सेट करने के लिए बस एक विधि और नए बिटमैप आयामों पर नियंत्रण का आकार बदलें।

+0

मैं इसे उत्तर के रूप में चिह्नित कर रहा हूं। यह आसान लग रहा है। मैं वास्तव में इसे अभी तक काम करने के लिए नहीं मिला है, लेकिन मैंने अभी शुरू किया। :-) –

+0

एक वास्तविक कामकाजी उदाहरण बहुत अच्छा होगा। मुझे पता चला है कि "wxPaintDC डीसी (यह)" के बाद मुझे "PrepareDC (डीसी)" में फेंकना है; " मुझे नहीं पता कि यह क्या है या इसकी आवश्यकता क्यों है। बस बंदर-बंदर-कर देखें। मुझे अब छवियों को सही तरीके से प्रदर्शित कर लिया है। लेकिन मैं अभी तक छवि पर माउस-क्लिक कैप्चर करने में सक्षम नहीं हूं। अभी भी संघर्ष। धुंध के माध्यम से आगे! –

+0

@Jive: http://docs.wxwidgets.org/2.8/wx_wxscrolledwindow.html#wxscrolledwindowpreparedc देखें, हालांकि यह एक सरल 'wxStaticBitmap' प्रतिस्थापन लिखने के बाहर है। माउस क्लिक के लिए http://docs.wxwidgets.org/2.8/wx_wxmouseevent.html#wxmouseevent देखें, आपकी कक्षा उनको संभालने में सक्षम होना चाहिए, इसलिए आपको केवल एक हैंडलर कनेक्ट करने की आवश्यकता है। * view.cpp * * docvwmdi * नमूने में कैनवास वर्ग ('wxScrolledWindow' के वंशज) है जो ड्राइंग और माउस हैंडलिंग दोनों करता है, शायद इसका अध्ययन करने में मदद मिलेगी। – 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

आपको शायद 'लोड इमेज()' में किसी भी पेंटिंग कोड को कॉल नहीं करना चाहिए, 'अमान्य()' को कॉल करना पर्याप्त होना चाहिए, सिस्टम के लिए सुविधाजनक होने पर नियंत्रण फिर से खींचा जाएगा। यह आवश्यक नहीं हो सकता है या उस समय लोड करना असंभव हो सकता है जब लोडइमेज() 'कहा जाता है। – mghie

+0

1> ------ बिल्ड प्रारंभ: प्रोजेक्ट: Munsell_picker, कॉन्फ़िगरेशन: डीबग Win32 ------ 1> संकलन ... 1> main.cpp 1>। मुख्य।सीपीपी (114): त्रुटि सी 3861: 'अमान्य': पहचानकर्ता नहीं मिला –