none
請問一個矩形繪圖的語法小問題,以及滑鼠移動的功能

    問題

  • 各位前輩好

    我的目的是,一個PICTUREBOX上,按下按鈕後可產生一個透明矩形框框,位置大小是內建的

    我希望使用者可以用滑鼠壓著它,上下左右拖曳,並且可在一些欄位輸入數值來改變此矩形的長寬和旋轉角度,

    這些內容還在收集資料中

    現在遇到最基本的繪圖語法問題,就是產生矩形的動作,我手寫如下

    private void button5_Click(object sender, EventArgs e)
    {
                Bitmap bmp = new Bitmap(pictureBox2.Width, pictureBox2.Height);
                Graphics g = System.Drawing.Graphics.FromImage(bmp);
                Pen drawpen = new Pen(Color.Blue, 1);
                Rectangle rr = new Rectangle(50, 50, 200, 100);//第一次產生的內建值

                g.DrawRectangles(drawpen, rr);//<----我想這邊一定有錯,但改不出解

                pictureBox2.Image = bmp;
    }

    因為都是自己手動寫的,有些語法觀念有誤,還請前輩修正一下

    (或是說,其實不應該這樣寫嗎?)

    順道再問,因為我之後還有要對此矩形作旋轉的功能

    請問我這樣產生的矩形可以直接用函式在PICTUREBOX上旋轉嗎?還是要用重新用數學內插法來算?

    目前一步一步釐清觀念中

    感謝各位

     

    2010年3月19日 上午 07:22

解答

