none
[問題VB.NET2003]關於picturebox和在vb中加入image???~緊急 RRS feed

  • 問題

  • 請問如何將image的size縮成picturebox的size????有這樣的code嗎?

    難道就只有將picturebox的size變成了image的size----即-->picturebox1.size = picturebox.image.size???

    有picturebox.image.size = picturebox1.size 嗎????

    還有....可以在picturebox中加入scroll嗎?

    別的說將picturebox加入panel中...再由panel加入autoscroll...但這還是不能用..怎好?

    有方法嗎?

     

    2006-08-15

    修改--刪除了與問題沒關係的部份

    2006年8月14日 下午 04:23

解答

  • 前面有說過類似的觀念:

    1. 一般是在 PictureBox 內在塞一個 Image 物件,在 PictureBox Resize 事件取得 PictureBox 尺寸後,再來調整 Image 物件的大小。

    所以意思是,先拉一個 pictureBox 取名為 picShow ,在這個 picShow 裡面再拉一個 pictureBox 取名為 picImage 。

    真正秀圖的是 picImage ,picShow 只是提供螢幕資訊給 picImage 決定顯示的大小,所以外面框的 picShow 也可以是其他容器,例如直接是 Form 本體。不直接用 Form 本體是因為通常視窗上可能還有其他物件,所以純粹 Form 本體並不能提供真正的視窗大小,若是打算自建控制項來顯示,就可以弄個 Form 本體來當容器,整個 Form 崁入其他視窗介面內。


    討論區的規則是為了網友彼此尊重而存在,目前所規範的僅有通則,適用於各討論區,而微軟討論區規範的比民間專業討論區更鬆散,很多民間專業討論區如果做些小白的行為,可能會被砍文、限權數週、停權數週或永久停權,有些網站有點數或是網站幣的可能會扣點數,造成在某些版面無法瀏覽或張貼文章。

    若彼此都不修改過去已發布的文章,當你看到文章有回覆時,你只需要注意最新回覆的內容,無須回頭去瀏覽過去的內容。所以只有新增的內容對於彼此都是最清楚簡潔的,彼此都不需要再回頭看前面已知的討論。

    一個討論緒除了參與者外,也提供給其他瀏覽者、未來新加入瀏覽者一同分享討論的內容,甚至有些人可以透過搜尋來解決他的問題或學習他所要的知識。重複的修改,除了參與者知道外,其他的人無法理解,甚至可能除了修改者外,參與者都不知道改了什麼。會造成內容搜尋不到,瀏覽者無法理解文章討論的內容。

    一般網站對於版面的節省,看法並不是藉由文章不斷的修改,而導致文章不會新增,大部分的討論區甚至不允許修改文章。版面的節省是不要一文多貼,不管是不是在同一版面,甚至是不是同一網站,而同一討論緒內的相關討論,不要另開主題,造成版面上都是相同討論內容,卻零散分布在不同討論緒的狀況。而明顯不同討論緒與原主題相異時,則鼓勵另開討論緒來切割文章,例如某些人對於網路連接的討論緒沒興趣,但卻對資料庫非常精通,若是討論到最後,順帶問到資料庫存取,則能協助你的人可能根本看不見,因為根本不會點入這個主題。

    這是慣例,也是通則,而且是比較鬆散的通則。

    2006年8月15日 上午 04:05
    版主
  • 應該是你 多了個 Exit Sub ,導致下面的程式碼 ReSizeShowImage 不會去執行吧...

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            picImage.Image = Image.FromFile(OpenFileDialog1.FileName)
        End If
        picImage.SizeMode = PictureBoxSizeMode.AutoSize
        Exit Sub
        Me.picImage.BorderStyle = PictureBoxSizeMode.StretchImage
        Me.picImage.BorderStyle = BorderStyle.Fixed3D
        ReSizeShowImage(sender, picImage)
    End Sub

    你會使用除錯模式嗎?

    在開始執行前,在

    picImage.SizeMode = PictureBoxSizeMode.AutoSize

    這行按下 F9 ,左邊會出現棕色的圈圈,稱為中斷點,開始執行你的程式。

    當你的程式按下 Button1 的時候,會在中斷點停留,中斷點那行會變成黃色,這時還沒有執行這行程式碼。

    改用 F11 逐行、逐行執行,你會看到程式碼是否依照預定的想法執行,當滑鼠停在任何一個變數上時,會跳出來告訴你變數的值,你可以參考,或是反白後用 Shift+F9 觀看。

    除錯完畢改用 F5 恢復原來的運作,或是再按一次 F9 解除中斷點。

    2006年8月16日 上午 07:47
    版主
  • 問題又來了~

    經我試過了很多次後...我發現....

    第一:)...必定要將picImage 的Dook轉成Fill or bottom or top 總之不能是none

    不然的話...沒有圖走出來.....

    第二):將picimage的dook變成了bottom or top or 兩旁...都會有這樣的後果.....

    圖如下:-->(圖扁了)...




    第3):

    就只有將picimage的dook變成了"Fill"之後才可能顯示一張整張resize了的圖

    -->


    為何會這樣喔???是我不太明白這個原理嗎?

    一張form不竟有很多button...不可能將picimage的dook轉成fill.....霸了太多位置了...而且圖也差不多變成了background...

    可惡....

    是不是picimage一定要dook才可以顯示圖呢?....有沒有其他方法?

    另一方面...如果每一張圖開一個新form去放....好像太麻煩了.....

     

     

    2006年8月17日 上午 02:06

所有回覆

  • 張貼文章請說明清楚 VB6 或是 VBNET 。

    依照你先前發言,假定你是使用 VB6 :

    1. 一般是在 PictureBox 內在塞一個 Image 物件,在 PictureBox Resize 事件取得 PictureBox 尺寸後,再來調整 Image 物件的大小。

    2. Form 本身不能維護視窗以外的東西,所以一般是先放一個 PictureBox ,除了 ScrollBar 外,通通放在 PictureBox 內,當 ScrollBar 發生 Change 事件時,調整 PictureBox 的 Top 屬性。

    2006年8月14日 下午 05:11
    版主
  • 你的意思是先get picturebox的size

    例如 a =picturebox1.size.hight

            b = picturebox1.size.width

    a = picturebox1.image.size.hight

    b = picturebox1.image.size.width

    你的意思是這樣嗎?

    但這樣還是不可行的.....

    2006年8月14日 下午 05:24
  • ...

    不知道你再寫什麼... 而且前面因為你沒說清楚用的編譯器,給你的是 VB6 的作法。

    1. VB2005 的 PictureBox 有 SizeMode 屬性,直接 設定 SizeMode = Zoom 即可,但此屬性會導致較小的圖也被放到 PictureBox 的大小:

    這樣的設定我用在 http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!825.entry 內。

    2. 若想要較小的圖不放大,較大的圖縮小:

    外框的 PictueBox 為 picShow ,內框顯示圖片的為 picImage ,第一次顯示及視窗大小變動呼叫 ReSizeShowImage 。

     Private Function ReSizeShowImage(ByVal sender As System.Object, ByVal picImage As PictureBox)
      Dim showImage As Image = picImage.Image
      If picImage.Visible And Not IsNothing(showImage) Then
       If showImage.Height <= picShow.ClientSize.Height And showImage.Width <= picShow.ClientSize.Width Then
        picImage.SizeMode = PictureBoxSizeMode.AutoSize
       Else
        picImage.SizeMode = PictureBoxSizeMode.Normal
        Dim dScale As Double = Math.Min(sender.ClientSize.Height / showImage.Height, sender.ClientSize.Width / showImage.Width)
        picImage.Width = showImage.Width * dScale
        picImage.Height = showImage.Height * dScale
        picImage.SizeMode = PictureBoxSizeMode.StretchImage
       End If
       picImage.Top = (sender.Height - picImage.Height) / 2 + sender.Top
       picImage.Left = (sender.Width - picImage.Width) / 2 + sender.Left
      End If
     End Function

     Private Sub picShow_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles picShow.Resize
      ReSizeShowImage(sender, picImage)
     End Sub

    這樣的設定我用在 http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!403.entry 內。


    另外,原討論的文章若以有人回覆,若需大量變更,請利用回應方式來改變,不要直接改原先文章,除非是錯字之類的小量修改,或是尚無人回應的文章。原因:

    1. 擅自大量修改原討論文章,會造成已回覆的網友文章內容無法串接,造成新加入的使用者瀏覽上的困惑,已瀏覽過或正在參加的使用者,通常是只看最新新增文章,你的修改反而被忽視。

    2. 擅自大量修改原討論文章,是對已參予回應的網友不尊重。

    我個人對這類行為很反感,若這是你的習慣,恕未來你的文章,我個人不再參與討論,先前曾有一次,你的下一篇文章就被我自動忽視了。對你來說,網友不差我一個,對我來說,意思也是一樣。

    2006年8月15日 上午 01:58
    版主
  • ------------------------------------------------
    對不起喔~

    妳的要求我原存明白...坦白說我的原意是為了節省版位...
    不想太多繁碎的問題開太多的post...所以上一次多次修改問題
    本人對此表示抱歉.....

    本人一向少去論壇發問...經朋友的推薦來到這來問問題....盼望有能之士可以幫助我解決問題
    所以不大懂得這裡的版規....我會配合這裡的規則...希望各個網友能夠在這找到問題的解答
    如之前有對各網友造成不便....本人願意對妳們道歉....還請原諒....

    2006年8月15日 上午 03:06
  • 什麼是外框的 PictueBox 為 picShow ???
    2006年8月15日 上午 03:41
  • 前面有說過類似的觀念:

    1. 一般是在 PictureBox 內在塞一個 Image 物件,在 PictureBox Resize 事件取得 PictureBox 尺寸後,再來調整 Image 物件的大小。

    所以意思是,先拉一個 pictureBox 取名為 picShow ,在這個 picShow 裡面再拉一個 pictureBox 取名為 picImage 。

    真正秀圖的是 picImage ,picShow 只是提供螢幕資訊給 picImage 決定顯示的大小,所以外面框的 picShow 也可以是其他容器,例如直接是 Form 本體。不直接用 Form 本體是因為通常視窗上可能還有其他物件,所以純粹 Form 本體並不能提供真正的視窗大小,若是打算自建控制項來顯示,就可以弄個 Form 本體來當容器,整個 Form 崁入其他視窗介面內。


    討論區的規則是為了網友彼此尊重而存在,目前所規範的僅有通則,適用於各討論區,而微軟討論區規範的比民間專業討論區更鬆散,很多民間專業討論區如果做些小白的行為,可能會被砍文、限權數週、停權數週或永久停權,有些網站有點數或是網站幣的可能會扣點數,造成在某些版面無法瀏覽或張貼文章。

    若彼此都不修改過去已發布的文章,當你看到文章有回覆時,你只需要注意最新回覆的內容,無須回頭去瀏覽過去的內容。所以只有新增的內容對於彼此都是最清楚簡潔的,彼此都不需要再回頭看前面已知的討論。

    一個討論緒除了參與者外,也提供給其他瀏覽者、未來新加入瀏覽者一同分享討論的內容,甚至有些人可以透過搜尋來解決他的問題或學習他所要的知識。重複的修改,除了參與者知道外,其他的人無法理解,甚至可能除了修改者外,參與者都不知道改了什麼。會造成內容搜尋不到,瀏覽者無法理解文章討論的內容。

    一般網站對於版面的節省,看法並不是藉由文章不斷的修改,而導致文章不會新增,大部分的討論區甚至不允許修改文章。版面的節省是不要一文多貼,不管是不是在同一版面,甚至是不是同一網站,而同一討論緒內的相關討論,不要另開主題,造成版面上都是相同討論內容,卻零散分布在不同討論緒的狀況。而明顯不同討論緒與原主題相異時,則鼓勵另開討論緒來切割文章,例如某些人對於網路連接的討論緒沒興趣,但卻對資料庫非常精通,若是討論到最後,順帶問到資料庫存取,則能協助你的人可能根本看不見,因為根本不會點入這個主題。

    這是慣例,也是通則,而且是比較鬆散的通則。

    2006年8月15日 上午 04:05
    版主
  • 第一)

    問題是如何在那個 picShow的picturebox裡面再拉一個pictureBox???

    我嘗試過了很多次...還是不行...不像在groupbox內再拉入textbox等的現象

    還有....

    想問一問....這一個function 是當image被加入picImage(pictureBox名)內

    當包著picImage 的picshow 需要resize的時候..此function就會執行...我理解有錯嗎?

    這個function是怎用的?

    -------------------------------

    還有....我看過你msn space...(蠻多東西看耶~而且很漂亮呢)

    下載了quickXY.zip用...我發覺我要用的東西就好像那個程式一樣

    無論載入的圖片大小不一....小的不會縮少..只有大的會縮少.....太神奇了

    2天就寫好一個簡單版的(acdsee)...功力真不可看少耶~

    2006年8月15日 上午 08:48
  • 1. 我看了我原先的程式碼,picImage 並沒有放在 picShow 內,直接在 picShow 上... 大概是 VB6 我這樣做習慣了... 誤會了,不過應該沒太大影響,有影響的應該是加捲軸的,捲軸的可能要再測看看。

    2. 在第一次載入時呼叫,若是你的畫面固定不動,則不需要在 ReSize 事件內呼叫。我把 picShow Dock 在視窗上,所以會跟著視窗自動變尺寸,這時候就需要在 ReSize 呼叫。2 天就寫好,是因為 VB.Net 比 VB6 簡單太多了... 基本上都是呼叫 VB.Net 提供的東西。你下載的那個版本是用 VB2003 編譯,VB2005 對於部分圖檔載入的功能有修復。

    2006年8月15日 上午 09:40
    版主
  • Private Function ReSizeShowImage(ByVal sender As System.Object, ByVal picImage As PictureBox)
            Dim showImage As Image = picImage.Image
            If picImage.Visible And Not IsNothing(showImage) Then
                If showImage.Height <= picShow.ClientSize.Height And showImage.Width <= picShow.ClientSize.Width Then
                    picImage.SizeMode = PictureBoxSizeMode.AutoSize
                Else
                    picImage.SizeMode = PictureBoxSizeMode.Normal
                    Dim dScale As Double = Math.Min(sender.ClientSize.Height / showImage.Height, sender.ClientSize.Width / showImage.Width)
                    picImage.Width = showImage.Width * dScale
                    picImage.Height = showImage.Height * dScale
                    picImage.SizeMode = PictureBoxSizeMode.StretchImage
                End If
                picImage.Top = (sender.Height - picImage.Height) / 2 + sender.Top
                picImage.Left = (sender.Width - picImage.Width) / 2 + sender.Left
            End If
        End Function

        Private Sub picimage_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles picImage.Resize
            ReSizeShowImage(sender, picImage)
        End Sub

        Private Sub OpenFileDialog()
            With OpenFileDialog1
                .InitialDirectory = Environment.CurrentDirectory & "\Images"
                .Filter = _
                "Photo (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|All File (*.*)|*.*"
                .Title = "Select you photo"
                .RestoreDirectory = True
            End With
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
                picImage.Image = Image.FromFile(OpenFileDialog1.FileName)
            End If
            picImage.SizeMode = PictureBoxSizeMode.AutoSize
            Exit Sub
            Me.picImage.BorderStyle = PictureBoxSizeMode.StretchImage
            Me.picImage.BorderStyle = BorderStyle.Fixed3D
            ReSizeShowImage(sender, picImage)
        End Sub


     

    2006年8月16日 上午 07:25
  • 問題......

    我create一張新的空白form

    先將一個picturebox拉出來..改名為picShow

    再將另一個picturebox拉出來改名為picImage

    我將picshow 的Dook改成   "Fill"

    以下是coding.......請幫助看看...辛苦了

     

     

    code在上面

    執行....

    先按button1插入圖像

    -->

    變成了這樣-->

    要resize form,  function才會resize image

    請問要怎麼才可以...當一插入圖片時...圖片會立即resize呢?....而不用移動任何form or picturebox

    就好像你的quickXY一樣...當從filelist一click檔案名時...檔案圖片會立即貼在旁邊..而且自動resize

    ....我試了很多次...例如將function的位置放在form load or button1..都不行.....

    2006年8月16日 上午 07:34
  • 應該是你 多了個 Exit Sub ,導致下面的程式碼 ReSizeShowImage 不會去執行吧...

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            picImage.Image = Image.FromFile(OpenFileDialog1.FileName)
        End If
        picImage.SizeMode = PictureBoxSizeMode.AutoSize
        Exit Sub
        Me.picImage.BorderStyle = PictureBoxSizeMode.StretchImage
        Me.picImage.BorderStyle = BorderStyle.Fixed3D
        ReSizeShowImage(sender, picImage)
    End Sub

    你會使用除錯模式嗎?

    在開始執行前,在

    picImage.SizeMode = PictureBoxSizeMode.AutoSize

    這行按下 F9 ,左邊會出現棕色的圈圈,稱為中斷點,開始執行你的程式。

    當你的程式按下 Button1 的時候,會在中斷點停留,中斷點那行會變成黃色,這時還沒有執行這行程式碼。

    改用 F11 逐行、逐行執行,你會看到程式碼是否依照預定的想法執行,當滑鼠停在任何一個變數上時,會跳出來告訴你變數的值,你可以參考,或是反白後用 Shift+F9 觀看。

    除錯完畢改用 F5 恢復原來的運作,或是再按一次 F9 解除中斷點。

    2006年8月16日 上午 07:47
    版主
  • 再一次感謝你吧!!哈哈

    我玩了一年多..竟然不知道原本這個"棕色的圈圈"是這樣用的=口="

    每次都只會在亂按才出現的"棕色的圈圈"原來是這麼的有用 ~) >_< (~

    害我每一次都只用一雙疲累的眼睛debug......或是下面的debug window看看那兒錯.....

    非常非常x 一萬次....感謝......這一次的發現真的令我萬分驚喜喔=口="║║

    一定還有很多東西等待我發現的.....還請以後多多指教喔~

    2006年8月16日 上午 08:43
  • 微軟的整合開發環境從 DOS 版的 PWB 就開始有這種功能,Quick C / Quick Basic 也是這樣用。

    這邊有一篇以前我寫的,針對 Microsoft Fortran PowerStation 4.0 (Visual Studio 4.0 的介面),不過微軟的介面都差不多,操作方式也差不多,也可以先看看觀念,有空我再來寫篇 VBNET 除錯的簡介。

    http://tlcheng.twbbs.org/TLCheng/Fortran/MSF4/fdebug.htm

    在 VS 4.0 之前,逐步執行是用 F8 ,在 VS97 之後改用 F11 ,VB 則是沿用到 VB6 ,VBNET 才改用 F11 。

    此除錯方式在 Office 的 VBA 內也有效,VBA 跟 VB6 界面一樣。

    ASP.NET 網頁若是用 VSNET 直接開發的,也可以這樣除錯。

    2006年8月16日 上午 10:26
    版主
  • 問題又來了~

    經我試過了很多次後...我發現....

    第一:)...必定要將picImage 的Dook轉成Fill or bottom or top 總之不能是none

    不然的話...沒有圖走出來.....

    第二):將picimage的dook變成了bottom or top or 兩旁...都會有這樣的後果.....

    圖如下:-->(圖扁了)...




    第3):

    就只有將picimage的dook變成了"Fill"之後才可能顯示一張整張resize了的圖

    -->


    為何會這樣喔???是我不太明白這個原理嗎?

    一張form不竟有很多button...不可能將picimage的dook轉成fill.....霸了太多位置了...而且圖也差不多變成了background...

    可惡....

    是不是picimage一定要dook才可以顯示圖呢?....有沒有其他方法?

    另一方面...如果每一張圖開一個新form去放....好像太麻煩了.....

     

     

    2006年8月17日 上午 02:06
  • 不用 Dock 也可以顯示圖片,使用 Dock 只是方便你不用在 Form_Resize 裡面寫事件控制 PicShow 這個圖框的大小及位置。

    picImage 當初設計是來 Show 圖,參照 picShow 的座標,所以 Dock 的是 picShow ,並非是 picImage ,依據 picShow 的尺寸變更來計算縮放的比例或是置中。

    你若是不 Dock ,就是在 Form_Resize 裡面計算 picShow 或 picImage 的位置與大小,例如 picShow.Width = Form.Width - 100。

    你是直接把 picImage 拿去 Dock ,所以不會正交放大縮小,也就是長寬採用等比例縮放,而是依照畫面尺寸縮放。

    2006年8月17日 上午 03:49
    版主