1. 程式人生 > >C#入門學習-----簡單畫圖程式

C#入門學習-----簡單畫圖程式

歡迎大家提出意見,一起討論!

通過本例項瞭解如何在窗體上繪製各種圖形,如矩形、橢圓、線條、文字等。執行效果如下:

實現過程:

(1) 新建窗體應用程式

(2) 新增一個MenuScrip控制元件;新增一個ToolScrip控制元件。

在ToolScrip控制元件中對每個單元,要將DisplayStyle屬性改為Text

(3)程式程式碼。

1、新建選單事件主要用白色清除窗體的背景,從而實現“檔案新建”功能

  private void 新建ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Graphics g = this.CreateGraphics();
            g.Clear(backColor);
            toolStrip1.Enabled = true;
            //建立一個Bitmap
            theImage = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height);
            editFileName = "新建檔案";
            //修改視窗標題
            this.Text = "MyDraw\t" + editFileName;
            ig = Graphics.FromImage(theImage);
            ig.Clear(backColor);
        }

2、開啟事件用於開啟“開啟檔案”對話方塊,並選擇相應的圖片,將圖片繪製到窗體上.

  private void 開啟ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openFileDialog1.Multiselect = false;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                //修改視窗標題
                this.Text = "MyDraw\t" + openFileDialog1.FileName;
                editFileName = openFileDialog1.FileName;
                theImage = Image.FromFile(openFileDialog1.FileName);
                Graphics g = this.CreateGraphics();
                g.DrawImage(theImage, this.ClientRectangle);
                ig = Graphics.FromImage(theImage);
                ig.DrawImage(theImage, this.ClientRectangle);
                //ToolBar可以使用了
                toolStrip1.Enabled = true;
            }
        }



(3) 儲存選單項的Click事件用於將窗體背景儲存為BMP格式的圖片

private void 儲存ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            saveFileDialog1.Filter = "影象(*.bmp)|*.bmp";
            saveFileDialog1.FileName = editFileName;
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                theImage.Save(saveFileDialog1.FileName, ImageFormat.Bmp);
                this.Text = "MyDraw\t" + saveFileDialog1.FileName;
                editFileName = saveFileDialog1.FileName;
            }
        }


(4) 在Paint事件中將Image中儲存的影象,繪製出來

 private void Form1_Paint(object sender, PaintEventArgs e)
        {
            //將Image中儲存的影象,繪製出來
            Graphics g = this.CreateGraphics();
            if (theImage != null)
            {
                g.Clear(Color.White);
                g.DrawImage(theImage, this.ClientRectangle);
            }
        }


 (5)新增Frm_Text.cs文字輸入框。

    新增一個Window窗體,取名為Frm_Text,然後對窗體的屬性修改:

把FormBorderStyle屬性改為 None;

把Modifiers的屬性改為 Public

(6) 在窗體的MouseDown事件中,如果當前繪製的是字串,在滑鼠的當前位置顯示文字框;如果繪製的是圖開,設定圖形的起始位置。

  private void Frm_Main_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                //如果選擇文字輸入,則開啟strInput窗體
                if (drawTool == drawTools.String)
                {
                    Frm_Text inputBox = new Frm_Text();
                    inputBox.StartPosition = FormStartPosition.CenterParent;
                    if (inputBox.ShowDialog() == DialogResult.OK)
                    {
                        Graphics g = this.CreateGraphics();
                        Font theFont = this.Font;
                        g.DrawString(inputBox.textBox1.Text, theFont, new SolidBrush(foreColor), e.X, e.Y);
                        ig.DrawString(inputBox.textBox1.Text, theFont, new SolidBrush(foreColor), e.X, e.Y);
                    }
                }
                //如果開始繪製,則開始記錄滑鼠位置
                else if ((isDrawing = !isDrawing) == true)
                {
                    startPoint = new Point(e.X, e.Y);
                    oldPoint = new Point(e.X, e.Y);
                }
            }
        }

(7) 在窗體的MouseMove 事件中,根據滑鼠移動的大小繪製指定的圖形.

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            Graphics g;
            g = this.CreateGraphics();

            if (isDrawing)
            {
                switch (drawTool)
                {
                    case drawTools.None:
                        break;
                    case drawTools.Pen:
                        //從上一個點到當前點繪製線段
                        g.DrawLine(new Pen(foreColor, 1), oldPoint, new Point(e.X, e.Y));
                        ig.DrawLine(new Pen(foreColor, 1), oldPoint, new Point(e.X, e.Y));
                        oldPoint.X = e.X;
                        oldPoint.Y = e.Y;
                        break;
                    case drawTools.Line:
                        //首先恢復此次操作之前的影象,然後再新增Line
                        this.Frm_Main_Paint(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));
                        g.DrawLine(new Pen(foreColor, 1), startPoint, new Point(e.X, e.Y));
                        break;
                    case drawTools.Ellipse:
                        //首先恢復此次操作之前的影象,然後再新增Ellipse
                        this.Frm_Main_Paint(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));
                        g.DrawEllipse(new Pen(foreColor, 1), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
                        break;
                    case drawTools.Rectangle:
                        //首先恢復此次操作之前的影象,然後再新增Rectangle
                        this.Frm_Main_Paint(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));
                        g.DrawRectangle(new Pen(foreColor, 1), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
                        break;
                    case drawTools.String:
                        break;
                    case drawTools.Rubber:
                        //用背景色繪製寬線段
                        g.DrawLine(new Pen(backColor, 20), oldPoint, new Point(e.X, e.Y));
                        ig.DrawLine(new Pen(backColor, 20), oldPoint, new Point(e.X, e.Y));
                        oldPoint.X = e.X;
                        oldPoint.Y = e.Y;
                        break;
                }
            }
        }


(8) 在窗體的MouseUp事件中,根據使用者選擇的畫筆,繪製直線,橢圓或矩形等指定圖形。

