⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mdiclient.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
字号:

/******************************************************************

$Archive: /MfcExt/Source/MDIClient.cpp $
$Workfile: MDIClient.cpp $
$Author: Bogdan Ledwig $
$Date: 99-01-12 12:48 $
$Revision: 1 $

*******************************************************************/

#include "StdAfx.h"

#include "MDIClient.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//////////////////////////////////////////////////////////////////////////// 
// Registry keys used for saving/restoring the state
static TCHAR szSection[]      = _T( "MDIClient" );
static TCHAR szDisplayMode[]  = _T( "DisplayMode" );
static TCHAR szBkColor[]      = _T( "BkColor" );
static TCHAR szFileName[]     = _T( "FileName" );
static TCHAR szOriginX[]      = _T( "OriginX" );
static TCHAR szOriginY[]      = _T( "OriginY" );

/////////////////////////////////////////////////////////////////////////////
// CMDIClient

CMDIClient::CMDIClient()
{   
   Reset();
   m_bAutoSaveRestore = TRUE;
}

CMDIClient::~CMDIClient()
{
}

void CMDIClient::PreSubclassWindow()
{
   CWnd::PreSubclassWindow();
   if ( m_bAutoSaveRestore == TRUE )
      RestoreState();
}

void CMDIClient::Reset()
{
   m_ptOrigin.x = m_ptOrigin.y = 0;
   m_sizeImage.cx = m_sizeImage.cy = 0;
   m_eDisplayMode = dispTile;
   m_strFileName.Empty();      
   SetBkColor( ::GetSysColor( COLOR_APPWORKSPACE ) );
   m_bitmap.DeleteObject();
   if ( IsWindow( m_hWnd ) )
      Invalidate();
}

BOOL CMDIClient::SetBitmap( LPCTSTR lpszFileName, UINT uFlags )
{
   HANDLE handle = ::LoadImage( AfxGetInstanceHandle(),
                      lpszFileName,
                      IMAGE_BITMAP,
                      0, 0,
                      uFlags | LR_LOADFROMFILE );
   
   if ( !handle )    // There were some problems during loading the image
      return FALSE;
   
   m_bitmap.DeleteObject();
   m_bitmap.Attach( (HBITMAP)handle );
   if ( IsWindow( m_hWnd ) )
      Invalidate();
   m_strFileName = lpszFileName;

   BITMAP bi;
   m_bitmap.GetBitmap( &bi );
   m_sizeImage.cx = bi.bmWidth;
   m_sizeImage.cy = bi.bmHeight;

   return TRUE;
}

BOOL CMDIClient::SetBitmap( UINT nBitmapID, COLORMAP* pClrMap, int nCount )
{
   m_bitmap.DeleteObject();
   if ( pClrMap == NULL )  // Load normal
   {
      if ( m_bitmap.LoadBitmap( nBitmapID ) == FALSE )
         return FALSE;
   }
   else                    // Load mapped 
   {      
      if ( m_bitmap.LoadMappedBitmap( nBitmapID, 0, pClrMap, nCount ) == FALSE )
         return FALSE;
   }

   BITMAP bi;
   m_bitmap.GetBitmap( &bi );
   m_sizeImage.cx = bi.bmWidth;
   m_sizeImage.cy = bi.bmHeight;

   if ( IsWindow( m_hWnd ) )
      Invalidate();
   return TRUE;
}

void CMDIClient::SetBkColor( COLORREF clrValue )
{
   m_clrBackground = clrValue;
   m_brush.DeleteObject();
   m_brush.CreateSolidBrush( m_clrBackground );
   if ( IsWindow( m_hWnd ) )
      Invalidate();
}

void CMDIClient::SetDisplayMode( CMDIClient::DisplayModesEnum eDisplayMode )
{
   m_eDisplayMode = eDisplayMode;      
   if ( IsWindow( m_hWnd ) )
      Invalidate();
}

void CMDIClient::SaveState()
{
   AfxGetApp()->WriteProfileInt( szSection, szDisplayMode, GetDisplayMode() );
   AfxGetApp()->WriteProfileInt( szSection, szBkColor, GetBkColor() );
   AfxGetApp()->WriteProfileString( szSection, szFileName, GetFileName() );
   AfxGetApp()->WriteProfileInt( szSection, szOriginX, GetOrigin().x );
   AfxGetApp()->WriteProfileInt( szSection, szOriginY, GetOrigin().y );   
}

