zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【Anagrams】 cpp
    【Count and Say】cpp
    【Roman To Integer】cpp
    【Integer To Roman】cpp
    【Valid Number】cpp
    重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
    Maven项目聚合 jar包锁定 依赖传递 私服
    Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
    mysql案例~tcpdump的使用
    tidb架构~本地化安装
  • 原文地址:https://www.cnblogs.com/grass-and-moon/p/4136928.html
Copyright © 2011-2022 走看看