做一个文本编译器的界面怎么做
㈠ 用汇编语言编程设计一个简单的文本编辑器界面,显示文本文件的建立、编辑、退出界面。急用,
偷懒的方法是先用c#或者迟坦备MFC编写,之信悄后使用visual studio自带的码毁mpbin.exe 加上/diasm 导出该汇编源码。。。没试过,逆向的时候看过核心的汇编代码
不急的话我给你做。。。。
㈡ 怎么去实现一个简单文本编辑器
1.设计目的
简易文本编辑器是一个面向用户的系统服务程序,广泛用于源程序的输入、删除、替换、查找、修改等一系列操作,甚至用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色,是一个比较实用的应用软件。该程序是专门为用户做文本编辑而精心设计的,可以满足文本操作的大部分要求。
2.设计内容和要求
(1)读取(文本)文件建立新字符串(2)查看源(文本)文件内容和组成信息(3)查看当前字符串(4)查看当前字符串的组成信息(5)查找指定位置开始的指定长度字符串(6)查找指定的字符串的位置(7)在当前字符串指定的位置插入字符串(8)从当前字符串中删除指定的子字符串(9)替换当前字符串指定的子字符串(10)保存对(文本)文件的修改
(11) 另存为(文本)文件 (12) 退出程序
3.本设计所采用的数据结构
在该程序中用到的数据结构只有链表
程序中所使用的基本操作和存储结构均采用串的链式存储结构,并定义相应的操作函数。
typedef struct _String//定义链串结构
{char character ;//组成串的字符( 数据域 )
struct _String* next ;//指向下一串结构的指针( 链域 )
} String ;//串类型
4.功能模块详细设计
4.1详细设计思想
该程序所使用的基本操作和存储结构为采用串的链式存储结构,并定义相应的操作函数。文本编辑的操作调用以下函数并结合库函数来实现文本编辑的图形界面。
定义链式存储结构:
typedef struct _String//定义链串结构
{
char character ;//组成串的字符( 数据域 )
struct _String* next ;//指向下一串结构的指针( 链域 )
} String ;//串类型
定义串的信息结构:
typedef struct _StringInformation//定义串信息结构
{
String* str ;//链串首结点
int letters_count ;//字母个数
int figures_count ;//数字个数
int space_count ;//空格个数
int endline_count ;//换行符个数
int others_count ;//其他字符个数
int characters_count ;//总字符个数
} StringInformation ;//串信息类型
定义串的引索结构:
typedef struct _Index//定义串索引结构
{
int sub_index ;//子串在其父串的位置( 或索引 )
struct _Index* next_index ;//指向子串的下一个串索引结构的指针
} Index ;//串索引类型
所要调用的子函数有:
int StringToUnsignedInt( char* s , int max );//字符串转换成无符号整数
void InitalizeStringInformation( StringInformation* SI , int initalizeAll ) ;//串信息初始化
void CreatStringFromArray( String** S , char* cString ) ;//从字符数组建立字符串
int CreatStringFromFile( String** S ,char* filePath ) ; //从文件建立字符串
int StringLength( String* S ) ;//求串长
int StringCompare( String* S1 , String* S2 ) ;//串比较
void StringCopy( String** targetString , String* sourceString ) ;//串拷贝
void SubString(String* S ,int index ,int subLength ,String** subS ) ;//子串提取
int SubStringIndex( String* S , String* subS ) ; //求子串在父串首次出现的位置
int StringInsert( String** S , int index , String* insertedString ) ; //串插入
int SubStringDelete( String** S , int index , int subLength ) ; //子串删除
void PrintString( String* S ) ;//串输出
void PrintIndex( Index* subIndex ) ;//子串的所有索引输出
void PrintStringInformation( StringInformation* SI ) ;//串组成信息输出
void SaveToFile( String* S , char* filePath ) ;//保存字符串到文件
void DestroyString( String** S ) ;//串销毁
void DestroyIndex( Index** subIndex ) ;//子串索引销毁
(1)读取(文本)文件建立新字符串
该函数的设计思想为从字符数组建立字符串或者从文件建立字符串。就文件建立字符串而言,首先要定义一个串StringInformation
S,tempString = S.str,然后打开计算机中的txt文件gets( filePath ),
调用函数CreatStringFromFile( &S.str , filePath )将filePath写入字符串S中来实现 。
(2)查看源(文本)文件内容和组成信息
先要调用函数PrintString(
Source.str )来进行串输出,然后调用子函数PrintStringInformation( &Source
)将串组成信息输出,最后将串销毁DestroyString( &Source.str )。
(3)查看当前字符串
先要清屏system( "cls" );然后调用子函数PrintString( S.str )将串S输出。
(4)查看当前字符串的组成信息
调用子函数PrintStringInformation( &S )将串S的组成信息输出
(5)查找指定位置开始的指定长度字符串
先输入字串的起始位置gets(
input ),position = StringToUnsignedInt( input , -1 )
调用该函数将input转换成无符号整数并将值赋予position;然后再输入子字符串的长度gets( input ),subLength =
StringToUnsignedInt( input , -1
)调用此函数将input转换成无符号整数并将值赋予subLength,然后调用该函数 SubString( S.str , position ,
subLength , &subString )进行子串提取;
(6)查找指定的字符串的位置
首先要输入将要查找的字符串gets(
cString ),CreatStringFromArray( &subString , cString
)然后调用该函数将cString置为串subString,调用SubStringIndexAll( S.str , subString ,
&subIndex )输出子串subString在父串S中出现的所有位置,然后销毁subString 。
(7)在当前字符串指定的位置插入字符串
首先请输入将插入字符串的位置 gets( input ),然后调用函数position = StringToUnsignedInt( input , -1 )将input转换成无符号整数并将值赋予position;
再输入将插入的字符串
gets( cString ),CreatStringFromArray( &newString , cString
)用字符数组建立字符串法建立newString,然后再调用函数StringInsert( &S.str , position ,
newString )将newString插入文件S.str中,然后再销毁newString。
(8)从当前字符串中删除指定的子字符串
首先输入将删除的子字符串gets(
cString ),然后调用函数CreatStringFromArray( &subString , cString
)建立新的字符串subString,调用函数count = SubStringIndexAll( S.str , subString ,
&subIndex )输出子串subString在父串S中出现的所有位置。
然后输入将要删除的子字符串的位置gets(
input ),position = StringToUnsignedInt( input ,
-1)调用该函数将input转换成无符号整数并将值赋予position ;
再调用函数将子字符串删除SubStringReplaceSingle( &S.str , position , subString ,
NULL )。
(9)替换当前字符串指定的子字符串
先输入将被替换的子字符串 gets( cString )
,CreatStringFromArray( &subString , cString
)调用函数将cString生成字符串subString ,调用函数SubStringIndexAll( S.str , subString ,
&subIndex )输出子串subString在父串S中出现的所有位置。
再输入将替换的子字符串的位置gets(
input ),将输入的input转换为无符号整形position = StringToUnsignedInt( input , -1 );
然后输入一个字符串以替换上面的字符串 gets( cString ),调用CreatStringFromArray(
&replaceString , cString )将输入的cString CreatStringFromArray(
&replaceString , cString
)置成新串replaceString,然后调用函数SubStringReplaceSingle( &S.str , position ,
subString , replaceString )替换子字符串 ,然后销毁subString。
(10)保存对(文本)文件的修改
调用函数SaveToFile( S.str , filePath )将已修改的文本保存
(11)另存为(文本)文件
先输入将另存为的文件的绝对路径 gets( anotherPath )。然后再调用函数SaveToFile( S.str , anotherPath )另存文件
(12)退出程序
调用函数DestroyString( &S.str )将字符串S销毁,退出程序
㈢ 用VB做文本编辑器
意思就是做个记事本吧
看下面的
用VB做一个记事本实在不很复杂,我们完全可以通过向导来很方便地做出来。但本文只打算讨论用手动方法制作记事本,旨在向VB初学者展示:学VB原来是如此容易!
通过阅读、研究本迟迹文并按本文所述进行尝试,初学者将学到很多东西,如怎样使用RichText控件来打开和保存文件,怎样制作菜单、工具栏和状态栏以及如何对其编写代码等。
第一章 让我们的记事本马上运行
急于求成是初学者共有的心愿。那好,请按如下三个步骤做,我们的愿望立即就可以实现!
步骤一:绘制界面。
新建一个标准EXE工程,将其Caption属性改为“超级记事本”,点击Icon属性给它找个合适的Icon图标。单击菜单“工程”-“部件”,在弹出的“部件”对话框里找到Microsoft RichText Box 6.0和公共对话框Microsoft Common Dialog 6.0并选中它们,单击“确定”按钮。这时左边的工具栏上出现了我们刚才新添的两个控件了。在窗体上绘制RichText Box和Commn Dialog,其中RichText Box的大小和位置可不用理睬,我们将在代码中处理它,当然,有必要把它的ScrollBar属性设为2-rtfVertical,这样在打开和编辑文件时垂直滚动条才可用。
步骤二:编辑菜单。
按Ctrl E调出菜单编辑器,我们来做如下几个菜单:
一.文件菜单:
文件(第一层) mnuFile
新建(第二层) mnuNew
打开(第二层) mnuOpen
保存(第二层)中旦洞 mnuSave
- (第二层) mnuFileSep (分隔线)
退出(第二层) mnuExit
二.编辑菜单:
编辑(第一层) mnuEdit
复制(第二层) mnuCopy
剪切(第二层) mnuCut
粘贴(第二层) mnuPaste
- (第二层) mnuEditSep (分隔线)
全选(第二层) mnuSelecAll
三.搜索菜单:
搜索(第一层) mnuSearch
查找(第二层) mnuFind
查找下一个(第二层) mnuFindOn
四.帮助菜单:
帮助(第一层) mnuHelp
使用说明(第二层) mnuUsage
关于(第二卖枯层) mnuAbout
(注:各菜单项的快捷键请自行设置)
好了,其它的菜单项以后再根据需要添加。现在进入:
步骤三:编写代码。
'声明查找变量
Dim sFind As String
'声明文件类型
Dim FileType, FiType As String
'初始化程序
Private Sub Form_Load()
'设置程序启动时的大小
Me.Height = 6000
Me.Width = 9000
End Sub
'设置编辑框的位置和大小
Private Sub Form_Resize()
On Error Resume Next '出错处理
RichTextBox1.Top=20
RichTextBox1.Left=20
RichTextBox1.Height = ScaleHeight-40
RichTextBox1.Width = ScaleWidth-40
End Sub
'新建文件
Private Sub mnuNew_Click()
RichTextBox1.Text = '清空文本框
FileName = 未命名
Me.Caption = FileName
End Sub
'打开文件
Private Sub mnuOpen_Click()
CommonDialog1.Filter = 文本文档(*.txt)|*.txt|RTF文档(*.rtf)|*.rtf|所有文件(*.*)|*.*
CommonDialog1.ShowOpen
RichTextBox1.Text = '清空文本框
FileName = CommonDialog1.FileName
RichTextBox1.LoadFile FileName
Me.Caption = 超级记事本:
㈣ 如何用java编写一个简单的文本编辑器
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public class f1 extends Frame implements ActionListener
{
private MenuBar menubar=new MenuBar();
private Menu filemenu=new Menu("文件");
private Menu editmenu=new Menu("编辑");
private Menu formmenu=new Menu("格式");
private MenuItem[] itemf=new MenuItem[4];
private MenuItem[] iteme=new MenuItem[6];
private MenuItem[] items=new MenuItem[2];
private TextArea tf=new TextArea();
public int a=0,b=0,c=0,style=Font.PLAIN,size=15;
public String s1="red:"+a+" "+"green:"+b+" "+"blue"+c,
s2="宋体";
public String[] sz1={"10","16","24","30","32","36"},
sz2={"宋体","黑体","幼圆","隶书","行楷","Arial","Georgia"},
sz3={"粗体","倾斜","常规","粗斜"};
JDialog dialog=new JDialog(this,"字体",true);
Container cp=dialog.getContentPane();
JLabel[] lb=new JLabel[8];
JLabel lb1=new JLabel(s1,JLabel.LEFT);
JButton b1=new JButton("确定"),
b2=new JButton("取消");
JComboBox jc1=new JComboBox(),
jc2=new JComboBox(),
jc3=new JComboBox();
JScrollBar jb1=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);
JScrollBar jb2=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);
JScrollBar jb3=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);
㈤ 如何用C#编写文本编辑器
首先,打开你的开发工具Microsoft visual studio 2005。文件——》新建项目——》项目类型选择visualc#,模板选择windows 应用程序,到此我们已经创建好一个window窗体了!
接着修改窗体的属性,窗体名字修改为EditorForm,窗体的text属性修改为你要的命名。在工具箱了选择MenuStrip控件如图,把菜单拖到窗体去!
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceSimpleEditor
{
publicpartialclassEditorForm:Form
{
stringpath=null;
stringisSaved="n";
intinitLenglt=0;
publicEditorForm(stringpath)
{
this.path=path;
InitializeComponent();
}
privatevoid新建NToolStripMenuItem_Click(objectsender,EventArgse)
{
if(this.richTextBox1.TextLength>0&&(isSaved.Equals("n")))
{
if(MessageBox.Show("文件没有保存是否新建文件?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Warning)==DialogResult.Yes)
{
this.richTextBox1.Clear();
this.Text="简单的编辑器";
this.initLenglt=richTextBox1.TextLength;
}
}
else
{
this.richTextBox1.Clear();
this.Text="简单的编辑器";
this.initLenglt=richTextBox1.TextLength;
}
}
privatevoid打开OToolStripMenuItem_Click(objectsender,EventArgse)
{
//确定用户选择了文件
if(this.openFileDialog.ShowDialog()==DialogResult.OK)
{
//得到用户选择的文件路径和文件名
path=this.openFileDialog.FileName;
//读取文件内容
this.OpenFile();
}
}
privatevoidOpenFile()
{
try
{
stringextName=this.path.Substring(this.path.LastIndexOf("."));
if(extName.ToLower().Equals(".txt"))
{
//纯文本文件
this.richTextBox1.LoadFile(path,RichTextBoxStreamType.PlainText);
}
if(extName.ToLower().Equals(".rtf"))
{
this.richTextBox1.LoadFile(path,RichTextBoxStreamType.RichText);
}
this.Text="文本编辑器"+path;
this.isSaved="y";
}
catch(Exceptionex)
{
MessageBox.Show("请选择合适文件,打开失败");
}
}
privatevoid保存SToolStripMenuItem_Click(objectsender,EventArgse)
{
if(string.IsNullOrEmpty(this.path))
{
this.saveFileDialog1.Title="保存为";
if(this.saveFileDialog1.ShowDialog()==DialogResult.OK)
{
this.path=this.saveFileDialog1.FileName;
SaveFile();}
}
else
{
stringextNanme=path.Substring(this.path.LastIndexOf("."));
if(extNanme.ToLower().Equals(".txt"))
{
this.richTextBox1.SaveFile(this.path,RichTextBoxStreamType.PlainText);
}
if(extNanme.ToLower().Equals(".rtf"))
{
this.richTextBox1.SaveFile(this.path,RichTextBoxStreamType.RichText);
}
}
this.initLenglt=richTextBox1.TextLength;
}
privatevoidSaveFile()
{
try
{
if(this.saveFileDialog1.FilterIndex==1)
{
//纯文本文件
this.richTextBox1.SaveFile(path,RichTextBoxStreamType.PlainText);
}
if(this.saveFileDialog1.FilterIndex==2)
{
this.richTextBox1.SaveFile(path,RichTextBoxStreamType.RichText);
}
this.Text="文本编辑器"+path;
this.initLenglt=richTextBox1.TextLength;
this.isSaved="y";
}
catch(Exceptionex)
{}}
privatevoid另存为AToolStripMenuItem_Click(objectsender,EventArgse)
{
if(this.saveFileDialog1.ShowDialog()==DialogResult.OK)
{
this.path=this.saveFileDialog1.FileName;
SaveFile();
}
}
privatevoidEditorForm_Load(objectsender,EventArgse)
{
this.剪切TToolStripMenuItem.Enabled=false;
this.复制CToolStripMenuItem.Enabled=false;
if(!string.IsNullOrEmpty(this.path))
{
this.OpenFile();
}
}
privatevoid字体ToolStripMenuItem_Click(objectsender,EventArgse)
{
try
{
stringextName=this.path.Substring(this.path.LastIndexOf("."));
if(extName.ToLower().Equals(".txt"))
{
this.SettxtFont();
}
if(extName.ToLower().Equals(".rtf"))
{
this.SetRichtextFont();
}
}
catch(Exceptionex)
{
}
}
privatevoidSettxtFont()
{
if(this.fontDialog1.ShowDialog()==DialogResult.OK)
{
Fontfont=this.fontDialog1.Font;
this.richTextBox1.Font=font;
}
}
privatevoidSetRichtextFont()
{
if(this.fontDialog1.ShowDialog()==DialogResult.OK)
{
Fontfont=this.fontDialog1.Font;
this.richTextBox1.SelectionFont=font;
}
}
privatevoid字体颜色ToolStripMenuItem_Click(objectsender,EventArgse)
{
stringextName=this.path.Substring(this.path.LastIndexOf("."));
if(extName.ToLower().Equals(".rtf"))
{
if(this.colorDialog1.ShowDialog()==DialogResult.OK)
{
Colorcolor=this.colorDialog1.Color;
this.richTextBox1.SelectionColor=color;
}
}
}
privatevoid剪切TToolStripMenuItem_Click(objectsender,EventArgse)
{
if(richTextBox1.SelectionLength>0)
{
this.richTextBox1.Cut();
}
}
privatevoid粘贴PToolStripMenuItem_Click(objectsender,EventArgse)
{
this.richTextBox1.Paste();
}
privatevoid复制CToolStripMenuItem_Click(objectsender,EventArgse)
{
if(richTextBox1.SelectionLength>0)
{
this.richTextBox1.Copy();
}
}
privatevoidrichTextBox1_SelectionChanged(objectsender,EventArgse)
{
if(richTextBox1.SelectionLength>0)
{
this.剪切TToolStripMenuItem.Enabled=true;
this.复制CToolStripMenuItem.Enabled=true;
}
else
{
this.剪切TToolStripMenuItem.Enabled=false;
this.复制CToolStripMenuItem.Enabled=false;
}
}
privatevoid编辑EToolStripMenuItem_Click(objectsender,EventArgse)
{
}
privatevoid全选AToolStripMenuItem_Click(objectsender,EventArgse)
{
this.richTextBox1.SelectedText.ToString();
}
privatevoid退出XToolStripMenuItem_Click(objectsender,EventArgse)
{
this.Close();
}
privatevoidEditorForm_FormClosing(objectsender,FormClosingEventArgse)
{
if(this.richTextBox1.TextLength>this.initLenglt)
{
if(MessageBox.Show("文件没有保存是否退出?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Warning)==DialogResult.No)
{
e.Cancel=true;
}
}
}
privatevoid关于AToolStripMenuItem_Click(objectsender,EventArgse)
{
AboutBoxaboutbox=newAboutBox();
aboutbox.ShowDialog();
}
privatevoid撤消UToolStripMenuItem_Click(objectsender,EventArgse)
{
this.richTextBox1.Undo();
}
}
}
㈥ 如何使用文本编辑器制作一个网页
第一步:在空文件夹中单击右键,选择“新建--文本文档”。然后这个空文件夹里立即多了一个名为“新建 文本文档.txt”的文件。将此文件后缀"txt"改大山名为"html"。例如:1.html
这样,一个没有网页代码和内容的一个空网页就建成了。
哇噻,看见了吗?你的第一个网页。怎不令人激动和兴奋呢!所有的过程只是键入几个单词而已。
也可以是相对的,相对于当前页面来说。
所以,假设你有另外一个HTML文档“flyingmoss.html”,其中一行代码可以写成<a href="flyingmoss.html">The miracle of moss in flight</a> ,诸如此类。
连接不仅可以连接到其他的HTML文档,也可以连接到页面上的其他文件。
连接还可以转到页面的其他部分。你可以给几乎所有的标签增加id属性,比如<h2 id="moss">Moss</h2>,然后连接到它,像是这样做:<a href="#moss">Go to moss</a>,点击这个连接会直接滚动到带有这个id的元素。
注意a标签允许你为连接打开新窗口,而不是取代当前窗口,初听起来似乎是一个不错的主意,因为它不会让用户离开你的页面。
但是,有很多理由证明,你不应该这样做。
从易用性的观点来滚团中看,这种方法破坏导航。最常用的导航工具是浏览器上的“后退”,打开新窗口使这个功能失去了作用。
更广泛地,还是从易用的观点来或森看,用户不需要到处都是弹出的新窗口。如果用户需要打开新窗口,他们有权利(是的,有权利。不要强行干涉别人意志,不是很好吗?在一般情况下,建议你尽量不要使用新窗口——译者注)让自己来控制。
㈦ 用JAVA设计一个简单文本编辑器
要求挺多
㈧ 如何制作vb中文本编辑
1、菜单:
单击【工具】-【菜单编辑器】,在菜单编辑器对话框中进行编辑,比较简单。特别说明:1、子菜单要点击右箭头,编辑完子菜单,再点击右箭头返回主菜单编辑。2、菜单编辑器中的标题是菜单中显示的名称唤困和,而名称是菜单在软件中的识别符,一般用英文或汉语拼音,这个识别符可以在软件中编辑他的动作。其他你可以自己琢磨。
2、工具栏:
工具栏必须在【工程】-【部件】的部件对话框中添加Microsoft Windows Common Controls 6.0(SP4),添加后在左边工具栏或出现8个工具,其中Toolbar是工具栏工具,ImageList是图片编辑工具。单击Toolbar工具放到窗体,会出现工具栏编辑对话框,单击下一步,如果需要传统工具栏,在这里点击左边项目,再点击右箭头,如果不需要点击下一步,单击完成。然后右击Toolbar1控件,单击【属性】,和盯在对话框中点击bottons标签,点击insert button按钮,即可编辑工具栏项目了。注意:在编辑工具栏前,你必须放置ImageList工具,在ImageList1控件的属性中放置工具栏的图标。详细你慢慢熟悉就可以了。
3、增强文本框?可能你需要的是可以显示多行文字的textbox控件吧?其实就是textbox控件的几个属性:MultiLine属性设置为1,可以显示多行文字, ScrollBars属性是设置是否显示滚动条,0为不显示,1为显示水平滚动条,2为显示垂直滚动条,3为显示水平和垂直滚尺族动条。例如:
Text1.MultiLine = 1
Text1.ScrollBars = 2
㈨ 如何用VB编辑一个文本编辑器
Private Sub Bold_Click()
Text1.FontBold = True
End Sub
Private Sub Clean_Click()
Text1.Text = "轿腔"
End Sub
Private Sub Display_Click()
Text1.Text = inpext
End Sub
Private Sub Exit_Click()
End
End Sub
Private Sub Font20_Click()
Text1.FontSize = 20
End Sub
Private Sub Input_Click()
inpt = InputBox("请输入一段文字"枯戚, "输入没帆陵对话框")
inptext = inptext & inpt
End Sub
Private Sub Italic_Click()
Text1.FontItalic = True
End Sub
Private Sub Normal_Click()
Text1.FontBold = False
Text1.FontItalic = False
Text1.FontUnderline = False
Text1.FontSize = 10
End Sub
Private Sub Under_Click()
Text1.FontUnderline = True
End Sub
㈩ 用汇编语言设计一个“简单的文本编辑器”
说明: 双击可执行文件wbbjq.exe,在出现的界面中输入任意文本内容,利用DEL键、
BACKSPACE键、HOME键、END键、上下左右光标键对文本进行全屏幕编辑,
按f1键激活菜单file,下移光标,选纳空者洞薯择save,输入文件名。也可以选择FILE菜单
的其他菜单项,他们亏李的功能均可实现。按f10激活帮助,按ESC键退出帮助。
源程序:
red_chr macro ;读取字符宏定义
mov ah,0
int 16h
endm
string macro p1 ;输入字符光标
mov ah,9
lea dx,p1
int 21h
endm
win macro opr1,opr2,opr3,opr4,opr5,opr6 ;建立窗口
mov ah,06h
mov al,opr1
mov bh,opr2
mov ch,opr3
mov cl,opr4
mov dh,opr5
mov dl,opr6
int 10h
endm
pos_curse macro op1,op2,op3 ;定义光标位置
mov ah,2
mov bh,op1
mov dh,op2
mov dl,op3
int 10h
endm
pos_get macro ;显示光标位置
mov ah,03h
mov bh,0
int 10h
endm
data segment ;定义数据段
menu db 'File Edit Help $'
mass_1 db 'F1 Active file F10 Active help','$'
manu_1 db ' New ',13,10,'$'
manu_2 db ' Open ',13,10,'$'
manu_3 db ' Save ',13,10,'$'
manu_4 db ' Save as ',13,10,'$'
manu_5 db ' Exit ','$'
handle dw ?
message1 db ' Please input file name:','$'
message2 db ' Please input save file name:','$'
message3 db ' Please input open file name:','$'
message4 db ' ***The file is not save! Save it now? (Y/N)***: ','$'
path db 50 p(0),'$'
buffer db 2000 p(?)
bak db 3850 p(0)
line db ?
row db ?
char db ?
help_mas1 db ' welcome use editor! $' ;帮助内容
help_mas2 db 'please the first active help! $'
help_mas3 db 'good lucky!! $'
help_mas4 db '==========================================================$'
help_mas5 db 'Press F1 to active file. $'
help_mas6 db 'You can use DOWN cursor key to choose the fuction $'
help_mas7 db 'Press F10 to show the help massage.Press Esc To Quit$'
date db 'today ??/??/','$' ;调用日期
hanglie db '???//???','$' ;行//列
data ends
code segment
main proc far ;主程序
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
call wind
call edit
ret
main endp
wind proc near ;创建窗口子程序
win 0,3eh,1,0,24,79 ;定义窗口背景
win 1,1fh,0,0,0,79
win 0,1fh,24,0,24,79
show: ;显示菜单位置及内容
pos_curse 0,0,1
mov ah,9
lea dx,menu
int 21h
show_2: ;显示状态栏位置及内容
pos_curse 0,24,1
mov ah,9
lea dx,mass_1
int 21h
call win3
call win4
pos_curse 0,1,0
mov row,dh
mov line,dl
wind endp
edit proc near
char_get: ;读字符
call com
com proc near ;定义功能键
pos_get
mov row,dh
mov line,dl
first:
pos_curse 0,row,line
j00: mov ah,0
int 16h ;从键盘读字符 ah=扫描码 al=字符码
push ax
lea dx,buffer
mov buffer[bx],al
inc bx
cmp ah,48h ;上
jz up_1
cmp ah,50h ;下
jz down_1
cmp ah,4bh ;左
jz left
cmp ah,4dh ;右
jz right
cmp ah,1ch ;回车
jz enter_1
call fuc_key
mov ah,2
mov dl,al
int 21h
pop ax
call menu_show
jmp j6
down_1:
jmp down
enter_1:
jmp enter_2
up_1: jmp up
left: ;光标左移
pos_get
mov row,dh
mov dl,line
cmp line,0
jnz direct
mov line,79
dec row
cmp row,0
je stop2
jmp first
stop2:
mov row,1
jmp first
direct:
dec line
call win4 ;显示光标位置
jmp first
right: ;光标右移
pos_get
mov row,dh
mov dl,line
cmp line,79
jnz direct2
mov line,0
inc row
cmp row,24
je returns1
jmp first
direct2:
inc line
call win4
jmp first
enter_2:
jmp enter
up: ;上移光标
pos_get
mov row,dh
mov dl,line
dec row
cmp row,0
je stop1
call win4
jmp first
stop1:
mov row,1
jmp first
down: ;下移光标
pos_get
mov row,dh
mov dl,line
inc row
cmp row,24
je stop3
call win4
jmp first
stop3:
mov row,23
jmp first
returns1:
jmp returns
enter: ;回车换行
pos_get
mov row,dh
mov line,dl
inc row
cmp row,24
je returns
mov line,0
call win4
jmp first
returns:
mov row,24
mov line,0
jmp first
j6:
ret
com endp
fuc_key proc near ;功能键子程序
next:
cmp ah,47h ;home
jz home
cmp ah,4fh ;end
jz _end
cmp ah,0eh ;backspace
jz bak_sp
cmp ah,53h
jz del
cmp ah,44h ;F10
jz help_0
ret
help_0: call help
home: ;HOME键的功能
pos_get
mov row,dh
mov line,0
call win4
jmp first
_end: ;END键的功能
pos_get
mov row,dh
mov line,79
call win4
jmp first
bak_sp: ;退格键的功能
pos_get
mov row,dh
mov line,dl
cmp line,0
je stop
dec line
jmp ab
stop:
mov line,0
ab:
pos_get 0,row,line
mov ah,2
mov dl,00
int 21h
call win4
jmp first
del: ;DEL删除
pos_get
mov row,dh
mov line,dl
dec line
pos_get 0,row,line
mov ah,2
mov dl,00
int 21h
inc line
call win4
jmp first
cm:
cmp line,00
jz pos_cm
pos_cm:
pos_curse 0,0,0
jmp first
help proc near ;显示帮助信息
call savedisplay ;显示帮助信息每行的位置
pos_get
push dx
win 0,57h,4,5,21,70
pos_curse 0,6,25
string help_mas1
pos_curse 0,8,11
string help_mas2
pos_curse 0,10,11
string help_mas3
pos_curse 0,12,11
string help_mas4
pos_curse 0,14,11
string help_mas5
pos_curse 0,16,11
string help_mas6
pos_curse 0,18,11
string help_mas7
pop dx
pos_curse 0,dh,dl
mov ah,0
int 16h
cmp ah,36h ;F10 active help
jnz cls
call help
cls:
win 0,1eh,9,10,13,70 ;清屏
call backdisplay
help endp
fuc_key endp
menu_show proc near ;显示菜单
call savedisplay
push cx
cmp ah,3bh ;F1功能
jz menu_sh
jmp char_get
menu_sh: ;定义菜单的背景字体颜色
pos_get
push dx
win 0,06h,2,1,7,11
win 0,65h,1,0,6,10
pos_curse 0,1,0
string manu_1
string manu_2
string manu_3
string manu_4
string manu_5
pop dx
dec dl
pos_curse 0,dh,dl
copmar:
red_chr
cmp ah,50h
jz manu_n
jmp manu_hid
manu_hid: ;菜单隐藏
win 0,1eh,1,1,7,11
call backdisplay
jmp char_get
manu_n: ;开始定义各个菜单项
win 0,65h,5,1,5,8
pos_curse 0,5,0
string manu_5
win 0,15h,1,1,1,8
pos_curse 0,1,0
string manu_1
red_chr
cmp ah,48h
je manu_n
cmp al,0dh
jz new_1
cmp ah,50h
je manu_o
jmp manu_hid
manu_n0:
jmp manu_n
manu_o:
win 0,65h,1,1,1,8
pos_curse 0,1,0
string manu_1
win 0,15h,2,1,2,8
pos_curse 0,2,0
string manu_2
red_chr
cmp ah,48h
je manu_o
cmp al,0dh
jz open_1
cmp ah,50h
je manu_s
jmp manu_hid
new_1: jmp new_2
manu_s:
win 0,65h,2,1,2,8
pos_curse 0,2,0
string manu_2
win 0,15h,3,1,3,8
pos_curse 0,3,0
string manu_3
red_chr
cmp al,0dh
jz save_1
cmp ah,48h
je manu_s
cmp ah,50h
je manu_a
jmp manu_hid
open_1: jmp open_2
manu_n1:
jmp manu_n
manu_a:
win 0,65h,3,1,3,8
pos_curse 0,3,0
string manu_3
win 0,15h,4,1,4,8
pos_curse 0,4,0
string manu_4
red_chr
cmp ah,1ch
jz save_2
cmp ah,48h
je manu_a
cmp ah,50h
je manu_e
jmp manu_hid
manu_n2:
jmp manu_n1
new_2: jmp new
save_1: call save
save_2: call saveas
manu_e:
win 0,65h,4,1,4,8
pos_curse 0,4,0
string manu_4
win 0,15h,5,1,5,8
pos_curse 0,5,0
string manu_5
red_chr
cmp ah,50h
je manu_n2
cmp ah,48h
je manu_e
cmp ah,1ch
je exit
jmp manu_hid
exit:
call backdisplay
win 0,07h,15,10,17,61
win 0,24h,14,9,16,60
mov dh,15
mov dl,9
mov bh,0
mov ah,2
int 10h
lea dx,message4
mov ah,9
int 21h
mov ah,1
int 21h
cmp al,79h
jnz q
call quitt
q: cmp al,6eh
jz quit
quit: win 0,07h,0,0,24,79
pos_curse 0,0,0
mov ah,4ch
int 21h
ret
menu_show endp
new proc near ;新建文件
pos_get
push dx
call backdisplay
win 0,07h,15,10,17,61
win 0,24h,14,9,16,60,
mov dh,15
mov dl,9
mov bh,0
mov ah,2
int 10h
lea dx,message1
cmp al,0dh
mov ah,9
int 21h
mov bx,0
all:
mov ah,1
int 21h
cmp al,0dh
je alll
mov path[bx],al
inc bx
jmp all
alll:
win 0,3eh,15,9,17,61
pop dx
pos_curse 0,dh,dl
lea dx,path
mov ah,3ch
mov cx,00
int 21h
mov handle,ax
mov bx,ax
mov ah,3eh
int 21h
win 0,3eh,1,0,23,79
mov dh,1
mov dl,0
mov bh,0
mov ah,2
int 10h
jmp char_get
new endp
open_2: jmp open
saveas proc near ;另存为文件 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
win 0,3eh,1,0,6,10
call backdisplay
win 0,07h,15,10,17,61
win 0,24h,14,9,16,60,
mov dh,15
mov dl,9
mov bh,0
mov ah,2
int 10h
lea dx,message2
mov ah,9
int 21h
mov bx,0
bll:
mov ah,1
int 21h
cmp al,0dh
je blll
mov path[bx],al
inc bx
jmp bll
blll:
pos_get
push dx
win 0,3eh,1,0,23,79
call backdisplay
pop dx
pos_curse 0,dh,dl
lea dx,path
mov ah,3ch
mov cx,00
int 21h
mov handle,ax
lea dx,buffer
mov bx,handle
mov cx,2000
mov ah,40h
int 21h
mov bx,handle
mov ah,3eh
int 21h
call backdisplay
jmp char_get
saveas endp
open proc near ;打开文件
call backdisplay
win 0,07h,15,10,17,61
win 0,24h,14,9,16,60
mov dh,15
mov dl,9
mov bh,0
mov ah,2
int 10h
lea dx,message3
mov ah,9
int 21h
mov bx,0
cll:
mov ah,1
int 21h
cmp al,13
je clll
mov path[bx],al
inc bx
jmp cll
clll:
win 0,3eh,1,0,23,79
lea dx,path
mov ah,3dh
mov al,0
int 21h
mov handle,ax
lea dx,buffer
mov bx,handle
mov cx,2000
mov ah,3fh
int 21h
win 0,3eh,1,23,1,79
mov dh,1
mov dl,0
mov bh,0
mov ah,2
int 10h
mov cx,1000
sub bx,bx
replay:
mov dl,buffer[bx]
inc bx
mov ah,2
int 21h
loop replay
mov bx,handle
mov ah,3eh
int 21h
mov dh,1
mov dl,0
mov bh,0
mov ah,2
int 10h
mov cx,10
mov bx,0
cleapath_3:
mov bl,0
mov path[bx],bl
loop cleapath_3
jmp char_get
open endp
save proc near ;保存文件
pos_get
push dx
win 0,3eh,1,0,6,10
call backdisplay
mov ah,path
cmp ah,21h
jl j_3
jmp j_4
j_3:
win 0,07h,15,10,17,61
win 0,24h,14,9,16,60,
mov dh,15
mov dl,9
mov bh,0
mov ah,2
int 10h
lea dx,message2
mov ah,9
int 21h
mov bx,0
dll:
mov ah,1
int 21h
cmp al,0dh
je dlll
mov path[bx],al
inc bx
jmp dll
dlll:
win 0,3eh,1,0,23,79
pop dx
pos_curse 0,dh,dl
j_4: lea dx,path
mov ah,3ch
mov cx,00
int 21h
mov handle,ax
lea dx,buffer
mov bx,handle
mov cx,2000
mov ah,40h
int 21h
mov bx,handle
mov ah,3eh
int 21h
call backdisplay
jmp char_get
save endp
savedisplay proc near
push ax
push bx
push cx
push dx
push ds
mov ax,0002h
int 33h
mov bx,0d
mov cx,3840d
loop1:
mov ax,0b800h
mov ds,ax
mov dl,ds:[bx]
mov ax,data
mov ds,ax
mov bak[bx],dl
inc bx
loop loop1
mov ax,0001h
int 33h
pop ds
pop dx
pop cx
pop bx
pop ax
savedisplay endp
backdisplay proc near
push ax
push bx
push cx
push dx
push ds
mov bx,0d
mov cx,3840d
loop11:
mov ax,data
mov ds,ax
mov dl,bak[bx]
mov ax,0b800h
mov ds,ax
mov ds:[bx],dl
inc bx
loop loop11
pop ds
pop dx
pop cx
pop bx
pop ax
ret
backdisplay endp
quitt proc near ;退出
call backdisplay
win 0,07h,15,10,17,61
win 0,24h,14,9,16,60,
mov dh,15
mov dl,9
mov bh,0
mov ah,2
int 10h
lea dx,message2
mov ah,9
int 21h
mov bx,0
qll:
mov ah,1
int 21h
cmp al,0dh
je qlll
mov path[bx],al
inc bx
jmp qll
qlll:
win 0,07h,15,10,17,61
win 0,3eh,14,9,16,60
call backdisplay
lea dx,path
mov ah,3ch
mov cx,00
int 21h
mov handle,ax
lea dx,buffer
mov bx,handle
mov cx,2000
mov ah,40h
int 21h
mov bx,handle
mov ah,3eh
int 21h
call backdisplay
win 0,07h,0,0,24,79
mov ah,4ch
int 21h
ret
quitt endp
edit endp
win3 proc near ;显示日期
mov ah,2ah
int 21h
mov bl,10d
mov ax,0
mov al,dh
div bl
add ax,3030h
mov [date+6],al
mov [date+7],ah
mov ax,0
mov al,dl
div bl
add ax,3030h
mov [date+9],al
mov [date+10],ah
win 0,1dh,0,67,0,79
pos_curse 0,0,67
mov dx,offset date
mov ah,09h
int 21h
ret
win3 endp
win4 proc near ;显示行//列
mov ah,03h
mov bh,0
int 10h
mov bl,100d
mov bh,10d
mov ax,0
mov al,dh
div bl
add al,30h
mov [hanglie+0],al
mov al,ah
mov ah,0
div bh
add ax,3030h
mov [hanglie+1],al
mov [hanglie+2],ah
mov ax,0
mov al,dl
div bl
add al,30h
mov [hanglie+5],al
mov al,ah
mov ah,0
div bh
add ax,3030h
mov [hanglie+6],al
mov [hanglie+7],ah
win 0,1dh,24,60,24,70
pos_curse 0,24,61
mov dx,offset hanglie
mov ah,09h
int 21h
ret
win4 endp
code ends
end start ;结束