📄 mainfrm.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 + -