国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Windows應(yīng)用程序——記事本

這篇具有很好參考價(jià)值的文章主要介紹了Windows應(yīng)用程序——記事本。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、描述

本博客介紹如何使用Visual Studio 2019設(shè)計(jì)一個(gè)Windows應(yīng)用程序——記事本,通過學(xué)習(xí),可以進(jìn)一步掌握MenuStrip(菜單)、ToolStrip(工具欄)、RichTextBox(高級(jí)文本框)和StatusStrip(狀態(tài)欄控件)等控件的使用,以及如何使用CommonDialog(公共對(duì)話框)實(shí)現(xiàn)對(duì)文本的存取、格式設(shè)置等操作。(說明:所有代碼必須在英文狀態(tài)下使用!)

二、記事本簡(jiǎn)介

記事本是一種常用的軟件,在微軟的Windows中,自帶了一個(gè)記事本軟件,Windows 10下的記事本軟件如下圖所示。
windows記事本,windows,microsoft

三、記事本界面設(shè)計(jì)

新建一個(gè)Windows窗體應(yīng)用程序,并命名為“Notepad”
更改窗體名稱 單擊窗體, →右下角屬性→text 修改為“記事本”如圖所示
windows記事本,windows,microsoft
按下表設(shè)置剩下的窗體屬性
windows記事本,windows,microsoft
windows記事本,windows,microsoft
windows記事本,windows,microsoft
1)界面設(shè)計(jì)
新建好“Notepad”項(xiàng)目后,定位到記事本程序的窗體設(shè)計(jì)器窗口,然后依次在窗體上放置以下控件(各1個(gè)):
(1)MenuStrip(菜單控件)。

1.單擊窗體左邊會(huì)出現(xiàn)工具箱→ 找到menustrip →拖動(dòng)到窗體中
2.單擊菜單欄→右下角屬性→修改Name屬性為“mnusNotepad”

3.單擊 輸入【文件(F)】、【編輯(E)】、【格式(O)】、【查看(V)】和【幫助(H)】如圖所示

4.設(shè)置【文件(F)】、【編輯(E)】、【格式(O)】、【查看(V)】和【幫助(H)】的屬性→
單擊【文件(F)】、【編輯(E)】、【格式(O)】、【查看(V)】和【幫助(H)】找到對(duì)應(yīng)的屬性窗口,按照以下表格進(jìn)行設(shè)置
windows記事本,windows,microsoft
windows記事本,windows,microsoft
(2) ToolStrip(工具欄控件)。

1.單擊窗體左邊會(huì)出現(xiàn)工具箱→ 找到“ToolStrip” →拖動(dòng)到窗體中

2.單擊工具欄→右下角屬性→修改Name屬性為“tlsNotepad”

3.右擊工具欄→ 插入標(biāo)準(zhǔn)項(xiàng) 出現(xiàn)如圖所示
windows記事本,windows,microsoft
4.右擊工具欄→ 編輯項(xiàng) 可以看到我們的按鈕成員 在這里我們可以刪除或者增加,為了新手學(xué)習(xí),我們只設(shè)置幾個(gè)簡(jiǎn)單的功能(新建,打開,保存,剪切,粘貼,復(fù)制)。其它我們不再設(shè)置。

為了看起來直觀,這個(gè)我們不更改它們的Name屬性了。

(3) RichTextBox(多格式文本框控件)。
1.單擊窗體左邊會(huì)出現(xiàn)工具箱→ 找到“RichTextBox” →拖動(dòng)到窗體中
windows記事本,windows,microsoft
2.單擊工具欄→右下角屬性→修改Name屬性為“rtxtNotepad”

3.Anchor屬性選擇“Top,Bottom,Left,Right”,這樣當(dāng)窗體大小改變時(shí),RichTextBox控件的大小也會(huì)跟著改變,如圖所示。
windows記事本,windows,microsoft
(4) StatusStrip(狀態(tài)欄控件)。
1.添加StatusStrip控件,將其Name屬性設(shè)為“stsNotepad”,將Dock屬性設(shè)為“Bottom”再將Anchor屬性設(shè)為“Top, Left”。
windows記事本,windows,microsoft
2.然后單擊 右邊的 按鈕,打開【項(xiàng)集合編輯器】對(duì)話框。

下拉列表中保留默認(rèn)的選擇“StatusLabel”,然后單擊【添加】按鈕,依次添加2個(gè)StatusLabel,并分別命名為“tssLbl1”和“tssLbl2”,再將tssLbl1的Text屬性設(shè)為“就緒”, tssLbl2的Text屬性設(shè)為“顯示日期、時(shí)間”。
windows記事本,windows,microsoft
5) OpenFileDialog(打開對(duì)話框)。
從工具箱中找到OpenFileDialog直接拖入窗體中 單擊屬性
當(dāng)用戶單擊記事本的【文件】→【打開】菜單項(xiàng)時(shí),使用打開對(duì)話框OpenFileDialog打開文件。OpenFileDialog控件的Name屬性為“odlgNotepad”,F(xiàn)ilter屬性設(shè)為

RTF文件|.rtf|所有文件|.*

(6) SaveFileDialog(保存對(duì)話框)。
從工具箱中找到SaveFileDialog直接拖入窗體中 單擊屬性
當(dāng)用戶單擊記事本的【文件】→【保存】(或【另存為】)菜單項(xiàng)時(shí),使用保存對(duì)話框SaveFileDialog保存文件。SaveFileDialog控件的Name屬性為“sdlgNotepad”,F(xiàn)ileName屬性改為“無標(biāo)題”,F(xiàn)ilter屬性設(shè)為

RTF文件|*.rtf
windows記事本,windows,microsoft
(7) FontDialog(字體對(duì)話框)。
從工具箱中找到FontDialog直接拖入窗體中 單擊屬性
當(dāng)用戶單擊記事本的【格式】→【字體】菜單項(xiàng)時(shí),使用字體對(duì)話框FontDialog設(shè)置文本字體。FontDialog控件的Name屬性為“fdlgNotepad”。

(8) Timer(計(jì)時(shí)器控件)。
從工具箱中找到Timer直接拖入窗體中 單擊屬性
本章介紹的記事本在狀態(tài)欄中顯示了時(shí)鐘,這就需要使用一個(gè)Timer控件來實(shí)現(xiàn)。Timer控件的Name屬性設(shè)為“tmrNotepad”,Enabled(激活的可行的)屬性設(shè)為“True”,Interval(間隔,間距,幕間時(shí)間)屬性設(shè)為“1000”,表示1秒種觸發(fā)一次Tick事件,即1秒鐘改變一次時(shí)鐘。

最終設(shè)置界面如下圖所示到此,用戶界面設(shè)計(jì)完畢,接下來介紹具體的實(shí)現(xiàn)過程及源代碼的編寫。
windows記事本,windows,microsoft
關(guān)于記事本
接下來單擊【項(xiàng)目】→【添加Windows窗體】菜單項(xiàng),添加一個(gè)名為“frmAbout”的窗體,如圖所示。
windows記事本,windows,microsoft
界面設(shè)計(jì)
然后給窗體“frmAbout”添加幾個(gè)Label、Button、LinkLabel控件,如圖所示。
windows記事本,windows,microsoft
【關(guān)于記事本】窗體和窗體上各控件的屬性設(shè)置如表所示。
windows記事本,windows,microsoft

四、源代碼

namespace 記事本
{
    public partial class frmNotepad : Form
    {
        bool b = false;
        bool s = true;
        public frmNotepad()
        {
            InitializeComponent();
        }

        private void NotePad_Load(object sender, EventArgs e)
        {

        }

        private void rtxtNotePad_TextChanged(object sender, EventArgs e)
        {
            s = false;
        }

        private void tsmiNew_Click(object sender, EventArgs e)
        {
            if (b == true || rtxtNotePad.Text.Trim() != "")
            {
                // 若文件未保存
                if (s == false)
                {
                    string result;
                    result = MessageBox.Show("文件尚未保存,是否保存?",
                        "保存文件", MessageBoxButtons.YesNoCancel).ToString();
                    switch (result)
                    {
                        case "Yes":
                            // 若文件是從磁盤打開的
                            if (b == true)
                            {
                                // 按文件打開的路徑保存文件
                                rtxtNotePad.SaveFile(odlgNotePad.FileName);
                            }
                            // 若文件不是從磁盤打開的
                            else if (sdlgNotePad.ShowDialog() == DialogResult.OK)
                            {
                                rtxtNotePad.SaveFile(sdlgNotePad.FileName);
                            }
                            s = true;
                            rtxtNotePad.Text = "";
                            break;
                        case "No":
                            b = false;
                            rtxtNotePad.Text = "";
                            break;
                    }
                }
            }
        }

        private void tsmiOpen_Click(object sender, EventArgs e)
        {
            if (b == true || rtxtNotePad.Text.Trim() != "")
            {
                if (s == false)
                {
                    string result;
                    result = MessageBox.Show("文件尚未保存,是否保存?",
                        "保存文件", MessageBoxButtons.YesNoCancel).ToString();
                    switch (result)
                    {
                        case "Yes":
                            if (b == true)
                            {
                                rtxtNotePad.SaveFile(odlgNotePad.FileName);
                            }
                            else if (sdlgNotePad.ShowDialog() == DialogResult.OK)
                            {
                                rtxtNotePad.SaveFile(sdlgNotePad.FileName);
                            }
                            s = true;
                            break;
                        case "No":
                            b = false;
                            rtxtNotePad.Text = "";
                            break;
                    }
                }
            }
            odlgNotePad.RestoreDirectory = true;
            if ((odlgNotePad.ShowDialog() == DialogResult.OK) && odlgNotePad.FileName != "")
            {
                rtxtNotePad.LoadFile(odlgNotePad.FileName);//打開代碼語句
                b = true;
            }
            s = true;
        }

        private void tsmiSave_Click(object sender, EventArgs e)
        {
            // 若文件從磁盤打開并且修改了其內(nèi)容
            if (b == true && rtxtNotePad.Modified == true)
            {
                rtxtNotePad.SaveFile(odlgNotePad.FileName);
                s = true;
            }
            else if (b == false && rtxtNotePad.Text.Trim() != "" &&
                sdlgNotePad.ShowDialog() == DialogResult.OK)
            {
                rtxtNotePad.SaveFile(sdlgNotePad.FileName);//保存語句
                s = true;
                b = true;
                odlgNotePad.FileName = sdlgNotePad.FileName;
            }
        }

        private void tsmiSaveAs_Click(object sender, EventArgs e)
        {
            if (sdlgNotePad.ShowDialog() == DialogResult.OK)
            {
                rtxtNotePad.SaveFile(sdlgNotePad.FileName);
                s = true;
            }
        }

        private void tsmiClose_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void tsmiUndo_Click(object sender, EventArgs e)
        {
            rtxtNotePad.Undo();//撤銷
        }

        private void tsmiCopy_Click(object sender, EventArgs e)
        {
            rtxtNotePad.Copy();//復(fù)制
        }

        private void tsmiCut_Click(object sender, EventArgs e)
        {
            rtxtNotePad.Cut();//剪切
        }

        private void tsmiPaste_Click(object sender, EventArgs e)
        {
            rtxtNotePad.Paste();//粘貼
        }

        private void tsmiSelectAll_Click(object sender, EventArgs e)
        {
            rtxtNotePad.SelectAll();//全選
        }

        private void tsmiDate_Click(object sender, EventArgs e)
        {
            rtxtNotePad.AppendText(System.DateTime.Now.ToString());//顯示當(dāng)前日期
        }

        private void tsmiAuto_Click(object sender, EventArgs e)
        {
            if (tsmiAuto.Checked == false)
            {
                tsmiAuto.Checked = true;    //選中該菜單項(xiàng)
                rtxtNotePad.WordWrap = true;     //設(shè)置為自動(dòng)換行
            }
            else
            {
                tsmiAuto.Checked = false;
                rtxtNotePad.WordWrap = false;
            }
        }

        private void tsmiFont_Click(object sender, EventArgs e)
        {
            fdlgNotePad.ShowColor = true;
            if (fdlgNotePad.ShowDialog() == DialogResult.OK)
            {
                rtxtNotePad.SelectionColor = fdlgNotePad.Color;
                rtxtNotePad.SelectionFont = fdlgNotePad.Font;
            }
        }

        private void tsmiToolStrip_Click(object sender, EventArgs e)
        {
            Point point;
            if (tsmiToolStrip.Checked == true)
            {
                //隱藏工具欄時(shí),把坐標(biāo)設(shè)為(0,24),因?yàn)椴藛蔚母叨任?4
                point = new Point(0, 24);
                tsmiToolStrip.Checked = false;
                tlsNotePad.Visible = false;
                //設(shè)置多格式文本框左上角位置
                rtxtNotePad.Location = point;
                //隱藏工具欄后,增加文本框高度
                rtxtNotePad.Height += tlsNotePad.Height;
            }
            else
            {
                /*顯示工具欄時(shí),多格式文本框左上角位置的位置為(0.49),
                 因?yàn)楣ぞ邫诘母叨葹?5,加上菜單的高度24后為49*/
                point = new Point(0, 49);
                tsmiToolStrip.Checked = true;
                tlsNotePad.Visible = true;
                rtxtNotePad.Location = point;
                rtxtNotePad.Height += rtxtNotePad.Height;
            }
        }

        private void tsmiStatusStrip_Click(object sender, EventArgs e)
        {
            if (tsmiStatusStrip.Checked == true)
            {
                tsmiStatusStrip.Checked = false;
                stsNotePad.Visible = false;
                rtxtNotePad.Height += stsNotePad.Height;
            }
            else
            {
                tsmiStatusStrip.Checked = true;
                stsNotePad.Visible = true;
                rtxtNotePad.Height -= stsNotePad.Height;
            }
        }

        private void tsmiAbout_Click(object sender, EventArgs e)
        {
            frmAbout ob_FrmAbout = new frmAbout();
            ob_FrmAbout.Show();
        }


        private void tlsNotePad_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            int n;
            //變量n用來接收按下按鈕的索引號(hào)從0開始
            n = tlsNotePad.Items.IndexOf(e.ClickedItem);
            switch (n)
            {
                case 0:
                    tsmiNew_Click(sender, e);
                    break;
                case 1:
                    tsmiOpen_Click(sender, e);
                    break;
                case 2:
                    tsmiSave_Click(sender, e);
                    break;
                /*case 3:
                 tsmiCopy_Click(sender,e);
                break;*/
                case 4:
                    tsmiCut_Click(sender, e);
                    break;
                case 5:
                    tsmiPaste_Click(sender, e);
                    break;
                /*case 6:
                 tsmiPaste_Click(sender,e);
                break;*/
                case 7:
                    tsmiAbout_Click(sender, e);
                    break;
            }
        }

        private void tmrNotePad_Tick(object sender, EventArgs e)
        {
            tssLbl2.Text = System.DateTime.Now.ToString();
        }

        private void toolTip1_Popup(object sender, PopupEventArgs e)
        {

        }

        private void toolStripMenuItem4_Click(object sender, EventArgs e)
        {

        }

        private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {

        }

        private void tsmiFile_Click(object sender, EventArgs e)
        {

        }
    }
};

關(guān)于記事本

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 記事本
{
    public partial class frmAbout : Form
    {
        public frmAbout()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void frmAbout_Load(object sender, EventArgs e)
        {

        }
        //*************************************************************************
        // 【關(guān)于記事本】代碼
        //*************************************************************************

        // 【確定】按鈕
        private void btnOk_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        // 使用LinkLabel打開郵件或者網(wǎng)頁
        private void llblEmail_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start("http://www.baidu.com");
        }

    }
}

五、運(yùn)行結(jié)果

windows記事本,windows,microsoft
windows記事本,windows,microsoft

六、源代碼

源碼文章來源地址http://www.zghlxwxcb.cn/news/detail-772829.html

