• Windows Programming ---- Beginning Visual C#


    更多相关文章,见本人的个人主页:zhongxiewei.com

    关于windows programming最为基础的就是需要掌握各种控件的使用方法,如Button Control, Label and LinkLabel Control, TextBox Control, RadioButton and CheckBox Control, ListBox and CheckedListBox Control, ListViewControl, TabControl Control等等。具体的使用方式可以详见《Beginning Visual C#》一书中。在这里,对windows下的“记事本”功能进行了复制。具体代码见: Notepad

    “记事本”的界面实现

    对于内部的对话框,直接采用了“工具箱”中自带的对话框,如FontDialog, OpenFileDialog, SaveFileDialog, PrintDialog, PageSetupDialog。

    “记事本”相关功能

    关于文件的打开,存储,以及退出

    新建

    如果当前打开的文件没有保存
        提示是否保存该文件
        选择保存:
            跳出的另存为对话框到文件默认的路径,默认的文件名
            选择保存:进行保存操作
            选择取消:不进行任何操作,直接返回
        选择不保存:直接新建;
        取消:不进行任何操作
    否则
        直接新建

    打开:

    如果当前打开的文件没有保存
        提示是否保存文件
        选择保存:
            跳出的另存为对话框到文件默认的路径,默认的文件名
            选择保存:进行保存操作
            选择取消:不进行任何操作,直接返回
        选择不保存:直接打开;
        取消:不进行任何操作
    否则
        直接打开

    保存

    如果当前的文件不是打开得到的
        弹出另存为对话框,输入文件名进行保存
    否则
        直接保存到对应的文件

    另存为

    弹出另存为对话框,输入文件名进行保存

    退出:

    如果当前打开的文件没有保存
        提示是否保存文件
        选择保存:
            跳出的另存为对话框到文件默认的路径,默认的文件名
            选择保存:进行保存操作
            选择取消:不进行任何操作,直接返回
        选择不保存:直接退出;
        取消:不进行任何操作
    否则
        直接退出

    从上述的文字描述中,可以得到复用的语句有:

    如果当前打开的文件没有保存
        提示是否保存文件
        选择保存:
            跳出的另存为对话框到文件默认的路径,默认的文件名
            选择保存:进行保存操作
            选择取消:不进行任何操作,直接返回
        选择不保存:直接退出;
        取消:不进行任何操作

    检查当前的文件是否没有保存,如果否,进行选择是否保存文件。可以利用TextBox的TextChanged事件。当该事件发生时,设定textChanged变量为true。当文件保存或是文件打开的时间成功完成之后,该值被赋值为false。另外还需要实现的是“提示是否保存的对话框”。

    进一步将上述复用的语句整理为函数,如下:

    // 如果文件没保存,同时点击了忽略选项,那么返回false,否则范围true
    private bool isChangedTextProcessed()
    {
        if (textChanged)
        {
            alertForm.SetMessage(fullname);
            DialogResult dlgResult = alertForm.ShowDialog();
            if (dlgResult == DialogResult.OK)
            {
                dlgResult = saveFileAs();
                if (dlgResult == DialogResult.Cancel) return false;
            }
            else if (dlgResult == DialogResult.Cancel) return false;
        }
    
        return true;
    }

    页面设置以及打印相关

    最为关键的打印工作有printDocument掌控,之前,有pageSetupDialog用于页面的设置,以及printDialog用于打印机的选择等。

    在打印的过程中,需要注意的事情:当一行的字符串的长度比打印页面区间的长度要大的时候,如何处理?没有实现

    撤销,剪切,复制,粘帖,删除功能的实现

    每次当“编辑”的下拉菜单出现的时候,都会对“剪切”,“复制”,“删除”的可访问状态进行设置。当有文本被选择时,设置为true;否则设置为false。借用的事前为:DropDownOpened事件。如下:

    private void mitEdit_DropDownOpened(object sender, EventArgs e)
    {
        if (Clipboard.ContainsText()) mitPaste.Enabled = true;
        else mitPaste.Enabled = false;
    
        if (txbMain.SelectedText.Equals(""))
        {
            mitCopy.Enabled = false;
            mitCut.Enabled = false;
            mitDelete.Enabled = false;
        }
        else
        {
            mitCopy.Enabled = true;
            mitCut.Enabled = true;
            mitDelete.Enabled = true;
        }
    }

    撤销功能直接使用了“textbox”的“Undo”方法。复制使用了Clipboard.Clear(); Clipboard.SetText(selectedText);,剪切采用的方式为:Clipboard.Clear();txbMain.Cut();,删除采用的方式为:int start=txbMain.SelectionStart; txbMain.Text = txbMain.Text.Substring(0,start) + txbMain.Text.Substring(start + txbMain.SelectionLength);,粘帖采用的方式如下:

    private void mitPaste_Click(object sender, EventArgs e)
    {
        int start = txbMain.SelectionStart;
        deleteText();
        string insertString = Clipboard.GetText();
        txbMain.Text = txbMain.Text.Insert(start, insertString);
        txbMain.SelectionStart = start + insertString.Length;
    }

    查找,查找下一个,替换功能的实现

    当含有文字内容的时候,菜单中查找以及查找下一个的选项都为可点击的。当新建文件的时候,将它们的enable属性设置为false,当打开文件,或新建的文件已经进行了编辑,它们的enable属性设置为true。具体文本的查找,对于大小写敏感的搜索方式,采用了string.IndexOf和string.LastIndexOf,对于大小写不敏感的搜索方式,借用了System.Globalization.CompareInfo。

    当点击查找对话框右上角的叉的时候,默认情况下为销毁该窗体,但是,这并不是我们想要的结果,我们希望隐藏该窗体,而不是彻底的销毁该窗体,于是建立事件FormClosing(object sender, FormClosingEventArgs e),并在该事件中将e.Cancel设定为true。

    对于替换功能中,全部替换的点击选项。采用了比较简单的方法:依次使用查找下一个,和替换当前匹配的方式,最后直到完全替换。其中对于大小写匹配的问题在findNext 中进行实现,findNext以及替换功能的代码如下:

    private void findNext()
    {
        int point = -1;
        point = parentText.SelectionStart + parentText.SelectionLength; // parentText表示主form窗口中的textbox
        if (ckbBigLo.Checked)
        {
            point = point > parentText.Text.Length ? -1 :
                parentText.Text.IndexOf(txbFindContent.Text, point);
        }
        else
        {
            point = point > parentText.Text.Length ? -1 :
                cmpInfo.IndexOf(parentText.Text, txbFindContent.Text, point, CompareOptions.IgnoreCase);
        }
    
        if (point == -1)
        {
            MessageBox.Show("找不到" + txbFindContent.Text, "记事本",
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        else
        {
            parentText.Select(point, txbFindContent.Text.Length);
            parentText.ScrollToCaret();
            parentForm.Active();
        }
    }
    
    private void replace()
    {
        string selectedText = parentText.SelectedText.ToLower();
        int start = parentText.SelectionStart;
        
        if (selectedText.Equals(txbFindContent.Text.ToLower()))    
        {
            parentText.Text = parentText.Text.Substring(0, start) + 
                txbReplaceContent.Text +
                parentText.Text.Substring(start + selectedText.Length);
            partentText.SelectionStart = start + txbReplaceContent.Text.Length;
        }
    }

    字体设置

    字体的设置采用了现有的fontdialog

  • 相关阅读:
    余额宝数据架构阅读
    VS提示This function or variable may be unsafe,The POSIX name for this item is deprecated
    VS中新建QT空项目找不到头文件的问题
    指针
    循环for do while continue break,达夫设备
    GUI程序弹出控制台打印输出信息
    ctime、chrono以及所有和时间有关的内容
    python安装
    文件:fstream,FILE,CFile,filesystem,以及路径目录
    C++异常处理、Dump文件、断言、静态断言、日志文件
  • 原文地址:https://www.cnblogs.com/grass-and-moon/p/4136928.html
Copyright © 2020-2023  润新知