www.pudn.com > BitMapToolBar.rar > PictureWindow.h
/************************************ REVISION LOG ENTRY Revision By: Mihai Filimon Revised on 11/24/99 9:45:45 AM Comments: PictureWindow.h: interface for the CPictureWindow class. ************************************/ #if !defined(AFX_PICTUREWINDOW_H__44323373_9E89_11D3_A393_00C0DFC59237__INCLUDED_) #define AFX_PICTUREWINDOW_H__44323373_9E89_11D3_A393_00C0DFC59237__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include#include class CPictureWindow : public CWindowImpl { public: typedef enum HandlerTypeEnum { ClientPaint = WM_PAINT, BackGroundPaint = WM_ERASEBKGND } HandlerTypeEnum; CPictureWindow() { m_nMessageHandler = ClientPaint; }; virtual ~CPictureWindow() { }; BEGIN_MSG_MAP(CPictureWindow) MESSAGE_HANDLER(WM_PAINT, OnPaint) MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkGnd) END_MSG_MAP() // Function name : Load // Description : Loads the picture into memory, and then display it! // Return type : virtual BOOL // Argument : LPCTSTR szFileName virtual BOOL Load( LPCTSTR szFileName ) { BOOL bResult = FALSE; Close(); if ( szFileName ) { OFSTRUCT of; HANDLE hFile = NULL;; if ( (hFile = (HANDLE)OpenFile( szFileName, &of, OF_READ | OF_SHARE_COMPAT)) != (HANDLE)HFILE_ERROR ) { DWORD dwHighWord = NULL, dwSizeLow = GetFileSize( hFile, &dwHighWord ); DWORD dwFileSize = dwSizeLow; HRESULT hResult = NULL; if ( HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize) ) if ( void* pvData = GlobalLock( hGlobal ) ) { DWORD dwReadBytes = NULL; BOOL bRead = ReadFile( hFile, pvData, dwFileSize, &dwReadBytes, NULL ); GlobalUnlock( hGlobal ); if ( bRead ) { CComPtr spStream; _ASSERTE( dwFileSize == dwReadBytes ); if ( SUCCEEDED( CreateStreamOnHGlobal( hGlobal, TRUE, &spStream) ) ) if ( SUCCEEDED( hResult = OleLoadPicture( spStream, 0, FALSE, IID_IPicture, (void**)&m_spPicture ) ) ) bResult = TRUE; } } CloseHandle( hFile ); } } Invalidate(); return bResult; } HandlerTypeEnum m_nMessageHandler; protected: inline virtual BOOL IsHandlerMessage( UINT uMsg ) { return m_nMessageHandler == (HandlerTypeEnum)uMsg ; } void PutPicture( IPicture* pPicture, HDC hDC, RECT rPicture ) { OLE_XSIZE_HIMETRIC nWidth = NULL; OLE_YSIZE_HIMETRIC nHeight = NULL; pPicture->get_Width( &nWidth ); pPicture->get_Height( &nHeight ); pPicture->Render( hDC, rPicture.left ,rPicture.top, rPicture.right - rPicture.left, rPicture.bottom - rPicture.top, 0, nHeight, nWidth, -nHeight, NULL ); }; LRESULT OnEraseBkGnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if ( IsHandlerMessage( uMsg ) ) { if ( m_spPicture ) { BeginPaint( NULL ); RECT r ; GetClientRect( &r ); HDC hDC = GetDC(); HWND hWndChild = GetWindow( GW_CHILD ); while ( ::IsWindow( hWndChild ) ) { if ( ::IsWindowVisible( hWndChild ) ) { RECT rChild; ::GetWindowRect( hWndChild, &rChild ); ScreenToClient( &rChild ); ExcludeClipRect( hDC, rChild.left, rChild.top, rChild.right, rChild.bottom ); } hWndChild = ::GetWindow( hWndChild, GW_HWNDNEXT ); } PutPicture( m_spPicture, hDC, r ); ReleaseDC( hDC ); EndPaint( NULL ); return TRUE; } } bHandled = FALSE; return FALSE; }; LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if ( IsHandlerMessage( uMsg ) ) { if ( m_spPicture ) { BeginPaint( NULL ); RECT r ; GetClientRect( &r ); HDC hDC = GetDC(); PutPicture( m_spPicture, hDC, r ); ReleaseDC( hDC ); EndPaint( NULL ); } } bHandled = FALSE; return NULL; }; void Close() { m_spPicture = NULL; } //Attributes CComPtr m_spPicture; }; #endif // !defined(AFX_PICTUREWINDOW_H__44323373_9E89_11D3_A393_00C0DFC59237__INCLUDED_)