private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            isDrawing = false;
            switch (drawTool)
            {
                case drawTools.Line:
                    ig.DrawLine(new Pen(foreColor, 1), startPoint, new Point(e.X, e.Y));
                    break;
                case drawTools.Ellipse:
                    ig.DrawEllipse(new Pen(foreColor, 1), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
                    break;
                case drawTools.Rectangle:
                    ig.DrawRectangle(new Pen(foreColor, 1), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
                    break;
            }
        }


=============================================================================================================

這裡解釋為什麼在拉直線時線會跟著滑鼠動,而用選擇畫筆時移動滑鼠就會畫出線。

這裡有兩個Graphics:

(1) 真實的場景graphics.   它它上面畫出的畫面就是我個看到的畫面。

     eg:

               private void Form1_Paint(object sender, PaintEventArgs e)
             {
                     //將Image中儲存的影象,繪製出來
                      Graphics g = this.CreateGraphics();

(2)做為臨時儲存用的Graphic.

它在新建的時候建立:

 //建立一個Bitmap
            theImage = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height);
            editFileName = "新建檔案";
            //修改視窗標題
            this.Text = "MyDraw\t" + editFileName;
            ig = Graphics.FromImage(theImage);
            ig.Clear(backColor);


顯示出來: 把theImage顯示出來就是把以前儲存在ig裡的東西顯示出來了

 private void Frm_Main_Paint(object sender, PaintEventArgs e)
        {
            //將Image中儲存的影象,繪製出來
            Graphics g = this.CreateGraphics();
            if (theImage != null)
            {
                g.Clear(Color.White);
                g.DrawImage(theImage, this.ClientRectangle);
            }
        }


在Form1_MouseMove裡

如果是畫筆,那麼把影象儲存到了兩個graphic中,這樣我們可以看到移動的畫,最後也將顯示所有畫。

如果直線或矩形,那麼只先畫到第一個graphics裡,在滑鼠放開時才畫到第二個graphic裡。

相關推薦

C#入門學習-----簡單畫圖程式

歡迎大家提出意見,一起討論! 通過本例項瞭解如何在窗體上繪製各種圖形,如矩形、橢圓、線條、文字等。執行效果如下: 實現過程: (1) 新建窗體應用程式 (2) 新增一個MenuScrip控制元件;新增一個ToolScrip控制元件。 在ToolScrip控制元件中

c#入門學習-Action和Func的使用

console main oid -- ldl 產生 圖書館 情況 tps 我的理解就是:Action和Func就是官方聲明好的代理using System; namespace funcActionDemo{ class MainClass {

C/C++入門學習

C++部落格 C++小白筆記: 1.簡單的c++程式 1.1簡單的C++程式helloworld #include "iostream" //Iostream時iostream.h的加強版本,是為了與C語言做區別去掉了.h using namespace std; //使用名稱空

Arduino 入門學習筆記3 程式結構和常用函式

Arduino 的程式可以劃分為三個主要部分:結構、變數(變數與常量)、函式。 函式 1、setup() 當Arduino開始的時候被呼叫。用它來初始化變數,設定引腳執行模式,啟動庫檔案等。setup函式只執行一次,每次上電或者被重置時候呼叫。 int buttonPin

C++入門學習例項

C++面向物件:   類,是建立物件的模板,一個類可以建立多個相同的物件;物件,是類的例項,是按照類的規則建立的。   類是抽象的,不佔用記憶體,而物件是具體的,佔用儲存空間。   用struct宣告的結構體型別實際上也就是類。用struct宣告的類,如果

C編寫的簡單病毒程式

C,是程式設計師最常用的程式語言之一。類似C等高階程式語言為開發人員提供了大量的內建函式,可以方便程式設計師編寫各種跨平臺的安心的應用程式設計。對於編寫病毒而言,也方便了程式設計師來用自己擅長的語言來編寫,但同時也帶來了很多弊端。第一,許多高階語言的程式設計並不基於底層系

GTK簡單畫圖程式

最近做了個簡單的畫圖程式,改自gtk example中的scribble-simple的程式,原來的例子是將報出來的點為基準然後向周圍擴散了一個區域。 現在是將報出來的點畫成線, /* GTK - The GIMP Toolkit * Copyright (C) 1995

【筆記】C++入門學習第一課(Hello World!)

ubun names 鏈接 簡介 sudo ont 大小 ostream 編寫 學習環境:Ubuntu14.04、gcc version 4.8.4 、Notepad++ 在Linux下安裝g++命令:sudo apt-get install g++(需要輸入登錄密碼獲得

C語言入門學習(02)——HelloWorld程式分析&printf函式的用法

  接著上一篇 C語言入門學習(01)——C程式設計環境的搭建及HelloWorld程式 繼續 //本文不是最終版本,該教程還在編寫整理中。 目錄 Part_2.1:HelloWorld程式的解釋 Part_2.2:printf函式的用法 P

C語言入門學習(01)——C程式設計環境的搭建及HelloWorld程式

博主是大二學生,接觸C語言也有兩年了,這兩年期間參加過不少的專案和比賽,也都拿到了還不錯的成績,暑假計劃寫一個C語言完全零基礎入門教程,對自己的C語言學習做一個總結。同時如果自己所寫的內容能幫到初學C語言的人,那真的是一件很開心的事情。 想學好C語言,一定要多多練習,因此後面的文章會有大量的

python中的networkx包學習——簡單的網路畫圖入門

關於圖的基本操作 建立一個空圖 import networkx as nx G=nx.Graph() #建立一個空圖 G=nx.DiGraph() #建立一個有向空圖 為網路新增節點 G.add_node(a point)#給網路新增節點 G.add_nodes_from(

C語言學習筆記(一)—— 初識C語言並寫一個簡單C語言程式

1、目的碼檔案、可執行檔案、庫用C語言編寫程式時,編寫的內容被儲存在文字檔案中,該檔案被稱為原始碼檔案,檔案以.c結尾。目標檔案和可執行檔案都是由機器語言指令組成的,但是目標檔案只包含編譯器為你編寫的程式碼翻譯的機器語言程式碼,可執行檔案還包含你編寫的程式中使用的庫函式和啟動

JSTL簡單入門學習實例

out 簡單 items fun lib clas charset class dsm Maven依賴: <dependency> <groupId>javax.servlet<

&lt;C#入門經典&gt;學習筆記1之初識C#

ack fad 浮點 2.0 十六進制 float 一個 sca 每一個 序言 選擇《 C#入門經典第五版》作為自學書籍,以此記錄學習過程中的筆記與心得。 C#簡單介紹 1. C#是一種塊結構的語言 2. C#區分大寫

Spark的Streaming和Spark的SQL簡單入門學習

gen 官方文檔 文檔 zed pairs running eas SM from 1、Spark Streaming是什麽? a、Spark Streaming是什麽?  Spark Streaming類似於Apache Storm,用於流式數據的處理。根據其官方文

vue簡單入門-學習筆記

訪問 unit test sts 運行 9.png dom ould 完成後 是否 安裝 安裝node.js; 安裝全局vue-cli腳手架,用於幫助搭建所需的模板框架:npm install -g vue-cli; 安裝完成後可以直接在cmd中輸入vue查看是否出現

Boost程式入門學習

優秀的程式設計師要能夠知其所以然,而不是重複的造輪子,近期目標是學習優秀的第三方庫,同時嘗試使用C++11/14新特性,然後吸取精華用到專案中去,加油~ 參考書籍: 羅劍鋒寫的《Boost程式庫完全開發指南》和《Boost程式庫探祕》,前者是一個大體的介紹,後者是針對一

C&C++入門篇---CodeBlocks的安裝與簡單配置

最近接觸C&C++語言,很多人都在用microsoft visual c++軟體,無奈本人安裝各種版本,由於與電腦不匹配,始終裝不上!有人說道可以通過換系統辦法解決,總不能為了裝這個軟體,而把我其它軟體全部解除安裝。所以就想到了這個軟體,簡單介紹下此軟體。 Code::Bloc

SDL 簡單入門學習

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MATLAB入門學習-#5-M檔案(MATLAB)程式基礎

MATLAB入門學習-#5-M檔案(MATLAB)程式基礎 1.was ist M檔案... 2.程式控制結構 3.函式檔案! 正式開始之前,先來兩個學習中學到的小TIP: 1.matlab程式中,中括號內容一般都是可以省略的東西。