到了這里,關(guān)于Windows應(yīng)用程序——記事本的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java小程序-記事本

    Java小程序-記事本

    摘 要 為了使自己熟悉Java編譯,了解更多的面向?qū)ο笳Z言的編程策略。進(jìn)而,深入了解Java語言的操作、及原理等。因此我開發(fā)了一個(gè)記事本,使自己可以鞏固知識(shí),加深記憶。設(shè)計(jì)一個(gè)簡(jiǎn)易記事本,能夠記錄使用者輸入的信息,同時(shí)可以實(shí)現(xiàn)保存輸入的信息,以方便后期查看

    2024年02月04日
    瀏覽(25)
  • Android 備忘錄,記事本程序設(shè)計(jì)

    Android 備忘錄,記事本程序設(shè)計(jì)

    android備忘錄實(shí)現(xiàn),使用ObjectBox數(shù)據(jù)庫框架進(jìn)行數(shù)據(jù)存儲(chǔ),增刪改查等操作。代碼使用kotlin編寫。 1、下面看看ObjectBox數(shù)據(jù)庫封裝 需要注意的是: ? ?/** ? ? ?* 你只有配置好之后, 點(diǎn)擊 Make Model \\\'你的model名字\\\', 才會(huì)創(chuàng)建 MyObjectBox對(duì)象 ? ? ?* 對(duì)于MyObjectBox的包名, 目前我發(fā)現(xiàn)的

    2024年01月23日
    瀏覽(27)
  • win11原生應(yīng)用(如相機(jī)、相冊(cè)、日歷、記事本、郵件、畫圖等)英文改中文方法

    win11原生應(yīng)用(如相機(jī)、相冊(cè)、日歷、記事本、郵件、畫圖等)英文改中文方法

    ? ? ? ? 很多小伙伴發(fā)現(xiàn)win11升級(jí)后或者突然有一天自己電腦中的win11原生應(yīng)用win11原生應(yīng)用(如相機(jī)、相冊(cè)、日歷、記事本、郵件、畫圖等)突然都變成了英文界面,然后這些應(yīng)用中還沒有設(shè)置語言的選項(xiàng),那么這個(gè)時(shí)候該怎么辦呢?別著急,這是系統(tǒng)首選語言的鍋,按照以下

    2024年02月08日
    瀏覽(95)
  • 電腦記事本在哪里?電腦桌面顯示記事本要怎么設(shè)置?

    電腦記事本在哪里?電腦桌面顯示記事本要怎么設(shè)置?

    絕大多數(shù)上班族在使用電腦辦公時(shí),都需要隨手記錄一些瑣碎或重要的事情,例如工作注意事項(xiàng)、常用的文案、某項(xiàng)工作的具體要求、多個(gè)平臺(tái)的賬號(hào)和密碼等。于是就有不少小伙伴想要使用電腦記事本軟件來記錄,那么電腦記事本在哪里呢?想要電腦桌面顯示記事本怎么設(shè)

    2024年02月15日
    瀏覽(33)
  • WIN11右鍵打開方式?jīng)]有記事本,記事本無法使用問題

    WIN11右鍵打開方式?jīng)]有記事本,記事本無法使用問題

    背景: 個(gè)人手欠把記事本卸載了,然后又安裝了,結(jié)果記事本可以打開,但是應(yīng)用里面沒有,右擊打開方式也沒有??!(檢索過程發(fā)現(xiàn)很多人人用不了是因?yàn)樯?jí)W11) 問題: 1.如題,右擊打開方式里沒有記事本選項(xiàng)! 2.右擊更多打開方式,通過查找到notepad.exe打開,出現(xiàn)程序

    2024年02月04日
    瀏覽(19)
  • Android:實(shí)現(xiàn)安卓小程序-記事本(備忘錄)的開發(fā),教你如何增加拿到BAT大廠offer幾率

    Android:實(shí)現(xiàn)安卓小程序-記事本(備忘錄)的開發(fā),教你如何增加拿到BAT大廠offer幾率

    public MyBaseAdapter(Context context, List data) { this.context = context; this.data = data; } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public int getCount() { if(data==null) return 0; return data.size(); } } 接著在編寫NoteAdapter類繼承上類,初始化view, 將Note條目的

    2024年04月25日
    瀏覽(91)
  • Android記事本

    Android記事本

    1、項(xiàng)目需求分析 1.1、記事功能需求分析: 1.1.1、顯示記事 用戶打開記事本可以看到之前所寫的所有記事內(nèi)容,進(jìn)入主頁后,軟件應(yīng)該從數(shù)據(jù)庫中搜索出該用戶所寫的全部記事,并將所有的數(shù)據(jù)進(jìn)行顯示。 1.1.2、添加記事 設(shè)置添加按鈕,點(diǎn)擊添加按鈕之后可以編輯記事的標(biāo)題

    2024年02月03日
    瀏覽(34)
  • Vue設(shè)計(jì)記事本

    Vue設(shè)計(jì)記事本

    項(xiàng)目描述 項(xiàng)目實(shí)現(xiàn)功能有:記錄今天要完成的任務(wù),勾選已經(jīng)完成的任務(wù),刪除已經(jīng)完成的全部任務(wù)。 界面展示: 代碼展示 創(chuàng)建一個(gè)Myitem.vue文件夾 2.在components文件夾下創(chuàng)建 Myheader文件夾 3.在同一個(gè)文件夾下創(chuàng)建MyFooter.vue文件夾 4.在同個(gè)文件夾下創(chuàng)建MyList.vue文件 5.再創(chuàng)建

    2024年02月08日
    瀏覽(28)
  • 11 MFC 制作記事本

    11 MFC 制作記事本

    選擇Menu 點(diǎn)擊新建 將內(nèi)容寫入\\\"_\\\"的用 符號(hào) 將菜單加入到窗口中 右鍵選擇添加事件處理程序 點(diǎn)擊確定 Edit設(shè)置多行顯示 Edit設(shè)置按回車能夠換行 Edit設(shè)置豎直方向滾動(dòng) 打開文件代碼 查找與替換對(duì)話框顯示(非模態(tài)對(duì)話框) 對(duì)話框消息與對(duì)話框處理函數(shù) 對(duì)話框處理函數(shù) //note

    2024年02月11日
    瀏覽(22)
  • Android Studio——記事本案例

    Android Studio——記事本案例

    一、布局界面 ? ? ? ? 1、記事本界面布局 main_notepad.xml ? ? ? ? 2、記事本Item布局界面 activity_item.xml ? ? ? ? 3、添加、修改界面布局 activity_record.xml 二、封裝記錄信息實(shí)體類 ? ? ? ? 記事本的每個(gè)記錄都會(huì)有記錄內(nèi)容和記錄時(shí)間這兩個(gè)屬性,因此需要建立一個(gè)實(shí)體類用于存

    2024年02月05日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包