MFC模拟AutoCAD 在单文本视图窗口任意位置输入文字

MFC模拟AutoCAD 在单文本视图窗口任意位置输入文字,第1张

MFC模拟AutoCAD 在单文本视图窗口任意位置输入文字

本文介绍如果通过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);
}

验证:

按下面图示,执行程序:

 运行起来,如下:

 设置字体格式

具体设置 选择,如下:

实现单行文字 输入:

点击单行文字后,点击需要输入的位置,d出文本输入框,如下:

 

 输入文字”Hello World!”

 

 鼠标左键,单击编辑框外任意位置,即可完成输入,如下:

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5698960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存