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

📄 mainfrm.cpp

📁 在mfc环境下实现的绘图板程序
💻 CPP
字号:
// MainFrm.cpp : CMainFrame 类的实现
//

#include "stdafx.h"
#include "ImageEditor.h"
#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	ON_WM_CREATE()
	ON_NOTIFY(NM_CUSTOMDRAW,IDW_COMBO, OnNMCustomDraw)
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // 状态行指示器
	ID_SEPARATOR,           // 鼠标位置
	ID_SEPARATOR,           // 缩放比例
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};
static UINT BASED_CODE palette_all[] =
{
	// same order as in the bitmap 'toolbar.bmp'
	ID_EDIT_UNDO,
	ID_EDIT_REDO,
	ID_EDIT_SELECT,
	ID_EDIT_RANDSELECT,
	ID_EDIT_ERASER,
	ID_EDIT_FILL,
	ID_EDIT_PICK_COLOR,    
	ID_EDIT_ZOOM,             
	ID_EDIT_PEN,                   
	ID_EDIT_BRUSH,                   
	ID_EDIT_SPRAY,                   
	ID_EDIT_TEXT,                    
	ID_EDIT_LINE,                    
	ID_EDIT_CURVE,                   
	ID_EDIT_RECTANGLE,
	ID_EDIT_POLYGON,              
	ID_EDIT_ELLIPSE,                
	ID_EDIT_ROUND_RECT,
	ID_SEPARATOR,      //18     // for combo box (placeholder)
	ID_SEPARATOR,		//19
	ID_SEPARATOR
};

static UINT BASED_CODE palette[] =
{
	// same order as in the bitmap 'toolbar.bmp'
	ID_EDIT_UNDO,
	ID_EDIT_REDO,
	ID_EDIT_SELECT,
	ID_EDIT_ERASER,
	ID_EDIT_ZOOM,             
	ID_EDIT_PEN,                   
	ID_EDIT_BRUSH,                   
	ID_EDIT_TEXT,                    
	ID_EDIT_LINE,                    
	ID_EDIT_RECTANGLE,
	ID_EDIT_ELLIPSE,                
	ID_EDIT_ROUND_RECT,
	ID_SEPARATOR,          // for combo box (placeholder)
	ID_SEPARATOR,
	ID_SEPARATOR,
	ID_SEPARATOR,
	ID_SEPARATOR,
	ID_SEPARATOR,
	ID_SEPARATOR,
	ID_SEPARATOR
};
// CMainFrame 构造/析构

CMainFrame::CMainFrame()
{
	m_indexPenStyle = 0 ;
	m_indexLineStyle = 0;
	m_indexShapeStyle = 0;
	m_indexZoom = 0;
	m_ftList.CreatePointFont(90,_T("宋体"));
	m_ctlImage.Create(32,16,ILC_MASK,0,1);
}

CMainFrame::~CMainFrame()
{
}


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;	

	if (!CreateToolPaletteBar())
		return -1;

	if (!CreateColorPaletteBar())
		return -1;

	if (!CreateStatusBar())
		return -1;

	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolPaletteBar);
	DockControlBar(&m_wndColorBar);
	return 0;
}

BOOL CMainFrame::CreateToolPaletteBar()
{
	if (!m_wndToolPaletteBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_FIXED |
		CBRS_LEFT | CBRS_TOOLTIPS, ID_PALETTEBAR) ||
		!m_wndToolPaletteBar.LoadBitmap(IDB_TOOL_PALETTE) ||
		!m_wndToolPaletteBar.SetButtons(palette,
		  sizeof(palette)/sizeof(UINT)))
	{
		TRACE0("Failed to create m_wndToolPaletteBar\n");
		return FALSE;       
	}

	m_wndToolPaletteBar.SetWindowText(_T("工具箱"));
	m_wndToolPaletteBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndToolPaletteBar.SetColumns(2);

	// 创建下拉选择框
	CRect rect, rcClient;
	m_wndToolPaletteBar.GetClientRect(rcClient);
	m_wndToolPaletteBar.GetItemRect(11, &rect); //根据最后一个按钮位置确定
	rect.left = 0;
	rect.top = rect.bottom +5;
	rect.bottom = rect.top+100;
	//if (!m_wndToolPaletteBar.m_comboBox.Create(
	//		CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP,
	//		rect, &m_wndToolPaletteBar, IDW_COMBO))
	//{
	//	TRACE0("Failed to create combo-box\n");
	//	return FALSE;
	//}
	//m_wndToolPaletteBar.m_comboBox.SetFont(&m_wndToolPaletteBar.m_font);	
	CListCtrl* pListCtrl =  &m_wndToolPaletteBar.m_listStyle;
	if (!pListCtrl->Create(
		 WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_NOCOLUMNHEADER,
		 rect, &m_wndToolPaletteBar, IDW_COMBO))
	{
		TRACE0("Failed to create combo-box\n");
		return FALSE;
	}	
	pListCtrl->SetExtendedStyle(LVS_EX_FULLROWSELECT);
	pListCtrl->SetBkColor(::GetSysColor(COLOR_BTNFACE));
	pListCtrl->SetImageList(&m_ctlImage, LVSIL_SMALL);
	pListCtrl->InsertColumn(0,_T("样式"),LVCFMT_CENTER,40);	

	return TRUE;
}

