none
C# new 多個picturebox 閃爍 RRS feed

  • 問題

  • 之前有PO過相關文 [閃爍雙緩衝]
    後來實做後並沒有太差的差異
    不知道是我打錯還是怎樣 而後又採用舊文章中有個小時中的雙緩衝連結

    作者在Load裡加入

    this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

    而我使用後 當我在棋盤的父容器上 新增45個PictureBox子容器 依舊會閃爍

    後來有看到一個說法

    用Control.CreateGraphics取得控制項

    但是我並不知道該如何去實做

    雙緩衝到底該如何設置呢...

    ps.雙緩衝的設置應該是在一開始的 private void Start_Load(object sender, EventArgs e){} 吧@@"

    以下是我New的code

            private void New()
            {
                chesschose = new int[45]   { 1, 9,10, 4, 0, 2, 2, 3, 3,         //  預設棋子圖
                                            11,12, 2, 2, 0,12,13, 7, 1,         //  1.兵    2.卒    3.紅炮
                                             0, 0, 0, 0, 0, 0, 0, 0, 0,         //  4.黑炮  5.紅馬  6.黑馬
                                             8, 4, 5, 5, 0, 6, 1, 1, 8,         //  7.紅車  8.黑車  9.紅象
                                             1, 2, 9, 6, 0, 7,10,11,14 };       // 10.黑象 11.紅仕 12.黑士
                                                                                // 13.帥   14.將    
                #region 選擇棋子框框 新增
                /* 選擇象棋的圖示 新增的動作 */
                for (int i = 0; i < 2; i++)
                {
                    ChoseChess[i] = new PictureBox();                                                   //新增PictureBox物件
                    ChoseChess[i].Image = Image.FromFile("Material\\ChoseChess" + i.ToString() + ".png");   //載入圖片
                    ChoseChess[i].Size = new System.Drawing.Size(65, 65);                               //設定大小
                    ChoseChess[i].SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;      //決定顯示模式 {為PictureBox大小}
                    ChoseChess[i].BringToFront();                                                       //為最上層
                    ChoseChess[i].BackColor = System.Drawing.Color.Transparent;                         //透明背景顯示
                    this.Controls.Add(ChoseChess[i]);                                                   //加入至表單
                    ChoseChess[i].Location = new Point(0, 0);                                           //傳入位置
                    ChoseChess[i].Visible = false;                                                      //使用者 看不見此控制象
                }
                #endregion
            
                #region 棋子事件
                int leftNum = 1, topNum = 133; //控制換行座標
                
                for (int i = 0; i < 45; i++)
                {
                    /* 隨機換為設定 */
                    Random ran = new Random();
                    ccount = ran.Next(0, (ran.Next(i, 45)));

                    for (int j = 0; j < 45; j++)
                    {
                        if (!((j == 4 || j == 13 || j == 31 || j == 40 || (j >= 18 && j <= 26)) ||
                             (ccount == 4 || ccount == 13 || ccount == 31 || ccount == 40 || (ccount >= 18 && ccount <= 26))))
                        {
                            chesschosecount = chesschose[j];
                            chesschose[j] = chesschose[ccount];
                            chesschose[ccount] = chesschosecount;
                        }
                        else
                        {
                            continue;
                        }

                    }

                    #region 新增棋子

                    /* 新增picturebox */
                    newPictureBox[i] = new PictureBox();                            //新增picturebox
                    newPictureBox[i].Location = new Point(leftNum * 74, topNum);    //新增座標
                    leftNum++;                                                      //座標右移一位
                    if (leftNum == 10) leftNum = 1;                                 //回到開頭X位置
                    if ((i + 1) % 9 == 0) topNum += 72;                             //換行


                    /* 碰到十字架那行,不載入圖片狀態改為已點擊,就不會做出任何反應 */
                    if (i == 4 || i == 13 || i == 31 || i == 40 || (i >= 18 && i <= 26))
                    {
                        newPictureBox[i].Image = null;
                        chessarray[i] = 1;
                    }
                    else
                    {
                        newPictureBox[i].Image = Image.FromFile("chess\\back.png");
                        chessarray[i] = 0;
                    }
                    /* 棋子大小、名稱、圖示、指向事件設定 */
                    newPictureBox[i].Width = 65;
                    newPictureBox[i].Height = 65;
                    newPictureBox[i].Name = i.ToString();

                    this.Controls.Add(newPictureBox[i]);                                                //加入至視窗內
                    newPictureBox[i].MouseDown += new MouseEventHandler(this.newPictureBox_MouseDown);  //將事件指向同一委派
                    newPictureBox[i].BackColor = System.Drawing.Color.Transparent;          //底色透明化 {要先處理完 是背景透明的圖才能做}
                    newPictureBox[i].BringToFront();                                        //移至最上層
                    newPictureBox[i].Parent = pictureBox33;                                 //使象棋可以透視picturebox 而不會只透視form得背景
                    newPictureBox[i].SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
                    
                    #endregion
                }
                #endregion

                #region 物件相穿透

                /* 使棋盤、背景可以互相穿透 P.S. 棋盤格必須透明處理過 */
                pictureBox33.Parent = pictureBox34;
                pictureBox33.Location = new Point(0,-40);    //位移校正

                /* 結束訊息視窗 可以互相穿透 */
                pictureBox42.Parent = pictureBox41;
                pictureBox43.Parent = pictureBox41;
                pictureBox44.Parent = pictureBox41;
                pictureBox42.Location = new Point(105, 70);
                pictureBox43.Location = new Point(55, 170);
                pictureBox44.Location = new Point(305, 170);

                /* 玩家訊息欄穿透 */
                InformationPlay.Parent = pictureBox33;
                InformationPlay.Location = new Point(68, 485);

                #endregion

                
                pictureBox41.Visible = false;       //結束訊息視窗隱藏
                panel3.Visible = false;             //更多設定畫面隱藏

            }

    2012年7月26日 上午 04:30

