copy a wxDC to wxScrolledWindow

Miguel Cartagena miguel.cartagena at gmail.com
Tue Dec 5 08:21:17 PST 2006


Sorry, I didn't has time t explain before, so ...

The source DC comes from another module of my application, where it's
drawn. In my module, I have to show this DC on screen (using a
wxScrolledWindow for that).

Now I'm do this in this way:
 1 - I'm receive a pointer to the source DC and store a static pointer
of a wxBitmap.

        wxBitmap* DocToCanvasMapper::BitmapInstance(wxDC &dc){
	static wxBitmap *bmp = 0;
	if (!bmp) {
	  int w, h;
	  dc.GetSize(&w, &h);
	  bmp = new wxBitmap(w, h);
	  wxMemoryDC *memDC = new wxMemoryDC();
	  memDC->SelectObject(*bmp);
	  wxCoord zero = 0;
	  wxCoord ww = w;
	  wxCoord hh = h;

	  memDC->Blit(zero, zero, ww, hh, dcc, zero, zero);
	  dc.DrawBitmap(*bmp, zero, zero, true);
	  bmp->SaveFile(_T("/home/miguel/Desktop/test.bmp"),
wxBITMAP_TYPE_BMP);
	  memDC->SelectObject(wxNullBitmap);
	  delete memDC;
	}
	return bmp;
}

 2 - Rewrinting the wxScrolledWindow::OnDraw() method, I call the bmp
pointer and draw on a dc.
  void MyScrolledWindow::Draw(wxDC& dc){
    wxImage img =
DocToCanvasMapper::BitmapInstance()->ConvertToImage();
    img.Rescale(630, 891);
    wxBitmap bmpRescaled(img);
    dc.DrawBitmap(bmpRescaled, 0, 0, true);
  }


To test, I'm using another wxScrolledWindow (SWTest), drawing on it
rewriting the OnDraw method, putting the SW on a frame and show it. To
send the SWTest DC to my module I do this:
wxDC* SWTest::GetDC(){
  return new wxClientDC(this);
}

Well ... the problem that I have is: When the wxBitmap is generated the
image that is build is like a print screen, cutting the area where the
SWTest is.


On 4 dez, 16:41, "Miguel Cartagena" <miguel.cartag... at gmail.com> wrote:
> The source DC come from another module and is drawn manually. Something
> like this:
>
> void BuildDC(){
>   wxClientDC dc(this);
>   dc.DrawText(_T("TEST"), 10, 10);
>   ...
>
> }On Dec 4, 10:55 am, pstarczew... at o2.pl (Piotr Starczewski) wrote:
>
> > Your code looks ok (didn't test it yet). The only thing is that you
> > should put memDC->SelectObject(wxNullBitmap) instead of
> > memDC->DrawBitmap. By drawing your bitmap on memDC theoretically you are
> > drawing currently selected bitmap on the same bitmap (I'm not sure if
> > that is possible with currently drawn bitmap selected into wxMemoryDC
> > and I'm not sure how it will behave). I'll test this solution later this
> > evening.
>
> > You mentioned that "I have a wxDC drawn before, outside my
> > application.". What do you mean by that? Are you trying to take a window
> > snapshot from external application or does some external application
> > "draws" on your dc?
>
> > Regards,
> > Peter
>
> > Miguel Cartagena wrote:
> > > I test this and when I call Blit method, it's draw a print screen .. my
> > > IDE.
> > > Here the code:
>
> > >   dc.GetSize(&w, &h);
> > >           // the source DC
> > >   wxBitmap bmp(w, h, wxBITMAP_TYPE_BMP);
> > >   wxMemoryDC *memDC = new wxMemoryDC();
> > >   memDC->SelectObject(bmp);
> > >   bmp.SaveFile(_T("c:\\test1.bmp"), wxBITMAP_TYPE_BMP);    // just for
> > > test
> > >   wxCoord zero = 0;
> > >   wxCoord ww = w;
> > >   wxCoord hh = h;
>
> > >   memDC->Blit(zero, zero, ww, hh, &dc, zero, zero);
> > >   bmp.SaveFile(_T("c:\\test2.bmp"), wxBITMAP_TYPE_BMP);   // just for
> > > test
>
> > >   memDC->DrawBitmap(bmp, 0, 0, false);
>
> > >   wxImage img = bmp.ConvertToImage();
> > >   img.Rescale(210, 297);
> > >   wxBitmap bmpRescaled(img);
>
> > >   bmpRescaled.SaveFile(_T("c:\\test3.bmp"), wxBITMAP_TYPE_BMP);   //
> > > just for test
>
> > > On Dec 4, 9:56 am, pstarczew... at o2.pl (Piotr Starczewski) wrote:
>
> > >> That should not be a problem. First of all you need to get a
> > >> pointer/reference to your source wxDC. Then just wxDC::Blit it into
> > >> wxMemoryDC with selected bitmap. Final step is to rescale your bitmap
> > >> and draw it with wxDC::DrawBitmap(...) onto your scrolled window.
>
> > >> Regards,
> > >> Peter
>
> > >> Miguel Cartagena wrote:
>
> > >>> Sorry, I'll try to explain the problem better.
>
> > >>> I have a wxDC drawn before, outside my application. So, I don't know
> > >>> what is drawn in it and I can't "do my drawing"  :)
> > >>> What I want to do is: get this DC, rescale to my ScrolledWindow size
> > >>> and show it into my ScrolledWindow.
>
> > >>> For this, copy the DC it's not enough, I think. A possible solution is
> > >>> redraw the DC that I receive on MyScrolledWindow::OnDraw(wxDC& dc)
> > >>> method, or something like.
>
> > >>> void DCReceiver::ReceiveDC(wxDC& dc){
> > >>>   MyScrolledWindow::Draw(dc);
> > >>> }
>
> > >>> ...
>
> > >>> void MyScrolledWindow::Draw(wxDC& dc){
> > >>>   dc.Redraw();  // the wxDC::Redraw() method not exists, therefore my
> > >>> doubt.
> > >>> }
>
> > >>> void MyScrolledWindow::OnDraw(wxDC& dc){
> > >>>   Draw(dc);  // rewrite the wxScrolledWindow::OnDraw method ?
> > >>> }
>
> > >>> Thanks and regards,
> > >>> Miguel
>
> > >>> ---------------------------------------------------------------------
> > >>> To unsubscribe, e-mail: wx-users-unsubscr... at lists.wxwidgets.org
> > >>> For additional commands, e-mail: wx-users-h... at lists.wxwidgets.org---------------------------------------------------------------------
>
> > >> To unsubscribe, e-mail: wx-users-unsubscr... at lists.wxwidgets.org
> > >> For additional commands, e-mail: wx-users-h... at lists.wxwidgets.org
>
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: wx-users-unsubscr... at lists.wxwidgets.org
> > > For additional commands, e-mail: wx-users-h... at lists.wxwidgets.org---------------------------------------------------------------------
> > To unsubscribe, e-mail: wx-users-unsubscr... at lists.wxwidgets.org
> > For additional commands, e-mail: wx-users-h... at lists.wxwidgets.org







More information about the wx-users mailing list