[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 941
  • Last Modified:

How to copy bitmap from clipboard to view?

Please help me...

1. How to copy the bitmap from clipboard to view?
2. How to save this bimap as .bmp file?

I tried the following code in OnDraw().
BitBlt function returning 0.
       
BOOL dFlag;
HANDLE hBitmap;      
HDC hdcDest;
DWORD dwError;

dFlag = ::OpenClipboard(m_hWnd);             
hBitmap = ::GetClipboardData(CF_DIB);                  
hdcDest = ::GetDC(m_hWnd);
dFlag = ::BitBlt((HDC)pDC,0,0,800,600,(HDC)hBitmap,0,0,SRCCOPY);
dFlag = ::CloseClipboard();

Pointes are moderate.
Thanque,
with love,
Bhavani P Polimetla
Bhavani_73@hotmail.com
0
polimetla
Asked:
polimetla
  • 3
  • 2
1 Solution
 
polimetlaAuthor Commented:
I visited www.codeguru.com.
But it didn't helped me in any way.

0
 
Answers2000Commented:
1. Problems with your code

(i) On clipboard CF_DIB is device independant bitmap, you should be looking for CF_BITMAP if you want an HBITMAP

(ii) BitBlt stuff is wrong
- you can't cast pDC to HDC - you pDC->m_hDC
- you can't cast hBitmap to HDC, use
HDC hdcBitmap = ::CreateCompatibleDC( pDC->m_hDC ) ;
::SelectObject( hdcBitmap, hBitmap ) ;
then change "(HDC)hBitmap" to hdcBitmap
- get rid of GetDC.  If you have pDC to draw on the view, you don't need it
- clean up code for bitmap and DC required
DeleteDC( hdcBitmap ) ;
DeleteObject( hBitmap ) ;
- BitBlt scaling params incorrect, you wanna make these match the bitmap size, try
BITMAP bm ;
::GetObject( hBitmap, sizeof bm, &bm ) ;
replace 800 with bm.bmWidth
replace 600 with bm.bmHeight

2. To save to file an HBITMAP

Goto http://www.codeguru.com/bitmap/index.shtml

Use code from here
"Converting DDB to DIB - Zafir Anjum (1998/08/05)" to convert your HBITMAP to DIB

Use code from here
"Writing a bitmap to a BMP file - Zafir Anjum (1998/08/05) " to save your DIB to a file.


3. Remember

DIB = Device Independant Bitmap - identified by a HANDLE
DDB = Device Dependant Bitmap - identified by an HBITMAP

HDC = a device context - the thing you draw to.  - C type is HDC
CDC = MFC wrapper round an HDC. C++ type is CDC

Convert HDC to CDC using
CDC::FromHandle( hDC ) ;

Convert CDC to HDC using
pDC->m_hDC


0
 
polimetlaAuthor Commented:
Dear brother,

after getobject() the values are as follows.
bm.width = 1598196250
bm.height = 1244584
all functions are returning 1.
But I didn't see the bitmap on view
The following code is not printing bitmap on view
I didn't under stood why?
Help me please....

void CCboardView::OnDraw(CDC* pDC)
{

BOOL dFlag;      
HANDLE hBitmap;            
HDC hdcBitmap;
BITMAP bm;
      
dFlag = ::OpenClipboard(m_hWnd);             
hBitmap = ::GetClipboardData(CF_DIB);            
hdcBitmap= ::CreateCompatibleDC(pDC->m_hDC);           
::GetObject(hBitmap, sizeof bm, &bm );
   
dFlag = ::BitBlt(pDC->m_hDC,0,0,bm.bmWidth,bm.bmHeight,hdcBitmap,0,0,SRCCOPY);             

dFlag = ::CloseClipboard();

DeleteDC(hdcBitmap);
DeleteObject(hBitmap);

}

with regards,
Bhavani P Polimetla
0
 
Answers2000Commented:
1. Change this GetClipboardData line to :

hBitmap = ::GetClipboardData(CF_BITMAP);

2. Change the hBitmap declaration line to
HBITMAP hBitmap ;

3. Remember a DIB (HANDLE bitmap) is NOT the same as DDB (HBITMAP bitmap).  If you want to convert between the two see the code guru page I previously mentioned.

4. You missed SelectObject after CreateCompatibleDC
SelectObject( hdcBitmap, hBitmap ) ;

5. Additionally you may want to split the OnDraw function:
(i) Make hdcBitmap and hBitmap members of the class.
(ii) in the constructor of the class set these both to NULL
hdcBitmap = NULL ;
hBitmap = NULL ;
(iii) In the destructor of the class add the following

if ( hdcBitmap != NULL ) DeleteDC( hBitmap ) ;
if ( hBitmap != NULL ) DeleteObject( hBitmap ) ;

(iv) When you get the "paste" menu command add this code (add a menu option to the view, and the use class wiz to add a handler function which will be called when the menu is clicked.

if ( hdcBitmap != NULL ) DeleteDC( hBitmap ) ;
if ( hBitmap != NULL ) DeleteObject( hBitmap ) ;
dFlag = ::OpenClipboard(m_hWnd);
hBitmap = ::GetClipboardData(CF_BITMAP);
hdcBitmap= ::CreateCompatibleDC(pDC->m_hDC);      
SelectObject( hdcBitmap, hBitmap ) ;
dFlag = ::CloseClipboard();

(v) In OnDraw just do this

if ( ( hdcBitmap != NULL ) && ( hBitmap != NULL ) )
{
::GetObject(hBitmap, sizeof bm, &bm );
dFlag = ::BitBlt(pDC->m_hDC,0,0,bm.bmWidth,bm.bmHeight,hdcBitmap,0,0,SRCCOPY);
}

Why do this ? - because otherwise you get the clipboard data every time the screen repaints.

0
 
polimetlaAuthor Commented:
Thank you.

Now One more problem. How to save the bitmap to .BMP file?

with regards,
Bhavani P Polimetla
0

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now