解答

  • 在你產生 45 個棋子的迴圈外. 產生前加上  this.SuspendLayout  , 產生後加上 this.ResumeLayout() 試試看

    另外雙緩衝參考小章這一篇

    [WinForm] 如何使 控制項 不閃爍 /How to use double buffer for controls


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。



    2012年7月26日 上午 05:43
    版主
  • 繪圖的問題可能需要再找別的方案.

    不過我倒發現你寫程式的基本觀念很模糊

    例如: public partial class kk : PictureBox <-- 你知道 partial 是幹嘛的嗎 ?

    另外:

            public kk()
            {
                InitializeComponent();

                this.DoubleBuffered = true;
            }

    只要這樣就好了吧, 你的棋子總不會還有子控制項需要遞迴設定吧.

    然後你這邊:

    newPictureBox[i] = new PictureBox();   有把型別改成 kk 嗎 ?

    寫程式不能光抄, 要去想為什麼這麼做, 這麼做了還有哪些地方需要再處理.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年7月26日 上午 08:06
    版主
  • 你可以畫好到記憶體內的 Image 後,用

    DrawImage 畫到目前的畫面

    這樣會比把 Image 只給 .Picture 或是背景快,也不會閃爍。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年7月26日 下午 01:14
  • 這樣說吧,為什麼要記憶體繪圖?

    因為你每個畫在畫面上的動作會引起畫面立即更新,所以會閃爍。

    記憶體畫完後,要如何指到畫面上?

    一種是讓某個屬性等於這個記憶體圖檔,一個是把這個記憶體圖檔畫到畫面上。

    由於 .Net 自動動作太多,你若是用屬性的話,也會發生閃爍,但只會閃 1 ~ 2 次,但是你用 DrawImage 的話,速度比較快,就不會有感覺。

    當然如果還嫌 DrawImage 的話,就要用 Direct2D 來跳過 GDI 層,因為 .Net 是呼叫 GDI+ ,所以還是在 GDI 層上。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年7月31日 下午 03:14