BOOL CMainFrame::CreateColorPaletteBar()
{
	if (!m_wndColorBar.Create(this, IDD_COLOR_SET,
		CBRS_BOTTOM|CBRS_TOOLTIPS|CBRS_FLYBY, IDD_COLOR_SET))
	{
		TRACE0("Failed to create m_wndColorBar\n");
		return -1;      
	}

	m_wndColorBar.SetWindowText(_T("颜料盒"));
	m_wndColorBar.EnableDocking(CBRS_ALIGN_ANY);
	return TRUE;
}


BOOL CMainFrame::CreateStatusBar()
{
	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("未能创建状态栏\n");
		return FALSE;     
	}
	m_wndStatusBar.SetPaneInfo(1, ID_SEPARATOR, SBPS_NORMAL, 150);
	m_wndStatusBar.SetPaneInfo(2, ID_SEPARATOR, SBPS_NORMAL, 100);
	m_wndStatusBar.SetPaneText(2,_T(" 缩放 100%"));
	return TRUE;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: 在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式

	return TRUE;
}

void CMainFrame::ShowMousePos(CPoint pt)
{
	float x = pt.x/1000.0;
	float y = pt.y/1000.0;
	CString strPos;
	strPos.Format(_T(" X: %.2fcm, Y: %.2fcm"), x,y);
	this->m_wndStatusBar.SetPaneText(1,strPos);
}
void CMainFrame::ShowZoomInfo(float fZoom)
{
	int nScale = fZoom*100;
	CString strInfo;
	strInfo.Format(_T(" 缩放 %d%%"), nScale);			
	this->m_wndStatusBar.SetPaneText(2,strInfo);
}
void CMainFrame::OnChangeTool(UINT index)
{	
	CListCtrl* pListCtrl =  &m_wndToolPaletteBar.m_listStyle;
	pListCtrl->DeleteAllItems();
	m_ctlImage.DeleteImageList();
	m_ctlImage.Create(16,16,ILC_MASK,0,1);
	LVITEM lvi;
	switch (index)
	{
	case ID_EDIT_ZOOM:
		{
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_ZOOM1));
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_ZOOM2));
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_ZOOM3));
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_ZOOM4));
			pListCtrl->InsertItem(0,_T(""),0);
			pListCtrl->InsertItem(1,_T(""),1);
			pListCtrl->InsertItem(2,_T(""),2);
			pListCtrl->InsertItem(3,_T(""),3);
			//lvi.iItem = m_indexZoom;
			break;
		}
	case ID_EDIT_BRUSH:
	case ID_EDIT_ERASER:
		{
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_BRUSH1));
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_BRUSH2));
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_BRUSH3));
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_BRUSH4));
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_BRUSH5));
			pListCtrl->InsertItem(0,_T(""),0);
			pListCtrl->InsertItem(1,_T(""),1);
			pListCtrl->InsertItem(2,_T(""),2);
			pListCtrl->InsertItem(3,_T(""),3);
			pListCtrl->InsertItem(4,_T(""),4);
			//lvi.iItem = m_indexPenStyle;
			break;
		}
	case ID_EDIT_LINE:
		{
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_LINE1));
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_LINE2));
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_LINE3));
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_LINE4));
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_LINE5));
			pListCtrl->InsertItem(0,_T(""),0);
			pListCtrl->InsertItem(1,_T(""),1);
			pListCtrl->InsertItem(2,_T(""),2);
			pListCtrl->InsertItem(3,_T(""),3);
			pListCtrl->InsertItem(4,_T(""),4);
			//lvi.iItem = m_indexLineStyle;
			break;
		}
	case ID_EDIT_RECTANGLE:
	case ID_EDIT_POLYGON:
	case ID_EDIT_ELLIPSE:
	case ID_EDIT_ROUND_RECT:
		{
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_SHAPE1));//边框
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_SHAPE2));//填充
			m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_SHAPE3));//无边框
			pListCtrl->InsertItem(0,_T(""),0);
			pListCtrl->InsertItem(1,_T(""),1);
			pListCtrl->InsertItem(2,_T(""),2);
			//lvi.iItem = m_indexShapeStyle;
			break;
		}
	default:
		return;
		break;
	}
	//pListCtrl->GetItem(&lvi);
	//lvi.state |= (CDIS_FOCUS | CDIS_SELECTED);
	//pListCtrl->SetItem(&lvi);
	////CRect rectItem;
	////pListCtrl->GetItemRect(lvi.iItem,&rectItem, LVIR_BOUNDS);
	////CClientDC dc(pListCtrl);	
	////dc.PatBlt(rectItem.left,rectItem.top,rectItem.Width(),rectItem.Height(),PATINVERT);
	
}
// CMainFrame 诊断

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG


// CMainFrame 消息处理程序
void CMainFrame::OnNMCustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLVCUSTOMDRAW  pLVCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);


	CRect rectRow, rectList;
	CListCtrl* pListCtrl =  &m_wndToolPaletteBar.m_listStyle;
	pListCtrl->GetWindowRect(&rectList);
	ScreenToClient(&rectList);
	pListCtrl->GetItemRect(0, &rectRow, LVIR_BOUNDS);
	int iItemHeight = rectRow.Height();
	int iItemTop = rectRow.top ;
	::SelectObject(pLVCD->nmcd.hdc, m_ftList);
	switch (pLVCD->nmcd.dwDrawStage)
	{

	case CDDS_PREPAINT:
		*pResult = CDRF_NOTIFYITEMDRAW;
		break;
	case CDDS_ITEMPREPAINT:
		*pResult = CDRF_NOTIFYSUBITEMDRAW;
		break;
	case (CDDS_ITEMPREPAINT | CDDS_SUBITEM):
		{
			
			int iCol = pLVCD->iSubItem ;
			int iRow = (int)pLVCD->nmcd.dwItemSpec;
			CRect rectItem(pLVCD->nmcd.rc), rectIcon;

			//计算每个子项的矩形
			rectItem.top = iItemTop + iRow * iItemHeight;
			rectItem.bottom = rectItem.top + iItemHeight;
			rectItem.left +=3;
			rectItem.right -=3;

			if (iRow == 0)
				rectItem.top +=3;
			CDC *pDC = CDC::FromHandle(pLVCD->nmcd.hdc);			

			LOGFONT lf;
			::ZeroMemory(&lf, sizeof(lf));
			pDC->GetCurrentFont()->GetLogFont(&lf);

			//获得第图标所在的矩形
			pListCtrl->GetSubItemRect(iRow,0, LVIR_ICON, rectIcon);
			const COLORREF clrBlack = RGB(0,0,0);
			const COLORREF clrWhite = RGB(255,255,255);
			if ((pLVCD->nmcd.uItemState & (CDIS_FOCUS | CDIS_SELECTED)) == (CDIS_FOCUS | CDIS_SELECTED))
			{

				//pDC->SetTextColor(clrWhite);
				//pDC->TextOut(rectItem.left + rectIcon.Width() + 8, (iRow == 0?(rectItem.top - 3):rectItem.top) + (iItemHeight - abs(lf.lfHeight))/2, pListCtrl->GetItemText(iRow, iCol), (int)_tcslen(pListCtrl->GetItemText(iRow, iCol)));					
				//pDC->SetTextColor(clrBlack);	
				::DrawIconEx(*pDC,rectIcon.left, rectIcon.top + (iItemHeight - 16) / 2,m_ctlImage.ExtractIcon(iRow),32,16,NULL,NULL,DI_NORMAL);								
				pDC->PatBlt(rectItem.left,rectItem.top,rectItem.Width(),rectItem.Height(),PATINVERT);
			}
			else
			{
				pDC->FillSolidRect(&rectItem, ::GetSysColor(COLOR_BTNFACE));
				//pDC->TextOut(rectItem.left + rectIcon.Width() + 8, (iRow == 0?(rectItem.top - 3):rectItem.top) + (iItemHeight - abs(lf.lfHeight))/2, pListCtrl->GetItemText(iRow, iCol), (int)_tcslen(pListCtrl->GetItemText(iRow, iCol)));
				::DrawIconEx(*pDC,rectIcon.left, rectIcon.top + (iItemHeight - 16) / 2, m_ctlImage.ExtractIcon(iRow),32,16,NULL,NULL,DI_NORMAL);
			}
			*pResult = CDRF_SKIPDEFAULT;
			break;
		}
	default:
		*pResult = CDRF_SKIPDEFAULT;
		break;
	}	

}




⌨️ 快捷键说明

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