本文介绍如果通过MFC编程实现模拟AutoCAD 在单文本视图窗口任意位置输入文字。
先在VS2017中建一个名为FormatDemo单文档工程,在FormatDemoView.h中声明如下变量:
public:
COLORREF mColor;
UINT linetype;
LOGFONT logfont;
CEdit mEdit;
UINT drawType;
CWnd* pwnd;
BOOL drawTextFlag;
CString str;
CPoint mPoint;
在FormatDemoView。cpp中重写OnInitialUpdate()函数,在函数中生成一个文本框控件,用以实现文字输入:
void CFormatDemoView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: 在此添加专用代码和/或调用基类
mEdit.Create(ES_MULTILINE | WS_CHILD| WS_TABSTOP | WS_BORDER,CRect(0, 0, 0, 0), this, 1234);
}
在菜单中IDR_MAINFRAME菜单中新添加“格式” “绘制“菜单栏,在”格式“,下添加如下子菜单:
在绘制下,添加如下子菜单:
为格式下的”字体“修改”字体“菜单项ID,如下:
为字体“菜单项 添加时间处理程序:
void CFormatDemoView::OnTextFont()
{
// TODO: 在此添加命令处理程序代码
CFontDialog cfdlg;
cfdlg.m_cf.rgbColors = mColor;
if (cfdlg.DoModal() == IDOK)
{
cfdlg.GetCurrentFont(&logfont);
mColor = cfdlg.GetColor();
}
}
修改”绘制“下的子菜单项”单行文字“的ID如下:
为”单行文字“菜单项,添加事件处理代码:
void CFormatDemoView::OnSingleText()
{
// TODO: 在此添加命令处理程序代码
drawType = 4;
}
打开FormatDemoView的属性表:
打开后如下:
在消息列中找到WM_CTLCOLOR,添加OnCtlColor消息处理函数,已实现修改输入编辑框控件文本颜色:
HBRUSH CFormatDemoView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CView::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
if (nCtlColor == CTLCOLOR_EDIT)
{
pDC->SetTextColor(mColor);
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
在FormatDemoView的属性表的消息列中找到WM_LBUTTONDOW, 添加OnLbuttonDown消息处理函数,在函数中实现,指定文字输入位置,叫出文本框控件实现文字输入:
在OnLbuttonDown函数中添加如下代码:
void CFormatDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
switch (drawType)
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
SetCaretPos(point);
ShowCaret();
break;
case 4:
pwnd = GetDlgItem(1234);
if (!drawTextFlag)
{
drawTextFlag = 1;
pwnd->MoveWindow(point.x, point.y, point.x + logfont.lfWidth, point.y + logfont.lfHeight);
pwnd->ShowWindow(SW_SHOW);
pwnd->SetFocus();
mPoint = point;
}
else
{
drawTextFlag = 0;
pwnd->GetWindowTextW(str);
pwnd->SetWindowTextW((LPCTSTR)"");
pwnd->ShowWindow(SW_HIDE);
pwnd->MoveWindow(0, 0, 0, 0);
CFont font;
CFont* defautFont;
font.CreateFontIndirectW(&logfont);
defautFont = dc.SelectObject(&font);
CClientDC dc(this);
dc.SetTextColor(mColor);
dc.TextOut(mPoint.x, mPoint.y, str);
dc.SelectObject(defautFont);
font.DeleteObject();
drawType = 0;
}
break;
}
CView::OnLButtonDown(nFlags, point);
}
验证:
按下面图示,执行程序:
运行起来,如下:
设置字体格式
具体设置 选择,如下:
实现单行文字 输入:
点击单行文字后,点击需要输入的位置,弹出文本输入框,如下:
输入文字”Hello World!”
鼠标左键,单击编辑框外任意位置,即可完成输入,如下: