none
在Panel上面畫圖的問題... RRS feed

  • 問題

  • 我可能有一個長寬約(104287,184)的圖要畫在營幕上

    我本來是畫在Panel上面(用Panel的Paint1_Paint方法)

    但是設定Size卻只有(65535,184)

    有什麼比較好的方法解決呢?

    另外如果我想在Panel上面要有ToolTip的功能

    有什麼比較簡單的方式呢?


    None

    2013年1月29日 上午 05:20

解答

  • 要用 VBNET 畫圖,先把這本書翻過:
    https://www.google.com.tw/#q=Windows%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88+%E4%BD%BF%E7%94%A8+Visual+Basic+net+petzold

    hDC 是裝置代碼,hWnd 是視窗代碼。

    所以一個是視窗,一個是裝置。

    裝置放在視窗內,一個視窗最少有一個裝置,一個視窗可以有多個裝置。多個視窗構成 Windows

    視窗是放裝置或子視窗的容器。

    只有裝置才能有圖、文字。

    某種比喻可以這樣看,作業系統好比書桌,視窗好比寫生板,裝置好比圖畫紙,所以你的寫生板可以夾多張及種圖紙,甚至包含透明的投影片來作畫或寫字,寫生板也可以再夾一個寫生板,但是不會在寫生板上作畫。書桌上可以同時放多個寫生板。

    視窗的限制上限是 65535 x 65535 。

    裝置的上限是 2147483647 x 2147483647 ,但另受記憶體限制。

    當你要畫特定大小的圖形,你的裝置就一定要大於等於這個大小,視窗則無此限制。

    在建立裝置時,分為參照視窗解析度與參照印表機解析度,所以同一個繪圖碼,可用在畫面上,也可用在列印上。建立裝置有兩種,一種是點陣式的基本裝置,也就是圖檔架構,延伸後就是 Bitmap/DIB ,另一種是向量式的虛擬裝置,也就是向量內容,延伸後就是 EnhMetaFile/MetaFile ,EnhMetaFile 對照到 Win9x/NT 的裝置解析度,MetaFile 對照到 Win3.x 的裝置解析度,所以基本上 MetaFile 在目前是沒啥用,主要以 EnhMetaFile (EMF) 為 Windows 內記憶體格式。

    有縮放需求時,使用 EMF ,在呈現在螢幕或印表機時,透過描繪畫到 Bitmap 的裝置上,再從 Windows 決定要看到哪塊。

    如果有減少記憶體損耗需求時,則只繪製跟 Windows 同大小的區塊到圖紙上,捲軸做成虛擬捲軸,實際上圖紙固定大小。

    上面已經是具象化的簡介,如果要看更多的東西,可以去追上面那網址作者其他的書籍。上面那本已經精簡到不少 Windows 的知識,只留下 VBNET 需要知道的了。


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


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

    2013年1月30日 下午 01:07

所有回覆

  • Hi,

    你應該不能這樣直接畫在panel上

    因為你的圖檔也太寬了

    勢必只能畫出一部分的圖片,且要有捲軸的效果

    可以參閱下面這篇改個方式來做

    http://www.dotblogs.com.tw/larrynung/archive/2009/03/02/7339.aspx

    也可以改用GDI+只畫出要顯示的部分

    捲軸的部分自己放HScrollBar與VScrollBar元件下去處理

    另外ToolTip有內建,可以看一下你工具箱內有個ToolTip的元件

    http://msdn.microsoft.com/en-us/library/system.windows.controls.tooltip.aspx


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/


    2013年1月29日 上午 06:09
  • 1) 您可以為Panel加上捲軸

    2) 如果是繪製的內要有ToolTip, 必須讓所繪製的內容變成可以處理事件的物件

    2013年1月29日 上午 06:16
  • 觀念問題...

    1. 裝置跟視窗是兩碼子的事... 不要把視窗當裝置用,所以搞懂 hDC / hWnd 的差異。最後這種通常是用 emf 來做。

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=emf

    2. 再把 emf 指給 Image

    3. Panel 是容器,不是裝置,所以把 Image 放在 Panel 內,藉由調整 Image 大小來讓 Panel 的自動捲軸出現。

    4. 單一 Image 上限 512 MB ,所以超量的尺寸時,必須放棄所有控制項,全部手動操作處理畫面對應,你的尺寸在 100% 下約 77mb。


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


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

    2013年1月29日 下午 04:55
  • 2)本來我是直接把要畫的內容用Label表現,那就會有自動的ToolTip屬性可以用;

       但是這樣我要處理上萬個Label,電腦會受不了當機

       要怎麼把"繪製的內容變成可以處理事件的物件呢"?


    None

    2013年1月30日 上午 02:29
  • 觀念問題...

    1. 裝置跟視窗是兩碼子的事... 不要把視窗當裝置用,所以搞懂 hDC / hWnd 的差異。最後這種通常是用 emf 來做。

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=emf

    能不能請你講一下dDC / hWnd的差異....我google了半天還是一知半解....


    None

    2013年1月30日 上午 06:01
  • 請參考

    hDC 與 hWnd 的關係?(簡)


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

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

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

    2013年1月30日 上午 06:36
  • 要用 VBNET 畫圖,先把這本書翻過:
    https://www.google.com.tw/#q=Windows%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88+%E4%BD%BF%E7%94%A8+Visual+Basic+net+petzold

    hDC 是裝置代碼,hWnd 是視窗代碼。

    所以一個是視窗,一個是裝置。

    裝置放在視窗內,一個視窗最少有一個裝置,一個視窗可以有多個裝置。多個視窗構成 Windows

    視窗是放裝置或子視窗的容器。

    只有裝置才能有圖、文字。

    某種比喻可以這樣看,作業系統好比書桌,視窗好比寫生板,裝置好比圖畫紙,所以你的寫生板可以夾多張及種圖紙,甚至包含透明的投影片來作畫或寫字,寫生板也可以再夾一個寫生板,但是不會在寫生板上作畫。書桌上可以同時放多個寫生板。

    視窗的限制上限是 65535 x 65535 。

    裝置的上限是 2147483647 x 2147483647 ,但另受記憶體限制。

    當你要畫特定大小的圖形,你的裝置就一定要大於等於這個大小,視窗則無此限制。

    在建立裝置時,分為參照視窗解析度與參照印表機解析度,所以同一個繪圖碼,可用在畫面上,也可用在列印上。建立裝置有兩種,一種是點陣式的基本裝置,也就是圖檔架構,延伸後就是 Bitmap/DIB ,另一種是向量式的虛擬裝置,也就是向量內容,延伸後就是 EnhMetaFile/MetaFile ,EnhMetaFile 對照到 Win9x/NT 的裝置解析度,MetaFile 對照到 Win3.x 的裝置解析度,所以基本上 MetaFile 在目前是沒啥用,主要以 EnhMetaFile (EMF) 為 Windows 內記憶體格式。

    有縮放需求時,使用 EMF ,在呈現在螢幕或印表機時,透過描繪畫到 Bitmap 的裝置上,再從 Windows 決定要看到哪塊。

    如果有減少記憶體損耗需求時,則只繪製跟 Windows 同大小的區塊到圖紙上,捲軸做成虛擬捲軸,實際上圖紙固定大小。

    上面已經是具象化的簡介,如果要看更多的東西,可以去追上面那網址作者其他的書籍。上面那本已經精簡到不少 Windows 的知識,只留下 VBNET 需要知道的了。


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


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

    2013年1月30日 下午 01:07
  • 視窗的限制上限是 65535 x 65535 。

    裝置的上限是 2147483647 x 2147483647 ,但另受記憶體限制。

    我的程式"容器"是用TabPage1

    在書上看資料,改寫成以下的程式碼(LineNum是資料的數量)

            Dim grfx As Graphics = CreateGraphics()
            TabPage1.AutoScroll = True
            AutoScrollMinSize = New Size((LineNum + 1) * UnitSize + 37, TabPage1.Size.Height - 50)
            grfx.Dispose()
            TabPage1.Invalidate()

    然後我在TabPage1_Paint畫出我要的圖形

    現在圖是畫出來了,但是好像LineNum超過4000後面的圖形一定會被截掉

    (也許被限制的圖畫紙的寬度是32767,因為我的UnitSize=10)

    我要怎樣才能拿到2147483647寬度的圖畫紙呢?


    None

    2013年2月21日 上午 05:02
  • 實際上是不可能。

    單一點陣圖形 Windows 有限制單一記憶體區塊不得超過 512 MB ,所以假設高為 1 pixel ,在全彩下,512MB/4=128 MB=134217728 pixel 。

    所以上面就跟你說改用 emf ,在呈現在螢幕上時,再動態使用 DrawImage 出要展示的範圍。以 Full HD 1920x1024x4=7.5MB 。


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


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

    2013年2月21日 下午 05:20