/*[]=====================================================================[]*/ /*[] LEADTOOLS for Windows(Class Library) - Version 11 []*/ /*[] []*/ /*[] []*/ /*[] Copyright (c) 1991-2000 LEAD Technologies, Inc. []*/ /*[] All Rights Reserved. []*/ /*[]=====================================================================[]*/ /*---(DIBDDB)--------------------------------------------------------------- We have made the assumption that the user has the knowledge of Object Oriented programing of C under Windows. This example is a menu driven program that can be used to demonstrate the DIB-LEAD-DDB Cycle. Usage: DIBDDB --------------------------------------------------------------------------*/ // DIBDDBVw.cpp : implementation of the CDIBDDBView class // #include "stdafx.h" #include "DIBDDB.h" #include "DIBDDBDc.h" #include "DIBDDBVw.h" #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define NONE_TYPE 0 #define DDB_TYPE 1 #define DIB_TYPE 2 #define LEAD_TYPE 3 ///////////////////////////////////////////////////////////////////////////// // CDIBDDBView IMPLEMENT_DYNCREATE(CDIBDDBView, CView) BEGIN_MESSAGE_MAP(CDIBDDBView, CView) //{{AFX_MSG_MAP(CDIBDDBView) ON_COMMAND(ID_CONVERTFROM_DDB, OnConvertfromDdb) ON_UPDATE_COMMAND_UI(ID_CONVERTFROM_DDB, OnUpdateConvertfromDdb) ON_COMMAND(ID_CONVERTFROM_DIB, OnConvertfromDib) ON_UPDATE_COMMAND_UI(ID_CONVERTFROM_DIB, OnUpdateConvertfromDib) ON_COMMAND(ID_CONVERTTO_DDB, OnConverttoDdb) ON_UPDATE_COMMAND_UI(ID_CONVERTTO_DDB, OnUpdateConverttoDdb) ON_COMMAND(ID_CONVERTTO_DIB, OnConverttoDib) ON_UPDATE_COMMAND_UI(ID_CONVERTTO_DIB, OnUpdateConverttoDib) ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_WM_ERASEBKGND() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDIBDDBView construction/destruction CDIBDDBView::CDIBDDBView() { // TODO: add construction code here m_hDIB = NULL; m_hDDB = NULL; LDialogBase::Initialize(DLG_INIT_COLOR); m_nBitmapType = NONE_TYPE; } CDIBDDBView::~CDIBDDBView() { LDialogBase::Free(); if(m_hDIB) GlobalFree(m_hDIB); if(m_hDDB) DeleteObject(m_hDDB); } ///////////////////////////////////////////////////////////////////////////// // CDIBDDBView drawing void CDIBDDBView::OnDraw(CDC* pDC) { CDIBDDBDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here HPALETTE hOldPalette = NULL; // RECT rc; LPSTR lpstBitmap; CDC MemDC; BITMAP bitmap; LPBITMAPINFO lpBitInfo; L_INT Width; L_INT Height; L_INT nColorData; switch(m_nBitmapType) { case LEAD_TYPE : if ( m_LeadBitmap.GetPalette() ) hOldPalette = SelectPalette (pDC->GetSafeHdc() , m_LeadBitmap.GetPalette(), TRUE); m_LeadBitmap.Paint()->SetDC ( pDC->GetSafeHdc() ); m_LeadBitmap.Paint()->PaintDC(); if (hOldPalette) SelectPalette (pDC->GetSafeHdc() ,hOldPalette, TRUE); break; case DIB_TYPE : lpBitInfo = (LPBITMAPINFO) GlobalLock (m_hDIB); /* Determine the # colors in the image */ if (lpBitInfo->bmiHeader.biBitCount <= 8) nColorData = 1 << lpBitInfo->bmiHeader.biBitCount; else nColorData = 0; lpstBitmap = (LPSTR) lpBitInfo + (WORD) sizeof (BITMAPINFOHEADER) + (nColorData * sizeof (RGBQUAD)); Width = (L_INT) lpBitInfo->bmiHeader.biWidth; Height = (L_INT) lpBitInfo->bmiHeader.biHeight; StretchDIBits (pDC->m_hDC,0, 0, Width, Height,0, 0, Width, Height, lpstBitmap, lpBitInfo, DIB_RGB_COLORS, SRCCOPY); GlobalUnlock (m_hDIB); break; case DDB_TYPE : MemDC.CreateCompatibleDC (pDC); GetObject(m_hDDB,sizeof(bitmap),&bitmap); MemDC.SelectObject(m_hDDB); StretchBlt (pDC->m_hDC,0, 0, bitmap.bmWidth, bitmap.bmHeight, MemDC.m_hDC, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY); MemDC.DeleteDC(); break; } } ///////////////////////////////////////////////////////////////////////////// // CDIBDDBView diagnostics #ifdef _DEBUG void CDIBDDBView::AssertValid() const { CView::AssertValid(); } void CDIBDDBView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CDIBDDBDoc* CDIBDDBView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDIBDDBDoc))); return (CDIBDDBDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CDIBDDBView message handlers void CDIBDDBView::OnConvertfromDdb() { // TODO: Add your command handler code here L_INT nRet; HDC hdc ; HPALETTE hPalette; if(m_hDDB==NULL) return ; AfxGetMainWnd()->SetWindowText ( _T("Converting To LEAD Bitmap") ); hdc = GetDC()->GetSafeHdc(); hPalette = m_LeadBitmap.GetPalette (); nRet = m_LeadBitmap.ConvertFromDDB ( hdc, m_hDDB, hPalette ); if ( nRet !=SUCCESS ) LBase::DisplayError(AfxGetMainWnd()->m_hWnd, nRet ); AfxGetMainWnd ()->SetWindowText( _T("Displaying a LEAD Bitmap") ); DeleteObject(m_hDDB); m_hDDB = NULL; m_nBitmapType = LEAD_TYPE; HandlePalette(WM_QUERYNEWPALETTE,m_hWnd); } void CDIBDDBView::OnUpdateConvertfromDdb(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable( m_nBitmapType==DDB_TYPE); } void CDIBDDBView::OnConvertfromDib() { // TODO: Add your command handler code here L_INT nRet; L_INT nColorData; BITMAPINFO *pInfo; L_UCHAR *pBits; if(m_hDIB==NULL) return; AfxGetMainWnd()->SetWindowText( _T("Converting To LEAD Bitmap") ); pInfo= ( BITMAPINFO* ) GlobalLock ( m_hDIB ); if( pInfo->bmiHeader.biBitCount <= 8 ) nColorData = 1 << pInfo->bmiHeader.biBitCount; else nColorData = 0; pBits = (L_UCHAR *) pInfo + sizeof(BITMAPINFOHEADER) + (nColorData * sizeof(RGBQUAD)); nRet = m_LeadBitmap.ConvertFromDIB ( pInfo, pBits ); GlobalUnlock ( m_hDIB ); GlobalFree ( m_hDIB ); m_hDIB = NULL; if ( nRet !=SUCCESS ) { LBase::DisplayError(AfxGetMainWnd()->m_hWnd, nRet ); return; } AfxGetMainWnd()->SetWindowText ( _T("Displaying a LEAD Bitmap") ); m_nBitmapType = LEAD_TYPE; HandlePalette(WM_QUERYNEWPALETTE,m_hWnd); } void CDIBDDBView::OnUpdateConvertfromDib(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable( m_nBitmapType==DIB_TYPE); } void CDIBDDBView::OnConverttoDdb() { // TODO: Add your command handler code here AfxGetMainWnd()->SetWindowText(_T("Converting To DDB")); HDC hdc ; hdc = GetDC()->GetSafeHdc(); m_hDDB = m_LeadBitmap.ConvertToDDB( hdc ); if (!m_hDDB) { AfxMessageBox(_T("Failed to convert to DDB")); return ; } AfxGetMainWnd()->SetWindowText(_T("Displaying DDB")); m_nBitmapType = DDB_TYPE; RedrawWindow (); } void CDIBDDBView::OnUpdateConverttoDdb(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable( m_nBitmapType==LEAD_TYPE); } void CDIBDDBView::OnConverttoDib() { // TODO: Add your command handler code here AfxGetMainWnd()->SetWindowText ( _T("Converting to DIBitmap") ); m_hDIB = m_LeadBitmap.ConvertToDIB (DIB_BITMAPINFOHEADER); if (!m_hDIB) { AfxMessageBox(_T("Failed to convert to DIB")); return ; } AfxGetMainWnd()->SetWindowText ( _T("Displaying a DIB") ); m_nBitmapType = DIB_TYPE; RedrawWindow (); } void CDIBDDBView::OnUpdateConverttoDib(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable( m_nBitmapType==LEAD_TYPE); } void CDIBDDBView::OnFileOpen() { // TODO: Add your command handler code here L_INT nRet; LBitmapBase tmpBmp; OPENDLGPARAMS FOParm ; OPENFILENAME OpenFileName; memset ( &FOParm, 0, sizeof(OPENDLGPARAMS)) ; memset ( &OpenFileName, 0, sizeof(OPENFILENAME)) ; OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.lpstrInitialDir = NULL; OpenFileName.Flags = OFN_EXPLORER; FOParm.uStructSize = sizeof(OPENDLGPARAMS); FOParm.uDlgFlags = DLG_OPEN_SHOW_PROGRESSIVE | DLG_OPEN_SHOW_MULTIPAGE | DLG_OPEN_SHOW_LOADROTATED | DLG_OPEN_SHOW_LOADCOMPRESSED | DLG_OPEN_SHOW_FILEINFO | DLG_OPEN_SHOW_DELPAGE | DLG_OPEN_SHOW_LOADOPTIONS | DLG_OPEN_VIEWTOTALPAGES ; tmpBmp.DialogFile()->SetOpenParams(&FOParm) ; tmpBmp.DialogFile()->SetOpenFileName(&OpenFileName) ; tmpBmp.DialogFile()->EnablePreview(true); tmpBmp.DialogFile()->EnableAutoProcess(TRUE); nRet = tmpBmp.DialogFile()->DoModalOpen(m_hWnd); if( nRet != SUCCESS_DLG_OK ) { if ( nRet != SUCCESS_DLG_CANCEL ) LBase::DisplayError( AfxGetMainWnd()->GetSafeHwnd(), nRet ); return ; } m_LeadBitmap.SetHandle(tmpBmp.GetHandle()); HandlePalette(WM_QUERYNEWPALETTE,m_hWnd); AfxGetMainWnd()->SetWindowText ( _T("Displaying a LEAD Bitmap") ); m_nBitmapType = LEAD_TYPE ; /////////////////////////START-RESIZE//////////////////////////////////////// RECT rc; rc.left = 0; rc.top = 0; rc.right = m_LeadBitmap.GetWidth (); rc.bottom = m_LeadBitmap.GetHeight (); m_LeadBitmap.SetDstRect ( &rc ); HandlePalette(WM_QUERYNEWPALETTE,m_hWnd); AdjustWindowRect(&rc, AfxGetMainWnd()->GetStyle(), TRUE); RECT rcWindow; AfxGetMainWnd()->GetWindowRect(&rcWindow); AfxGetMainWnd()->SetWindowPos(NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SWP_NOZORDER | SWP_NOMOVE ); /////////////////////END-RESIZE//////////////////////////////////////// } BOOL CDIBDDBView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default CBrush brush; CRect rect; brush.CreateSolidBrush( RGB(0, 0, 0) ); GetClientRect(&rect); pDC->FillRect( &rect, &brush ); return( TRUE ); } void CDIBDDBView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) { // TODO: Add your specialized code here and/or call the base class if(bActivate==TRUE&&pActivateView==this) HandlePalette(WM_QUERYNEWPALETTE,m_hWnd); CView::OnActivateView(bActivate, pActivateView, pDeactiveView); } L_BOOL CDIBDDBView::HandlePalette(UINT uMsg,HWND hWnd) { HDC hDC; switch(uMsg) { case WM_PALETTECHANGED: if(m_hWnd== hWnd) return TRUE; case WM_SYSCOLORCHANGE: case WM_QUERYNEWPALETTE: hDC = ::GetDC(m_hWnd); HPALETTE hPalette = m_LeadBitmap.CreatePaintPalette(hDC); L_UINT uColor=0; if(hPalette) { HPALETTE oldPalette = ::SelectPalette(hDC,hPalette,(uMsg==WM_PALETTECHANGED)); uColor=::RealizePalette(hDC); ::SelectPalette(hDC,oldPalette,TRUE); } ::ReleaseDC(m_hWnd,hDC); InvalidateRect(NULL,false); UpdateWindow(); return TRUE; } return FALSE; }