所有回覆

  • 在你產生 45 個棋子的迴圈外. 產生前加上  this.SuspendLayout  , 產生後加上 this.ResumeLayout() 試試看

    另外雙緩衝參考小章這一篇

    [WinForm] 如何使 控制項 不閃爍 /How to use double buffer for controls


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。



    2012年7月26日 上午 05:43
    版主
  • 在你產生 45 個棋子的迴圈外. 產生前加上  this.SuspendLayout  , 產生後加上 this.ResumeLayout() 試試看

    另外雙緩衝參考小章這一篇

    [WinForm] 如何使 控制項 不閃爍 /How to use double buffer for controls


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。



      this.SuspendLayout () this.ResumeLayout()
    這方式 我之前嘗過了 那剛剛也在測試了一次 閃爍效果依然沒有改善

    我想我先試試看 這篇文章內的作法好了
    2012年7月26日 上午 06:06
  • 在你產生 45 個棋子的迴圈外. 產生前加上  this.SuspendLayout  , 產生後加上 this.ResumeLayout() 試試看

    另外雙緩衝參考小章這一篇

    [WinForm] 如何使 控制項 不閃爍 /How to use double buffer for controls


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。



    暈倒~

    我試了他的方法 似乎 也沒有改善 我的棋子重繪 我的媽呀
    照他的做法 我的double buffer 也顯示為ture了 但是 重繪的效果依然還在

    我也試了 用

             public Start()
            {
                InitializeComponent();

                this.DoubleBuffered = true;
                this.SetStyle(ControlStyles.UserPaint |
                              ControlStyles.AllPaintingInWmPaint |
                              ControlStyles.DoubleBuffer, true);
            }
    或是
             public Start()
            {
                InitializeComponent();

                pictureBox33.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance |
                                        System.Reflection.BindingFlags.NonPublic).SetValue(pictureBox33, true, null);
            }

    pictureBox33為棋盤父容器

    2012年7月26日 上午 06:38
  • 在你產生 45 個棋子的迴圈外. 產生前加上  this.SuspendLayout  , 產生後加上 this.ResumeLayout() 試試看

    另外雙緩衝參考小章這一篇

    [WinForm] 如何使 控制項 不閃爍 /How to use double buffer for controls


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。



    在試用他的方式時 有許多地方我顯示錯誤@@"! 可是我無腦 還請大大指點

        private PropertyInfo _PropertyInfo = null;

        this._PropertyInfo = this.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
        foreach (Control rootCtrl inthis.Controls)
        {
            this._PropertyInfo.SetValue(rootCtrl, true, null); 
    
            if (rootCtrl.HasChildren)
                SearchControl(rootCtrl);
        }
    #region 遞迴
    void SearchControl(Control Ctrl)
    {
        foreach (Control rootCtrl in Ctrl.Controls)
        {
            Debug.WriteLine(rootCtrl.Name + " 建立DoubleBuffer");
            this._PropertyInfo.SetValue(rootCtrl, true, null);
            if (rootCtrl.HasChildren)
                SearchControl(rootCtrl);
            else
                break;
        }
    }
    #endregion

    這些東西 我其實不太懂哪些是要改成控制項的地方 煩請大大解惑了>.<



    2012年7月26日 上午 06:45
  • 有錯誤訊息請明確說明.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年7月26日 上午 06:56
    版主
  • 有錯誤訊息請明確說明.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    1.private PropertyInfo _PropertyInfo = null;

    2.3.4.this._PropertyInfo = this.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);

    5.this._PropertyInfo.SetValue(rootCtrl, true, null);

    6.Debug.WriteLine(rootCtrl.Name + " 建立DoubleBuffer");

    7.this._PropertyInfo.SetValue(rootCtrl, true, null);

    錯誤    2    'WindowsFormsApplication1.Start' 不包含 '_PropertyInfo' 的定義,也找不到擴充方法 '_PropertyInfo' 來接受型別 'WindowsFormsApplication1.Start' 的第一個引數 (您是否遺漏 using 指示詞或組件參考?)
    錯誤    5    'WindowsFormsApplication1.Start' 不包含 '_PropertyInfo' 的定義,也找不到擴充方法 '_PropertyInfo' 來接受型別 'WindowsFormsApplication1.Start' 的第一個引數 (您是否遺漏 using 指示詞或組件參考?)
    錯誤    7    'WindowsFormsApplication1.Start' 不包含 '_PropertyInfo' 的定義,也找不到擴充方法 '_PropertyInfo' 來接受型別 'WindowsFormsApplication1.Start' 的第一個引數 (您是否遺漏 using 指示詞或組件參考?)

    錯誤    1    必須是類別、委派、列舉、介面或結構
    錯誤    3    名稱 'BindingFlags' 不存在於目前內容中
    錯誤    4    名稱 'BindingFlags' 不存在於目前內容中
    錯誤    6    名稱 'Debug' 不存在於目前內容中


    2012年7月26日 上午 07:01
  • 因為你沒有加入應有的命名空間.

    PropertyInfo 類別 , 這個給你參考, 我記得之前教過你怎麼查命名空間吧.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年7月26日 上午 07:08
    版主
  • 因為你沒有加入應有的命名空間.

    PropertyInfo 類別 , 這個給你參考, 我記得之前教過你怎麼查命名空間吧.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    對齁!!!!!
    抱歉 學藝不精...

    還有一個小問題...目前測試後 因為我進入遊戲前 有個設定 會進入設定畫面
    那個設定畫面也會有閃爍現象
    我目前改完的程式 使得設定畫面不太有閃爍現象了但是!!!!

    我的棋子一樣還是在閃爍耶... 無言
    我得更多設定那邊 因為有很多個checkbox所以 也會閃爍

    DoubleBuffer不是應為整個Form嗎@@? 怎會這樣

    2012年7月26日 上午 07:22
  • 因為你沒有加入應有的命名空間.

    PropertyInfo 類別 , 這個給你參考, 我記得之前教過你怎麼查命名空間吧.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    剛剛測試完後 發現 如果我是已經設置的控制項

    他會有DoubleBuffer的效果 繪製完再輸出 並不會閃爍
    但是棋子是用new出來 原先並沒有所謂的控制項拖曳到Form上的動作 而閃爍一樣嚴重

    這兩者對於DoubleBuffer 好像會有差別 困惑中...

    2012年7月26日 上午 07:30
  • 用這一招試試, 繼承 pictureBox 做一個棋子的類別, 在新類別的建構函式直接設定 doubleBuffer


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2012年7月26日 上午 07:51
    版主
  • 用這一招試試, 繼承 pictureBox 做一個棋子的類別, 在新類別的建構函式直接設定 doubleBuffer.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    是指這樣嗎

         public partial class Start : Form{}

         public partial class kk : PictureBox
        {
            private PropertyInfo _PropertyInfo = null;

            public kk()
            {
                InitializeComponent();

                this.DoubleBuffered = true;
                this.SetStyle(ControlStyles.UserPaint |
                              ControlStyles.AllPaintingInWmPaint |
                              ControlStyles.DoubleBuffer, true);

                this._PropertyInfo = this.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
                foreach (Control rootCtrl in this.Controls)
                {
                    this._PropertyInfo.SetValue(rootCtrl, true, null);

                    if (rootCtrl.HasChildren)
                        SearchControl(rootCtrl);
                }
            }

            private void InitializeComponent()
            {
                throw new NotImplementedException();
            }

            #region 遞迴
            void SearchControl(Control Ctrl)
            {
                foreach (Control rootCtrl in Ctrl.Controls)
                {
                    this._PropertyInfo.SetValue(rootCtrl, true, null);
                    if (rootCtrl.HasChildren)
                        SearchControl(rootCtrl);
                    else
                        break;
                }
            }
            #endregion

            /* 載入初始設定 */
            private void kk_Load(object sender, EventArgs e)
            {

            }

        }

    如果是的話 目前嘗試過後是沒有反應~"~

    2012年7月26日 上午 08:00
  • 繪圖的問題可能需要再找別的方案.

    不過我倒發現你寫程式的基本觀念很模糊

    例如: public partial class kk : PictureBox <-- 你知道 partial 是幹嘛的嗎 ?

    另外:

            public kk()
            {
                InitializeComponent();

                this.DoubleBuffered = true;
            }

    只要這樣就好了吧, 你的棋子總不會還有子控制項需要遞迴設定吧.

    然後你這邊:

    newPictureBox[i] = new PictureBox();   有把型別改成 kk 嗎 ?

    寫程式不能光抄, 要去想為什麼這麼做, 這麼做了還有哪些地方需要再處理.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年7月26日 上午 08:06
    版主
  • 你這標解答是它不閃了, 還是 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年7月26日 上午 08:10
    版主
  • 你這標解答是它不閃了, 還是 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    喔喔 我還在測試~"~ 怎麼用都怪怪的

    我在想想看該怎麼解決吧 感謝Bill 大大 :D

    2012年7月26日 上午 09:01
  • 不然讀一讀心冷大常推薦的 [搜尋既有討論: 記憶體繪圖]

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年7月26日 上午 09:42
    版主
  • 你可以畫好到記憶體內的 Image 後,用

    DrawImage 畫到目前的畫面

    這樣會比把 Image 只給 .Picture 或是背景快,也不會閃爍。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年7月26日 下午 01:14
  • 畫到 Image 用DrawImage 畫到目前的畫面

    可以舉個例嗎@@?!~ 因為我好像沒有用過 DrawImage 不太懂 >.<

    2012年7月31日 上午 01:24
  • 關鍵字都給你了

    google  一下都不會嗎?

    MSDN 就有了..... 


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2012年7月31日 上午 04:58
  • = =!! 我找過MSDN

    我的問題是

    畫好到記憶體內的 Image 後,用

    DrawImage 畫到目前的畫面

    我不太懂

    怎樣先畫好到記憶體內 還是說 就像是下面MSDN的資料寫得這樣~

    以指定的大小,在指定的位置繪製指定的 Image

    publicvoid DrawImageRectF(PaintEventArgs e) { // Create image. Image newImage = Image.FromFile("SampImag.jpg"); // Create rectangle for displaying image. RectangleF rect = new RectangleF(100.0F, 100.0F, 450.0F, 150.0F); // Draw image to screen. e.Graphics.DrawImage(newImage, rect); } 不太清楚是不是為上述大大說的


    2012年7月31日 上午 05:11
  • 這樣說吧,為什麼要記憶體繪圖?

    因為你每個畫在畫面上的動作會引起畫面立即更新,所以會閃爍。

    記憶體畫完後,要如何指到畫面上?

    一種是讓某個屬性等於這個記憶體圖檔,一個是把這個記憶體圖檔畫到畫面上。

    由於 .Net 自動動作太多,你若是用屬性的話,也會發生閃爍,但只會閃 1 ~ 2 次,但是你用 DrawImage 的話,速度比較快,就不會有感覺。

    當然如果還嫌 DrawImage 的話,就要用 Direct2D 來跳過 GDI 層,因為 .Net 是呼叫 GDI+ ,所以還是在 GDI 層上。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年7月31日 下午 03:14
  • 你把先前關鍵字記憶體繪圖加上 DrawImage 再去搜尋看看:

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=%e8%a8%98%e6%86%b6%e9%ab%94%e7%b9%aa%e5%9c%96%20DrawImage


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年7月31日 下午 03:16