VC++编写文本编辑器中的部分问题.

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++编写文本编辑器中的部分问题.相关的知识,希望对你有一定的参考价值。

我的编程设计是文本编辑器,现在遇到困难了.
我想它能自由输入信息,包括回车,只有当遇到结束标志符才会退出运行.
请各位大虾不吝赐教.最好就是有例子和解释!

每个版本的Microsoft Visual C++ 向导都有轻微的改进,在你集中精力使用某个向导的过程中,设置应用程序时遗漏某些东西也是件毫不奇怪的事情。
本节研究单文档应用程序枣或许你已经用它编写过某个小型的文本编辑器或其它轻型、通用的文档编辑器。本例中,我们将创建一个丰富格式文本编辑器,它不需要做多少工作就可以很好地编辑文本了。在本书后续章节中,我们将给这个程序增加新的功能,使其更加有实用价值。

开始这个工程时,使用File|New显示New对话框,选择MFC AppWizard(EXE)工程类型,在Project Name域键入应用名称,示例应用中使用Sng1_Doc作为应用程序名称,但你也可以使用与此相似的任何名称。单击OK,系统显示MFCAppWizard - Step 1对话框,选择Single Document选项,然后单击Next。系统显示如下图所示的MFC AppWizard - Step 2 of 6对话框。
这是需要你做出决策的第一个位置。如果你想在应用程序中增加对数据库的支持,那么需要决定在MFC AppWizard中得到哪个层次的支持,在本书的第二部分我们将花些时间详细讨论这个问题,因此这里我就不多讲了。单击Next,你会看到如下图所示的Step 3对话框。

这个对话框的上半部决定了要在应用程序中添加哪个层次的OLE支持。添加的支持越多,应用程序也就越大。最基本的OLE支持层次是用做容器(Container)。容器既可以作为客户,又可以存储链接对象和嵌入对象。下一个OLE支持层次是Mini-server(小型服务器),它允许创建复合文档,小型服务器不能独立工作。另外,它只能操作嵌入对象。作为服务器使用时,全功能服务器(Full-Server)确实具备了OLE的全部功能,但它却不能作为容器使用。这样的应用程序用起来与Microsoft Paint(画图)十分相似,你可以把MicrosoftPaint文档嵌入或链接到你的应用程序中,但Microsoft Paint本身不能存储其它入或链接到你的应用程序中,但Microsoft Paint本身不能存储其它应用程序创建的对象。最后,Both Container and Server选项让你的应用程序具备本地OLE支持的所有功能。你既可以把应用程序用做OLE服务器,也可以将它用做OLE客户。但是,这种应用程序不能用做Internet浏览器枣原因在于它没有设计成ActiveX Document服务器。
注意在最后一个单选钮(Both Container and Server)的下方有两个复选框,如果选中第一个复选框,Visual C++还将增加使你的应用程序用做ActiveXDocument Server(ActiveX文档服务器)所需的支持。Active Document Server能够创建和管理ActiveX文档。第二个复选框是Active Document Container,它允许你的应用程序在其框架内包含ActiveX文档。本质上说,它允许你在应用程序中嵌入像Microsoft Word或Excel这样的应用程序生成的文档。现在,我们选择Both Container and Server选项并选中Active Document Server复选框,在第11章中我们将探讨这项选择的细节。
在Step 3对话框中还有另外两个重要的复选框。第一个是Automation,对大型应用程序来说通常要选中这个复选框。Automation允许你操作其它应用程序创建的对象,也允许自动化(Automation)客户端操作你的应用程序创建的对象。从现在开始,也可以把自动化看成是一种可编程能力,虽然这种说法不甚精确(自动化的完整定义相当长,需要放开讲才能说清楚枣在本书的后续章节中我们将讨论这个问题)。

第二个选项是ActiveX Control。如果在应用程序中要使用任何OCX控件(无论OCX控件是否设计成ActiveX控件),那么都必须选中这个复选框。确实选中ActiveX Control和Automation复选框,然后单击Next,系统显示如下图所示的Step 4对话框。
该对话框的上半部分用于选择应用程序中要包含的界面元素的类型。正常情况下,保留Visual C++的缺省设置,这样的设置将创建标准的应用程序。如果想为用户提供上下文相关帮助,那么选中Context-Sensitive Help复选框。在第15章中我们将介绍向应用程序中添加上下文相关帮助的方法。
这个对话框中下面的两个选项让你在应用程序中添加通讯支持功能。第一个选项专门用于电子邮件,选中这个选项后应用程序可以发送和接收电子邮件(只要电子邮件应用程序与MAPI兼容)。第二个选项让应用程序通过TCP/IP网络进行通讯。如果要在你的应用程序中添加Internet支持功能,那么选中这个复选框。
Visual C++包含的新特性让你能够选择工具条的外观。我们既可以选择Nor-mal使用标准C++工具条的外观,也可以选择Internet Explorer提供的新外观。使用Internet Explorer ReBars选项有两个好处:我们既可以在工具条上添加任何Windows控件(并不仅限于菜单命令),也可以像命令条那样“漂浮”ReBars。
剩下的两个选项是最近使用文件列表中列出的文件个数和一个标题为Ad-vanced的神秘按钮。正常情况下,我把最近使用文件列表中列出的文件个数设置为尽可能大的值,原因在于我经常要操作许多文档。在这里给用户提供最大的灵活性并不影响应用程序的大小和速度,因此,将其设置为尽可能大的值并不是什么大是大非的问题。
现在让我们看一看Advanced按钮。单击这个按钮,系统显示如下图所示的Advanced Options对话框,这个对话框是设置文档参数的地方,也是选择用户使用时显示在标题条中文本这类设置的地方。在标题条中也将显示当前文档的名称。

按上图所示设置Advanced Options对话框。完成后的应用程序使用扩展名为XYZ的文件,应用程序的标题为“Single Document Example”,每次显示FileOpen或File Save对话框时,过滤器域显示为“XYZ Single DocumentFile(*.xyz)”。最后,当显示该应用程序创建的文档的属性对话框时,对话框将显示该文档的类型为“XYZ Single Document ”。单击Close按钮接受上述设置,单击两次Next,系统显示如下图所示的Step 6对话框。

这是我要向你介绍技巧的另一个地方。如果你没有真正留意的话,就有可能遗漏在文档视图类中可以使用你喜爱的任何基类这一事实。为什么说要重点考虑基类的选择呢?如果接受了Visual C++的缺省设置,那么应用程序对文档的任何操作你都必须编写代码。当你要创建一种全新的文档时,上述设置并没有任何不妥,但绝大多数应用程序并非要创建一种全新的文档,而是建立一个与其它应用程序相似、并提供其它应用程序所缺乏特性的应用程序。本例中,我们要创建一个文本编辑器,因此没有必要使用CView(应用程序的缺省基类).选择CEditView或CRichEditView类作为应用程序的基类将省去许多工作,原因在于该应用程序一经设计就已经知道作为简单的字处理程序应该如何完成任务。你甚至不需要添加任何代码就能得到上述功能。
为了展示基类的作用,在示例程序中我们选择CRichEditView作为CSng1_DocView类的基类。单击Finish按钮完成设置。当看到New ProjectInformation对话框时,单击OK,Visual C++为你创建该示例应用程序。
现在生成应用程序并启动运行。你会看到可以在应用程序中输入文本并将其保存到XYZ文档中。添加一些代码后,该应用程序就可以读取其它文本和RTF文档。当然,也可以以其它方式扩展这个应用程序。例如,由于该应用程序使用了富文本编辑控件,因此可以为其增加文本格式化功能和颜色功能。我们已经添加的OLE能力意味着需要时可以在文档中插入图像。已经完成的应用程序只做了很少的工作就具备了许多潜在的功能。
或许现在你还没有注意到,这个特殊的示例程序并没有要你编写一行代码。最终的程序相当完美,是C程序员不敢想像的。图2.4展示了到现在为止这个应用程序的显示结果,随着本书的展开,我们将进一步改进这个应用程序。
参考技术A 建一个单文档程序,基类设为CEditView就行了

vc 设置编辑框的颜色???

现在有两个文本编辑框
ID号为IDC_NUM1 , IDC_NUM2
关联的变量是m_num1 , m_num2 。变量类型为 Cstring
我想让
当m_num1为“pass”时 这个编辑框的颜色为绿色,为“fail”时编辑框的颜色为红色
m_num2也是一样的
谁能帮帮我啊
写些代码什么的
帮帮我啊

这是改变IDC_NUM1 编辑框背景色的例子,另外一个你自己弄吧:
HBRUSH CDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
if(nCtlColor==CTLCOLOR_EDIT)

LONG wndID=::GetWindowLong(pWnd->GetSafeHwnd(),GWL_ID);//获取窗口ID if(wndID==IDC_NUM1) CString EditBoxTxt; pWnd->GetWindowText(EditBoxTxt); if(EditBoxTxt==“pass") pDC->SetBkMode(TRANSPARENT);//设置文字背景透明(注意区分文字背景和窗口背景)
pDC->SetBkColor(BkColor); //设置文字背景,如果设置文字背景透明则这一句不起作用
pWnd->GetClientRect(rcClientRect);
CBrush br1(BkColor);//这里BkColor就是编辑框背景色,我在别的地方定义了BkColor并设置这
//个值
pDC->FillRect(rcClientRect,&br1);//通过填充的方式改变编辑框背景色

// TODO: Return a different brush if the default is not desired
return hbr;
追问

HBRUSH CDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
这个写
在哪里呢??

追答

这是对话框的消息函数,按照添加对话框消息函数的方法添加就是了。

追问

我添加了wm_color后

我的程序原来对的地方报错是怎么回事啊??

我是一个关于串口通信的程序,对串口上接收缓存有东西的话是实时接收的

加了之后下面这段报错

 

BEGIN_EVENTSINK_MAP(CMmDlg, CDialog)

//AFX_EVENTSINK_MAP(CComaDlg)

ON_EVENT(CMmDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnComm, VTS_NONE)

//AFX_EVENTSINK_MAP

END_EVENTSINK_MAP()

追答

怎么可能,你是用向导添加的吗?向导添加不可能有问题的。

追问

我的串口通信的这段代码
BEGIN_EVENTSINK_MAP(CMmDlg, CDialog)
//AFX_EVENTSINK_MAP(CComaDlg)
ON_EVENT(CMmDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnComm, VTS_NONE)
//AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
是手工添加的

追答

你既然添加了,为什么没有看见消息映射,而且应该加的是WM_CTLCOLOR消息消息响应函数,用向导添加,不用手动添加

追问

WM_CTLCOLOR我是想到添加的

我串口通信的这段代码

是手工添加的

追答

我添加后会有消息映射如下:
BEGIN_MESSAGE_MAP(CDlgDlg, CDialog)
//AFX_MSG_MAP(CDlgDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_SelColor, OnSelColor)
//AFX_MSG_MAP
END_MESSAGE_MAP()
其中 ON_WM_CTLCOLOR()就是我用向导添加的消息映射
可你的没有呀

追问

也是有的啊

我那个报错的是串口通信的 事件

追答

这是两个不相干的事情呀,用向导添加一个消息函数怎么会影响到串口部分?

参考技术A 添加OnCtlColor方法,大体实现:
HBRUSH CDLLinjectDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

//HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
HBRUSH m_brMine;
m_brMine = ::CreateSolidBrush(RGB(0,0,0));
// TODO: Change any attributes of the DC here
if (nCtlColor==CTLCOLOR_EDIT&&m_m_num1==“pass”)


pDC->SetBkColor(RGB(0,0,0));//背景颜色值
pDC->SetTextColor(RGB(255,0,0));//文本颜色值
pDC->SetBkMode(TRANSPARENT);
return m_brMine;

// TODO: Return a different brush if the default is not desired
return m_brMine;

如果不能实时变,估计还得用定时器,你先试试吧,不行再Hi我追问

我hi你了~

追答

什么问题?不行吗?

以上是关于VC++编写文本编辑器中的部分问题.的主要内容,如果未能解决你的问题,请参考以下文章

用VC写了一个文本编辑器,怎样将输入里面的关键字变色实现高亮状态,就像在VC里面写代码输入C++关键字那样

vc文本编辑器

求用vc++做一个文本编辑器的详细步骤,要求具有打开,保存,另存为等基本功能

用VC++实现一个简单文本编辑器

求问怎么用VC++设计一个文本文件编辑器应具备打开、存盘、另存为等功能

用VC++MFC做文本编辑器(单文档模式)