We help IT Professionals succeed at work.

Need some help with rectangle of a bitmap

Thomas Stockbruegger
Thomas Stockbruegger asked
on
Hallo,
I need some help with this code that I found on the web.
The code works fine to do a Hardcopy of the complete screen.

But I would like to make a Hardcopy from a part of the screen, size of a rectangle that I would like to add to the code.
But I do not know how to do this, or to change the code.

Thank you for your help.
Best regards,
Thomas


 
        // get the device context of the screen
          HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL);    

        // and a device context to put it in
          HDC hMemoryDC = CreateCompatibleDC(hScreenDC);

          int width = GetDeviceCaps(hScreenDC, HORZRES);
          int height = GetDeviceCaps(hScreenDC, VERTRES);

         // maybe worth checking these are positive values
          HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, width, height);
      
         // get a new bitmap
          HBITMAP hOldBitmap = (HBITMAP) SelectObject(hMemoryDC, hBitmap);

          BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY);
          hBitmap = (HBITMAP) SelectObject(hMemoryDC, hOldBitmap);


         // clean up
          DeleteDC(hMemoryDC);
          DeleteDC(hScreenDC);


        // now your image is held in hBitmap. You can save it or do whatever with it



//=========================== Drucken =================================================
       CDC memDC;
       CBitmap bitmap;

       int maxw = pDC->GetDeviceCaps(HORZRES);
       int maxh = pDC->GetDeviceCaps(VERTRES);
       pInfo->m_rectDraw.SetRect(0,0,maxw,maxh);

      
        if(!bitmap.Attach(hBitmap));
       BITMAP bm;
       bitmap.GetBitmap(&bm);
       BOOL ok= memDC.CreateCompatibleDC(pDC);
       memDC.SelectObject(&bitmap);

   
       //----------------------------- Drucken ----------------------------------------------------------------------------
        pDC->StretchBlt(0,0,6800,4800,&memDC,0,0,bm.bmWidth,bm.bmHeight, SRCCOPY);
     //--------------------------------------------------------------------------------------------------------------------------
 
       memDC.DeleteDC();
       bitmap.DeleteObject();
 
//=======================================================================================
Comment
Watch Question

Top Expert 2016
Commented:
BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY);

the BitBlt copies from point (0, 0) - that is top-left of the source bitmap (hScreenDC) a rectangle of width x height color pixels to the destination (hMemoryDC). if you want only a part of the screenshot you have to change parameters 2 to 5  (x, y, wid, hgt). for example, if you want only a 50 percent rectangle from middle of the screen, you would have

BitBlt(hMemoryDC, width/4, height/4, width/2, height/2, hScreenDC, 0, 0, SRCCOPY);

Open in new window


note, the destination bitmap should be created with the needed sizes, then.

Sara
Dear Sara,
Thank you for your answer.
Yes, this works.
BitBlt(hMemoryDC, 5,41,10000,415, hScreenDC, 5, 41, SRCCOPY);


note, the destination bitmap should be created with the needed sizes, then.
I think I have to do this, because the rest of the screen/bitmap is black.

I do not know how, can you help me.
pInfo->m_rectDraw.SetRect(0,0,maxw,maxh);<----- here?

Best regards,
Thomas
//----------------------------- Drucken ----------------------------------------------------------------------------
        pDC->StretchBlt(5,41,6800,4800,&memDC,0,0,1000,415, SRCCOPY);
     //--------------------------------------------------------------------------------------------------------------------------
This will work
pDC->StretchBlt(5,41,6800,4800,&memDC,5,41,1000,415, SRCCOPY); ....sorry I fast to fast
Thank you for your help.
Best regards and a nice weekend.
Thomas