第三章 C语言编辑器设计与实现.docx

上传人:b****6 文档编号:6168692 上传时间:2023-01-04 格式:DOCX 页数:18 大小:468.59KB
下载 相关 举报
第三章 C语言编辑器设计与实现.docx_第1页
第1页 / 共18页
第三章 C语言编辑器设计与实现.docx_第2页
第2页 / 共18页
第三章 C语言编辑器设计与实现.docx_第3页
第3页 / 共18页
第三章 C语言编辑器设计与实现.docx_第4页
第4页 / 共18页
第三章 C语言编辑器设计与实现.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

第三章 C语言编辑器设计与实现.docx

《第三章 C语言编辑器设计与实现.docx》由会员分享,可在线阅读,更多相关《第三章 C语言编辑器设计与实现.docx(18页珍藏版)》请在冰豆网上搜索。

第三章 C语言编辑器设计与实现.docx

第三章C语言编辑器设计与实现

第三章单文档应用程序

在本学习情境中主要学习:

(1)CEditView的使用

(2)TC环境配置与TCC的使用

(3)文件的读写操作

(4)顶层菜单、快捷菜单和图标区菜单的使用

(5)工具栏、状态栏的使用

3.2C语言编辑器设计与实现

3.2.1C语言编辑器框架生成

在标准的SDI应用程序向导中,CXXXView类的基类是CView类,在设计C语言编辑器中可以将基类修改为CEditView,如图所示。

图新建CEditPad工程

图选择单文档应用程序框架

图修改CCEditPadView类的基类为CEditView

单击Finish按钮,完成工程的创建。

编译、运行程序,如图所示。

图程序运行结果

在工程的ResourceView中,可以将程序的图标换掉,默认情况下如图所示。

图工程默认图标

(1)将想要更换的图标拷贝到工程res文件夹中,删除掉原来的NotePad.ico文件,将自己的ICON图标命名为CEditPad.ico即可。

(2)或者使用Import菜单,将想要更换的图标导入到工程中,如图所示。

删除原来的IDR_MAINFRAME图标,将自己的图标命名为IDR_MAINFRAME即可。

图导入工程图标

3.2.2程序菜单设计

菜单是windows应用程序中非常重要的人机界面,是用户与应用程序之间进行交流的主要方式之一,也是用户界面对象中的一个最重要的对象。

菜单是一系列命令的列表,用户能够选中其中的菜单命令并执行相应任务。

仍然使用我们前面生成的NotePad程序,编辑由AppWizard自动生成的菜单资源。

要编辑菜单资源:

(1)选择项目工作区的ResourceView标签,切换到资源视图。

(2)选择菜单资源类型。

(3)选定菜单资源IDR_MAINFRAME,双击该项或单击鼠标右键然后在弹出菜单中选择Open选项。

VisualStudio将弹出菜单编辑窗口,显示菜单资源IDR_MAINFRAME,其中IDR_MAINFRAME是由AppWizard在创建该程序时自动生成的。

图显示工程菜单资源

(4)要删除某个菜单项或弹出菜单,可用鼠标单击该菜单或用上下光标键来回选择,然后按Del键删除。

(5)要插入新菜单项,可选定窗口中的空白菜单框后按回车(或直接用鼠标双击该空白框),VisualStudio弹出Properties(属性)对话框。

属性对话框用于输入菜单项的标题、标识符、菜单项在状态栏上显示的提示(Prompt),并为该菜单提供属性调整。

也可以在选择一个已有的菜单项时按Ins键,以在该菜单项上方插入一个空白菜单项,然后双击该菜单项进行编辑。

要插入一个分隔线,只需将菜单项的Seperator属性打开即可,如图所示。

图增加一个分割线

双击空白框,VisualStudio弹出菜单Properties对话框,在ID的下拉列表中选择ID_EDIT_FIND,即将该菜单绑定到ID_EDIT_FIND,即可实现查找功能。

图增加一个查找菜单

图增加替换菜单

图增加全选菜单

图增加时间/日期菜单

为了能够实现编辑区的代码编译链接,增加一个程序的顶层菜单,并增加一个编译链接的子菜单,如图所示。

图增加一个程序顶层菜单

图增加编译链接子菜单

在CCEditPadView类中为编译链接菜单增加消息映射函数OnComplie,如图所示。

图增加菜单Command映射函数

图CCEditPadView类函数列表

3.2.3程序框架实现

为了模仿VC的输出框,引用开源的SIZECBAR类。

首先将类的头文件和源文件拷贝到工程文件夹中,如图所示。

图将文件拷贝到工程文件夹中

将文件添加到工程中,如图所示。

图AddFilestoProjects

图InsertFilesintoProject

图增加ID_WNDOUTBAR的StringTable

在CMainFrame类中增加编译输出条,首先在类中增加mybar类头文件和定义对象m_CtrlBar,然后在类的OnCreate函数中将其创建出来,如图所示。

图包含头文件并增加对象

图产生m_CtrlBar对象

//产生程序的输出窗口

if(!

m_CtrlBar.Create("程序输出",this,CSize(100,100),TRUE,ID_WNDOUTBAR))

{

TRACE0("Failedtocreateoutbar\n");

return-1;//failtocreate

}

m_CtrlBar.SetBarStyle(m_CtrlBar.GetBarStyle()|

CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);

m_CtrlBar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_CtrlBar,AFX_IDW_DOCKBAR_BOTTOM);

在mybar类中增加用于接收输出的编辑框对象m_wndOutPut,并定义其UID,如图所示。

图定义m_wndOutPut对象和UID

在mybar类的OnCreate函数中生成对象,并在OnSize函数中设置其大小,如图所示。

图生成m_wndOutPut对象

//创建程序的输出窗口

if(!

m_wndOutPut.Create(WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_WANTRETURN,CRect(0,0,0,0),this,ID_EDITCTRL))

{

TRACE0("FailedtocreateOutPutwindow\n");

return-1;//failtocreate

}

图设置编辑框大小

//设置编辑框的大小与myBar窗口大小一致

CRectrc;

GetClientRect(&rc);

m_wndOutPut.MoveWindow(&rc);

运行结果如图所示。

图程序运行结果

3.2.4TC环境配置与TCC使用

为了能够正常使用TC中的文件,需要在系统环境变量path中将TC的配置文件加入。

右键单击我的电脑->选择属性菜单,选择高级选项卡,单击环境变量按钮,在系统变量和用户变量中的Path变量后面加上TC的路径:

c:

\tc;c:

\tc\include;c:

\tc\lib,如图所示。

图加入环境变量

广义的编译器,包括了代码编译器(compiler),目标文件链接器(linker),库文件管理工具(如tc的tlib,gcc的ar)。

对于一个广义的编译器来说以下几个部分是必备的:

piler,2.linker,3.系统提供的头文件和库文件。

狭义的编译器,则仅指compiler。

compiler只负责将源代码,即.c/.cxx/.cpp文件编译成为目标文件.o/.obj。

编译过程的输入是源文件,包括自己书写的.c和.h以及系统提供的.h文件,编译的输出是目标文件。

需要强调的一点是,在compile阶段,只处理源文件,所以不需要库文件和额外的目标文件的参与,因此,只要代码在语法上没有错误,compile就一定能产生目标文件。

在编译器里,有一些默认的规定,我们需要了解。

在编译器中,bin目录用于存放compiler、linker等工具,include目录用于存放头文件,lib目录用存放库文件,大多数的编译器的目录就是按这个来组织的。

在TC文件夹中TCC.EXE是C语言的编译器,可以将代码编译为目标文件,并且能自动调用tlink链接生成可执行文件,以编译c:

\hello.c为例介绍TCC使用方法,如下所示。

(1)在运行菜单中输入cmd,调出Dos窗口,如图所示。

图Dos窗口

(2)在DOS窗口中输入c:

\tc\tccc:

\hello.c>c:

\tmp.txt,如图所示。

图输入命令

>c:

\tmp.txt代表将TCC的编译结果输出到c:

\tmp.txt中,如图所示。

图TCC编译结果

3.2.5程序代码实现

为了保存打开对话框中的文件名称,在CXXXDOC类中增加一个CString型的变量NamePath,如图所示。

图增加NamePath变量

使用ClassWizard重载OnOpenDocument函数,如图所示。

图重载OnOpenDocument函数

单击EditCode按钮,并编写相关代码,如图所示。

图文件名称保存到NamePath变量

在CXXXView类中增加一个CString类型变量BinPath,用来保存TC的路径,并在CXXXView类的构造函数中将其初始化,如图所示。

图定义BinPath变量

图初始化BinPath变量

编写CXXXView类的OnCompile函数,如下所示。

voidCCEditPadView:

:

OnCompile()

{

//调用工程文件夹中的TCC命令来对程序进行编译

//定义命令字符串和文件字符串

CStringTccStr,NameStr;

//定义CreateProcess函数的命令字符数组,然后清零

charCmdStr[200];

memset(CmdStr,0,200);

TccStr=BinPath+"TCC.exe";

//得到文档中打开文件的路径和名称,>c:

\\tmp.txt代表将结果临时保存到c:

\tmp.txt

CCEditPadDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

NameStr=pDoc->NamePath+">c:

\\tmp.txt";

//合并字符串

NameStr=TccStr+NameStr;

//将合并后的字符串拷贝到CmdStr中

strcpy(CmdStr,NameStr);

//使用ShellExecute,问题在于无法控制是否结束

//:

:

ShellExecute(this->m_hWnd,"open",TccStr,NameStr,"",SW_SHOW);

//考虑使用CreateProcess或者ShellExecuteEx

STARTUPINFOsi;

PROCESS_INFORMATIONpi;

ZeroMemory(&si,sizeof(si));

si.cb=sizeof(si);

ZeroMemory(&pi,sizeof(pi));

//创建TCC的执行进程

if(!

CreateProcess(NULL,CmdStr,NULL,NULL,0,0,NULL,NULL,&si,&pi))

{

TRACE0("FailedtocreateTccProcess\n");

return;//failtocreate

}

//等待TCC进程结束信号再关闭进程

WaitForSingleObject(pi.hProcess,INFINITE);

CloseHandle(pi.hProcess);

CloseHandle(pi.hThread);

//将TCC编译出来的结果写入到程序的输出框里

CFiletheFile;

chartheFileText[65535];

memset(theFileText,0,65535);

char*szFileName="c:

\\tmp.txt";

BOOLbOpenOK;

CFileStatusstatus;

//如果该文件已经存在

if(CFile:

:

GetStatus(szFileName,status))

{

//打开文件将结果读取到theFileText中

bOpenOK=theFile.Open(szFileName,CFile:

:

modeReadWrite);

theFile.Read(theFileText,65535);

theFile.Close();

//得到框架指针

CMainFrame*pFrame=(CMainFrame*)GetParentFrame();

:

:

SetWindowText(pFrame->m_CtrlBar.m_wndOutPut.m_hWnd,theFileText);

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 法语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1