所有回覆

  • 如果你的需求並沒有限制需要用哪個dotnet framework,你可以使用WPF來解決你目前所提的問題.
    Window form 的 GDI+只能簡化繪製圖形(元件)的程序,但不能處理繪製外的其他功能.
    而WPF的好處是除了繪製圖形外WPF元素本身就是控制項,而WPF針對目前2D所需要用到的基本演算法幾乎都有.

    2010年3月19日 上午 07:32
  • 2010年3月19日 上午 07:34
  • 很謝謝兩位回覆~

    感謝joe 先生提示

    我才發現自己的DrawRectangles部份寫錯

    但看到programlin的回覆是感到有些意外,原來GDI+的部份只能繪圖形

    因此如果我想要讓使用者搬移那方框物件(甚至旋轉)都是在GDI無法處理的嗎?

    我查尋了一些WPF的相關資訊,目前找的資料多半是用影像BITMAP的運算

    目前是還在摸索中,

    但想請教的是,我是想畫一個透明的方框來在PICTUREBOX上進行動作(移動和旋轉),而不是對整張影像動作

    如果真的只適合用WPF,可否簡單提示一下這樣的寫法嗎?或是有無指導繪製部份的教學資料,

    想大概了解一下如何來寫,在此感謝

     

    PS WPF開發需要灌什麼元件嗎?看到的資料都寫名為XAML的內容,是有點搞不清楚....

     

     

    2010年3月19日 上午 09:00
  • 2010年3月19日 上午 09:14
  • 簡單一點,去抓現成的 VBPowerPack 3.0 在 C# 內使用

    想自己寫的話,VB 版公告區有 PowerPack 做成元件前微軟釋出的原始碼連結,看完後自己改寫成 C#。

    你也可以先看既有討論關於 選取框 的做法:

    http://www.google.com.tw/search?hl=zh-TW&source=hp&q=%E9%81%B8%E5%8F%96%E6%A1%86+site%3Asocial.msdn.microsoft.com%2FForums%2Fzh-TW%2F


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月19日 下午 03:10
  • 謝謝回覆

    幾為前輩提的WPF我會另外學習,可能短時間還完成不了

    我可能先照心冷先生提的方式來找資料

    另外想再問一下心冷先生所提的"VB 版公告區有 PowerPack 做成元件前微軟釋出的原始碼連結"

    想請教一下有沒有那篇文章的關鍵字或標題

    我在公告區找了一會還沒找到您說的那一篇,請您指引一下位置,我去找來看~感謝~

    目前可能先學習VB方式有沒有辦法做(因為也有想過用vb來做做看)

    我自己是另外在想一個問題

    如果我所希望的目的,(就是設計選取方框,且可讓USER調大小和角度,在PICTUREBOX上移動)

    如果在C#上是必須用WPF的方式來做

    那麼同樣的需求在VB6會是怎麼樣的設計呢?

    還是要靠WPF的方式嗎?

    在WPF出現以前,VB6自己有沒有可能這樣做到呢?

    (我自己是很天真的想,VB6用frame設計可不可以去移動那個框框,但旋轉角度就想不到了..)

    如果額外的問題在這板問不適合,我會再轉到VB板去問的,謝謝~

     

     

    2010年3月20日 上午 01:46
  • 本站的 VB 版的公告區有三篇,兩篇是講版規的,只有一篇講範例... 這樣會很難找嗎?範例總不會放在版規內吧...

    還是你問的是哪個範例?

    VB6 可以阿~ 但要做旋轉的話就要完全用 API 去兜出來。

    以前有本翻譯書,書名類似 多媒體應用 for Visual Basic X.0 ,同一作者,從 VB 3.0 出到 VB 5.0 ,裡面專門介紹這種技術,基本上是建立一個 hRegion ,就可以用 InRegion 來判斷滑鼠動作是否在此區域內。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月20日 上午 02:59
  • 感謝心冷先生回覆

    我後來是找到vb公告的那一個範例http://msdn.microsoft.com/en-us/library/ms973830.aspx

    也一直在研究中

    由於可能會改成vb6來做拖曳的介面,因此暫時不考慮c#和WPF

    我自己所想到的作法是已知矩形四點座標後用API Polygon來畫線,

    由於此矩形是可讓使用者旋轉或放大的

    因此我想到的是每次滑鼠動作後便進行重繪線條(之前的線條去掉,但保留Picturebox的影像)

    對四個座標作新位置的運算後才畫線

    之後會有一個按鈕動作是將框取的內容 單獨取成圖片

    也就是周圍清掉(變黑之類的),保留框內的區域,

    我是預定顯示在另一個picturebox上

    由於此框可能旋轉過,所以我是採用對多邊形處理的api CreatePolygonRgn來實作看看

    程式如下

    Private Sub Command2_Click()
    Dim hPen     As Long
    Dim hPenOld     As Long
    Dim hBrush     As Long
    Dim hBrushOld     As Long
    Dim pl As Long
    
    Dim hRgn As Long
    Dim Retval As Long
    Dim PolyPoints(4) As POINTAPI
    
        PolyPoints(0).X = 50
        PolyPoints(0).Y = 50
    
        PolyPoints(1).X = 250
        PolyPoints(1).Y = 50
    
        PolyPoints(2).X = 250
        PolyPoints(2).Y = 250
        
        PolyPoints(3).X = 50
        PolyPoints(3).Y = 250
            
        hPen = CreatePen(0, 1, vbBlue)
        hPenOld = SelectObject(Picture1.hDC, hPen)
    
        hRgn = CreatePolygonRgn(PolyPoints(0), 4, WINDING)
        Retval = SetWindowRgn(Picture1.hWnd, hRgn, True)
    
        SelectObject Picture1.hDC, hRgn
        SelectObject Picture1.hDC, hPenOld
        SelectObject Picture1.hDC, hBrushOld
        DeleteObject hPen
        DeleteObject hBrush
        
         Picture1.Refresh
    
    End Sub

    執行後可在畫面上看到挖出框框以內的區域,視覺效果是我要的

    但對picturebox存檔後卻還是原始圖

    覺得有點疑惑,是否是我少作什麼步驟,請前輩指教一下

    ps 不好意思,內容偏到vb去了,我是否應轉到vb的論壇再po文來問?如果是的話我會另外去問的

    謝謝

     

     

     

    2010年3月23日 上午 03:48
  • VB6 比較簡單,把 AutoRedraw 打開,存 Image

    VBNET 複雜多了。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月23日 下午 12:29
  • 心冷先生您好

    我是在VB6寫的

    然後有對picturebox的AutoRedraw打開了

    然後是用SavePicture Picture1.Image, "C:\\123.jpg"  接在上述的程式碼後面來存檔

    存檔結果還是一樣存的是原始圖片

    而不是我希望程式所裁減的多邊形部分擷圖

    在程式執行上有看到擷取那部分,但存檔還是一樣原始圖

    還請各位指導一下是否有哪邊做錯

    謝謝

     

     

    2010年3月24日 上午 01:09
  • VB6 圖層觀念先看既有討論:

    http://www.google.com.tw/search?hl=zh-TW&q=VB6+%E5%9C%96%E5%B1%A4+hDC+Picture+Image+site%3Amicrosoft.com

     

    如果你是要存框線內的,不是把框線連同圖檔存下來,用 PaintPicture 畫到一個 PictureBox2.Visible = False ,再存 PicturBox2 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年3月24日 下午 12:46