void CMDIClient::RestoreState()
{   
   m_eDisplayMode = (DisplayModesEnum)AfxGetApp()->GetProfileInt( szSection, szDisplayMode, dispTile );      
   m_ptOrigin.x = AfxGetApp()->GetProfileInt( szSection, szOriginX, 0 );
   m_ptOrigin.y = AfxGetApp()->GetProfileInt( szSection, szOriginY, 0 );
   SetBkColor( AfxGetApp()->GetProfileInt( szSection, szBkColor, GetSysColor( COLOR_APPWORKSPACE ) ) );
   CString str = AfxGetApp()->GetProfileString( szSection, szFileName, _T( "" ) );
   if ( str.GetLength() )
      SetBitmap( str );
}

BEGIN_MESSAGE_MAP(CMDIClient, CWnd)
   //{{AFX_MSG_MAP(CMDIClient)
   ON_WM_DESTROY()
   ON_WM_PAINT()
   ON_WM_SIZE()
   ON_WM_ERASEBKGND()
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CMDIClient message handlers

void CMDIClient::OnPaint() 
{
   CPaintDC dc( this );
   CRect rc;
   GetClientRect( rc );
    
   if ( !(HBITMAP)m_bitmap )   // If no bitmap is selected
      dc.FillRect( rc, &m_brush );
 
   if ( (HBITMAP)m_bitmap )
   {
      CDC* pDC;
      CDC memDC;
      CBitmap bmp; 
            
      BOOL bDrawOnMemDC = ( GetDisplayMode() != dispTile ) ? TRUE : FALSE;
      if ( bDrawOnMemDC )
      {
         if ( GetDisplayMode() != dispStretch )
            bmp.CreateCompatibleBitmap( &dc, rc.right, rc.bottom );
         else
            bmp.CreateCompatibleBitmap( &dc, m_sizeImage.cx, m_sizeImage.cy );
         memDC.CreateCompatibleDC( &dc );
         memDC.SelectObject( &bmp );
         pDC = &memDC;
      }
      else
         pDC = &dc;      
      
      switch ( GetDisplayMode() )
      {
         case dispCustom:
            {
               pDC->FillRect( rc, &m_brush );               
               pDC->DrawState( m_ptOrigin, m_sizeImage, &m_bitmap, DST_BITMAP | DSS_NORMAL );
            }
            break;

         case dispCenter:
            {
               pDC->FillRect( rc, &m_brush );
               CPoint point( ( rc.Width() - m_sizeImage.cx ) / 2, 
                             ( rc.Height() - m_sizeImage.cy ) / 2 );
               pDC->DrawState( point, m_sizeImage, &m_bitmap, DST_BITMAP | DSS_NORMAL );
            }
            break;

         case dispTile:
            {
               CPoint point;
               for ( point.y = 0; point.y < rc.Height(); point.y += m_sizeImage.cy )
                  for ( point.x = 0; point.x < rc.Width(); point.x += m_sizeImage.cx )
                     pDC->DrawState( point, m_sizeImage, &m_bitmap, DST_BITMAP | DSS_NORMAL );
            }
            break;

         case dispStretch:
            {
               memDC.DrawState( CPoint(0,0), m_sizeImage, &m_bitmap, DST_BITMAP | DSS_NORMAL );
               dc.SetStretchBltMode( COLORONCOLOR );
               dc.StretchBlt( 0, 0, rc.right, rc.bottom, &memDC, 
                              0, 0, m_sizeImage.cx, m_sizeImage.cy, SRCCOPY );
            }
            return;
      }
                            
      if ( bDrawOnMemDC == TRUE )
         dc.BitBlt( 0, 0, rc.right, rc.bottom, pDC, 0, 0, SRCCOPY );
   }
}

BOOL CMDIClient::OnEraseBkgnd( CDC* /*pDC*/ ) 
{   
   return TRUE;    // Return TRUE so background is not erased   
}

void CMDIClient::OnSize( UINT nType, int cx, int cy )
{
   if ( nType != SIZE_MINIMIZED && GetDisplayMode() != dispTile )   // Force repainting if center mode is selected
      Invalidate();
   CWnd::OnSize( nType, cx, cy );
}

void CMDIClient::OnDestroy()
{   
   if ( m_bAutoSaveRestore == TRUE )
      SaveState();
   CWnd::OnDestroy();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -