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

📄 itemdlg.cpp

📁 此为LIST控件的扩展功能
💻 CPP
字号:
// ItemDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ListTest.h"
#include "ItemDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CItemDlg dialog


CItemDlg::CItemDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CItemDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CItemDlg)
	//}}AFX_DATA_INIT
	m_bFocus = FALSE;
	m_pListWnd = NULL;
	m_bShowLast = FALSE;

	ClearmemRect();
}


void CItemDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CItemDlg)
	DDX_Control(pDX, IDC_BUTTON_ITEM, m_Button_Item);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CItemDlg, CDialog)
	//{{AFX_MSG_MAP(CItemDlg)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_BUTTON_ITEM, OnButtonItem)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
void CItemDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	CRect rect;
	this->GetWindowRect( &rect );

	//////////////////////////////////////
	dc.SetBkMode( TRANSPARENT );

	if( m_bFocus )
	{
		dc.SetTextColor( RGB(255,255,255) );

		CBrush brbank;//屏幕背景颜色
		brbank.CreateSolidBrush( BKCOLOR );
		CBrush* pOldBrush=dc.SelectObject( &brbank );
		dc.Rectangle( 0, 0, rect.Width(), rect.Height() );
		dc.SelectObject( pOldBrush );
	}
	else
	{
		dc.SetTextColor( RGB( 0, 0, 0) );
	}

	/////////////////////////////
	int height = rect.Height()/m_ListInfo.iHeight;

	BITMAP bmSize = MyShowImage( &dc, 1, 1, m_ListInfo.nIDResource );
	MyTextOut( &dc, bmSize.bmWidth + FIRSTLIST_X, FIRSTLIST_Y, m_ListInfo.str1 );
	MyTextOut( &dc, rect.Width()/3*2, FIRSTLIST_Y, m_ListInfo.str2 );
	MyTextOut( &dc, rect.Width()/6*5, FIRSTLIST_Y, m_ListInfo.str3 );

	for( int i = 0; i< m_ListInfo.iList; i++  )
	{
		MyTextOut( &dc, SECONDLIST_X, height*(i+1) + FIRSTLIST_Y, m_ListInfo.pStrList[i] );
	}

	if( m_bShowLast )
	{
		MyTextOut( &dc, 10, height*(i+1) + FIRSTLIST_Y, m_ListInfo.strEnd );
	}
	else;
}

void CItemDlg::OnButtonItem() 
{
	if( NULL != m_ListInfo.lpOnButton )
	{
		(* m_ListInfo.lpOnButton)( (LPVOID)m_pListWnd );
	}
	else;

	if( NULL != m_pListWnd )
	{
		m_pListWnd->SetFocus();
	}
	else;
}


///////////////////////////////////////////////
void CItemDlg::MyMoveWindow( CRect* pRect )
{
	MoveWindow( pRect, FALSE );
	ShowWindow( SW_SHOW );
	/////////////////////
	if( NULL != m_ListInfo.lpOnButton )
	{
		RECT re;
		CRect Rect_Bt;
		m_Button_Item.GetWindowRect( &Rect_Bt );

		re.bottom = pRect->Height() - 4;
		re.top = re.bottom - Rect_Bt.Height();
		re.right = pRect->Width() - 4;
		re.left = re.right - Rect_Bt.Width();

		m_bShowLast = TRUE;
		m_Button_Item.MoveWindow( &re );
		m_Button_Item.SetWindowText( m_ListInfo.strBT );
		m_Button_Item.ShowWindow( SW_SHOW );
		m_Button_Item.GetWindowRect( &m_Rect_Bt );	
	}
	else 
	{
		m_bShowLast = FALSE;
		m_Button_Item.ShowWindow( SW_HIDE );
	}
}

void CItemDlg::MyTextOut( CDC* pDC, int x, int y, LPCTSTR lpszString )
{
	//////设置字体
/*	CFont Font;
	LOGFONT stFont;
	memset( &stFont, 0, sizeof(LOGFONT) );
	stFont.lfHeight = 12;                      // request a 12-pixel-height font
	strcpy( stFont.lfFaceName, "宋体" );        // request a face name "Arial"

	Font.CreateFontIndirect( &stFont );*/
	CFont* pOldFont = pDC->SelectObject( m_pFont );//改变字体
	pDC->TextOut( x, y, lpszString );
	/////////////释放
	pDC->SelectObject( pOldFont );//还原字体
//	Font.DeleteObject();
}

BITMAP CItemDlg::MyShowImage( CDC* pDC, int x, int y, UINT nIDResource )
{
	CBitmap bmp;
	bmp.LoadBitmap( nIDResource );
	BITMAP bmSize;
	bmp.GetObject( sizeof(BITMAP), &bmSize );//取图大小

	CDC dc;
	dc.CreateCompatibleDC( pDC );
	dc.SelectObject( &bmp );//记忆虚设备格式

	//输出
	pDC->BitBlt( x, y, x + bmSize.bmWidth, y + bmSize.bmHeight, &dc, 0, 0, SRCCOPY );

	/////////////释放
	dc.DeleteDC();
	bmp.DeleteObject();	

	return bmSize;
}

BOOL CItemDlg::MySubtractRect( CRect* pRect, LPRECT lpRect )//输出多余区域
{
	BOOL bRet = FALSE;

	if( (0 == m_memRect.left) && (0 == m_memRect.right) )
	{
		m_memRect = *lpRect;
	}
	else
	{
		m_memRect.left = lpRect->left;
		m_memRect.right = lpRect->right;

		bRet = pRect->SubtractRect( lpRect, &m_memRect );
		m_memRect = *lpRect;
	}

	return bRet;
}

////////////////////////
void CItemDlg::RedrawWindow_Focus( BOOL bFocus )
{
	m_bFocus = bFocus;
	this->RedrawWindow( NULL, NULL, RDW_INVALIDATE | RDW_ERASE  );
}

void CItemDlg::RedrawWindowEx( CRect* pRectItem, CRect* pRectList, BOOL bRedraw/*=FALSE*/ )
{
	int y_top = 0, y_bottom = 0;

	if( pRectItem->top < pRectList->top )		y_top = pRectList->top - pRectItem->top;
	if( pRectItem->bottom > pRectList->bottom ) y_bottom = pRectItem->bottom - pRectList->bottom + 4;
	
	/////////////////////
	RECT Rect;
	Rect.left = 0;
	Rect.top = y_top;
	Rect.right = pRectItem->Width();
	Rect.bottom = pRectItem->Height() - y_bottom;

	CRgn wndRgn;
	wndRgn.CreateRectRgn( Rect.left, Rect.top, Rect.right, Rect.bottom );
	SetWindowRgn( (HRGN)wndRgn, FALSE );

	///////////
	MyMoveWindow( pRectItem );

	////////////
	CRect OutRect;
	if( MySubtractRect( &OutRect, &Rect ) )
	{
		if( bRedraw ) 
		{
			this->RedrawWindow( &OutRect, NULL, RDW_INVALIDATE | RDW_ERASE  );
		}
		else;
	}
	else;
}

void CItemDlg::CheckButton( MSG* pMsg )
{
	if( m_Rect_Bt.PtInRect( pMsg->pt ) )
	{
		m_Button_Item.PostMessage( pMsg->message );
	}
	else;

/*	if( (WM_LBUTTONDOWN == pMsg->message) && ( IsCheckButton( pMsg->pt ) ) )
	{
		m_Button_Item.PostMessage( WM_LBUTTONDOWN );
	}
	else;

	if( (WM_LBUTTONUP == pMsg->message) && ( IsCheckButton( pMsg->pt ) ) )
	{
		m_Button_Item.PostMessage( WM_LBUTTONUP );
	}
	else;*/
}

void CItemDlg::ClearmemRect()
{
	m_memRect.bottom = 0;
	m_memRect.left = 0;
	m_memRect.right = 0;
	m_memRect.top = 0;
}

⌨️ 快捷键说明

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