15,979
社区成员
发帖
与我相关
我的任务
分享
void CTerminal::Draw(CDC* pDC, CBrush* pBrush)
{
if (pBrush)
{
pDC->FillRect(m_Rect, pBrush);
}
else
{
pDC->Rectangle(m_Rect);
}
if (m_Text.GetLength() > 0)
{
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(m_Text, &m_Rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
}
另外原来忘了一点东西,修改CMyData添加一个函数:
void SetText(LPCTSTR text);// public
protected:
// 数据,改成保护的,防止外部访问
cpp:
void CMyData::SetText(LPCTSTR text)
{
m_Text = text;
if (m_Selected >=0 && m_Selected < m_Objs.GetSize())
{
m_Objs[m_Selected].setText(text);
}
}
void CMyData::OnLButtonDown(UINT nFlags, CPoint point)
{
for (int i = 0; i < m_Objs.GetSize(); i++)
{
if (PtInRect(m_Objs[i].getRect(), point))
{
m_Selected = i;
SetText(m_Text);
break;
}
}
}
以及对话框类:void CMFCDialogDlg::OnBnClickedRadio(UINT id)
{
// TODO: 在此添加控件通知处理程序代码
CString text;
GetDlgItemText(id, text);
m_MyData.setText(text);
if (m_Canvas )
{
m_Canvas->Invalidate();
}
}
搞定!
最后一个功能,点击矩形文字能添加/去除,给CTerminal类添加两个函数:
Terminal.h
BOOL isEmpty(void);
void Empty(void);
Terminal.cpp:
BOOL CTerminal::isEmpty(void)
{
return m_Text.IsEmpty();
}
void CTerminal::Empty(void)
{
m_Text.Empty();
}
MyData.cppvoid CMyData::OnLButtonDown(UINT nFlags, CPoint point)
{
for (int i = 0; i < m_Objs.GetSize(); i++)
{
if (PtInRect(m_Objs[i].getRect(), point))
{
if (i == m_Selected && !m_Objs[i].isEmpty())
{
m_Objs[i].Empty();
}
else
{
m_Selected = i;
m_Objs[i].setText(m_Text);
}
break;
}
}
}
void CTerminal::Draw(CDC* pDC, CBrush* pBrush)
{
if (pBrush)
{
pDC->FillRect(m_Rect, pBrush);
}
else
{
pDC->Rectangle(m_Rect);
}
pDC->SetTextColor(RGB(0, 0, 0));
if (m_Text.GetLength() > 0)
{
pDC->DrawText(m_Text, &m_Rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
}
// 放置矩形的数组
CArray<CTerminal, CTerminal&> m_Objs;
cppvoid CMyData::OnSize(UINT nType, int cx, int cy)
{
CRect rect;
float width = (float)(cx - m_LeftSpace) / (float)m_Cols - m_Space;
float height = (float)(cy - m_TopSpace) / (float)m_Rows - m_Space;
for (int c = 0; c < m_Cols; c++)
{
for (int r = 0; r < m_Rows; r++)
{
rect.left = c * (width + m_Space) + m_LeftSpace;
rect.top = r * (height + m_Space) + m_TopSpace;
rect.right = rect.left + width;
rect.bottom = rect.top + height;
m_Objs[(r * m_Cols) + c].setRect(rect);
}
}
}
void CMyData::OnLButtonDown(UINT nFlags, CPoint point)
{
for (int i = 0; i < m_Objs.GetSize(); i++)
{
if (PtInRect(m_Objs[i].getRect(), point))
{
m_Selected = i;
break;
}
}
}
void CMyData::OnDraw(CDC* pDC)
{
int bkModeOld = pDC->SetBkMode(TRANSPARENT);
CFont* pFontOld = (CFont*)pDC->SelectStockObject(DEFAULT_GUI_FONT);
CString str;
CRect rect;
COLORREF clrOld = pDC->SetTextColor(RGB(0, 0, 0));
for (int c = 0; c < m_Cols; c++)
{
str.Format(_T("%d"), c + 1);
rect.SetRect(m_Objs[c].getRect()->left, 0, m_Objs[c].getRect()->right, m_Objs[c].getRect()->top);
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(str, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
rect.OffsetRect(1, 1);
pDC->SetTextColor(RGB(255, 255, 255));
pDC->DrawText(str, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
for (int r = 0; r < m_Rows; r++)
{
str.Format(_T("%C"), _T('A') + r);
rect.SetRect(0, m_Objs[m_Cols * r].getRect()->top, m_Objs[m_Cols * r].getRect()->left, m_Objs[m_Cols * r].getRect()->bottom);
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(str, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
rect.OffsetRect(1, 1);
pDC->SetTextColor(RGB(255, 255, 255));
pDC->DrawText(str, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
pDC->SetTextColor(RGB(255, 255, 255));
for(int i = 0; i < m_Objs.GetSize(); i++)
{
m_Objs[i].Draw(pDC, i == m_Selected ? &m_BkgroundBrush : NULL);
}
pDC->SetTextColor(clrOld);
pDC->SetBkMode(bkModeOld);
pDC->SelectObject(pFontOld);
}
#pragma once
#include "afx.h"
class CTerminal :
public CObject
{
public:
CTerminal(void);
~CTerminal(void);
void setRect(LPCRECT lpRect);
LPCRECT getRect(void);
void setText(LPCTSTR text);
LPCTSTR getText(void);
void Draw(CDC* pDC, CBrush* pBrush = NULL);
protected:
CRect m_Rect;
CString m_Text;
};
#include "stdafx.h"
#include "Terminal.h"
CTerminal::CTerminal(void)
{
}
CTerminal::~CTerminal(void)
{
}
void CTerminal::setRect(LPCRECT lpRect)
{
m_Rect.CopyRect(lpRect);
}
LPCRECT CTerminal::getRect(void)
{
return m_Rect;
}
void CTerminal::setText(LPCTSTR text)
{
m_Text = text;
}
LPCTSTR CTerminal::getText(void)
{
return m_Text;
}
void CTerminal::Draw(CDC* pDC, CBrush* pBrush)
{
if (pBrush)
{
pDC->FillRect(m_Rect, pBrush);
}
pDC->SetTextColor(RGB(0, 0, 0));
pDC->Rectangle(m_Rect);
if (m_Text.GetLength() > 0)
{
pDC->DrawText(m_Text, &m_Rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
}