史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2009-07-27, 11:09 AM   #1
chung1206 帥哥
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設 疑問 - VB6.0載入圖檔自動排列



--------------------
閱讀本主題的最佳解答
--------------------


各位先進們好,請教一下載入一張圖片後自動排滿整個版面的功能該怎麼做?例圖:
http://farm3.static.flickr.com/2611/...5e3ac2.jpg?v=0

謝謝指教。
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-07-27, 12:05 PM   #2 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時
註冊日期: 2002-12-07
文章: 13248
精華: 0
現金: 26239 金幣
資產: 3024049 金幣
預設

可以使用兩個 PictureBox 加 圖形處理 API函數
(假設一個是目的 TPictureBox
一個是用來載入用的SPictureBox,所以 SPictureBox之 .Visible可以設為隱藏 =False)

一般常用的圖形處理 API函數有
BitBlt (宣告如下)
語法:
Public Declare Function BitBlt Lib "gdi32" ( _
    ByVal hDestDC As Long, _
    ByVal X As Long, _
    ByVal Y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal hSrcDC As Long, _
    ByVal xSrc As Long, _
    ByVal ySrc As Long, _
    ByVal dwRop As Long) As Long
及 StretchBlt
語法:
Public Declare Function StretchBlt Lib "gdi32" ( _
    ByVal hDestDC As Long, _
    ByVal X As Long, _
    ByVal Y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal hSrcDC As Long, _
    ByVal xSrc As Long, _
    ByVal ySrc As Long, _
    ByVal nSrcWidth As Long, _
    ByVal nSrcHeight As Long, _
    ByVal dwRop As Long) As Long
個人通常會選擇使用 StretchBlt ※A (因為可以縮放圖)
語法:
StretchBlt TPictureBox.hDC, X, Y, W, H, SPictureBox.hDC, 0, 0, SPictureBox.ScaleWidth, SPictureBox.ScaleHeight, SRCCOPY
而這兩個函數之最後面一個參數
常用的如下
語法:
Public Const SRCCOPY = &HCC0020     '(DWORD) dest = source
Public Const SRCAND = &H8800C6      '(DWORD) dest = source AND dest
Public Const SRCERASE = &H440328    '(DWORD) dest = source AND (NOT dest )
Public Const SRCINVERT = &H660046   '(DWORD) dest = source XOR dest
Public Const SRCPAINT = &HEE0086    '(DWORD) dest = source OR dest
你的例子只要使用 SRCCOPY即可

至於如何實現你的例子
主要在於控制 X及Y座標 (這裡請自己想吧)
提示1:
X=X+SPictureBox.ScaleWidth
Y=Y+SPictureBox.ScaleHeight
使用兩層For迴圈

提示2:
'先載入圖檔
SPictureBox.Picture=LoadPicture(FileName)
'這裡加入控制 X及Y座標,最後再使用 ※A式 將來源圖(SPictureBox)複製到 目的(TPictureBox)上

提示3:
其他相關屬性
SPictureBox.AutoSize = True
SPictureBox.AutoRedraw = True
SPictureBox.ScaleMode = 3 '像素
mini 目前離線  
送花文章: 1999, 收花文章: 7956 篇, 收花: 26748 次
回覆時引用此帖
舊 2009-07-27, 12:40 PM   #3 (permalink)
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設

感謝版大詳細指點,我需求很簡單,載入圖片後自動排列好後就另存新檔了,不需要可以拉動圖片等功能,x,y軸的部份我會再想想,謝謝。
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-07-29, 08:54 AM   #4 (permalink)
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設

版大,您那個方法對我來說可能太深奧了點,我試不出來,想請教一下,我可不可以在picturebox裡拉八個image排列好,然後下

for i=0 to 7
image1.picture=loadpicture(commonDialog1.FileName)
next i

但它好像還是只載入一張而已,不知道那裡出了問題?謝謝。
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-07-29, 08:55 AM   #5 (permalink)
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設

版大,您那個方法對我來說可能太深奧了點,我試不出來,想請教一下,我可不可以在picturebox裡拉八個image排列好,然後下

語法:
for i=0 to 7
    image1.picture=loadpicture(commonDialog1.FileName)
next i
但它好像還是只載入一張而已,不知道那裡出了問題?謝謝。
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-07-29, 10:45 AM   #6 (permalink)
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設

剛才使用了Image實現了我想要的動作,但現在問題來了,我做了八個Image分別命名為Image1(0)~Image(7),但不知道該怎麼將這八格內的圖通通存在一個jpg檔內?謝謝。
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-07-29, 03:15 PM   #7 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時
註冊日期: 2002-12-07
文章: 13248
精華: 0
現金: 26239 金幣
資產: 3024049 金幣
預設

引用:
作者: chung1206 查看文章
版大,您那個方法對我來說可能太深奧了點,我試不出來,想請教一下,我可不可以在picturebox裡拉八個image排列好,然後下

for i=0 to 7
image1.picture=loadpicture(commonDialog1.FileName)
next i

但它好像還是只載入一張而已,不知道那裡出了問題?謝謝。
你的圖都是載到同一個image1.picture裡
當然結果就是如此
如果你的 image 0~7是用 陣列方式生成
那可改成
語法:
for i=0 to 7
    image(i).picture=loadpicture(commonDialog1.FileName)
next i
引用:
作者: chung1206 查看文章
剛才使用了Image實現了我想要的動作,但現在問題來了,我做了八個Image分別命名為Image1(0)~Image(7),但不知道該怎麼將這八格內的圖通通存在一個jpg檔內?謝謝。
所以才推薦使用API的方法
因為你用八個Image卻要拼成一張圖
雖然不是不可能
但個人不會 ...

如果一開始是印在一個pictureBox上
那存檔就很容易了

其實不會很難只要你拿一張紙
在上面大改畫出你要的版面
就可以很容易搞清楚座標的方程式了
因為你也沒有詳細講出你的專案條件 (比如 載入的圖是固定8張嗎?)
所以才只能點到為止

個人寫程式比較懶 (以前學校教:是要你畫流程圖,軟體寫好玩的畢業後誰管你這麼多...)
都是用腦子迴響式邏輯,想到什麼就加什麼
所以時常碰到死胡同
此時只要拿一張紙畫一畫通常就可走出胡同
(雖然畫出的結果不一定是對的)
所以你可以試試
mini 目前離線  
送花文章: 1999, 收花文章: 7956 篇, 收花: 26748 次
回覆時引用此帖
舊 2009-07-29, 03:43 PM   #8 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時
註冊日期: 2002-12-07
文章: 13248
精華: 0
現金: 26239 金幣
資產: 3024049 金幣
預設



以下是隨手做的 (右邊的SPictureBox本來是隱藏的,為了展示所以Visible設為 True)

http://xs941.xs.to/xs941/09313/snap1893.jpg
(由圖可看出 StretchBlt 的縮放效果不佳...^^")

語法:
Private Sub Command1_Click()
Dim x As Long
Dim y As Long
Dim w As Long
Dim h As Long
Dim i As Integer
Dim D As Single '縮放值

    D = 1 / 2 '縮小成二分之一
    
   TPictureBox.AutoRedraw = True '宣告TPictureBox "圖的方法" 是存在於 記憶體的影像 內
    For i = 0 To 7
        SPictureBox.Picture = LoadPicture("r:\" & i & ".jpg")

        w = SPictureBox.ScaleWidth * D
        h = SPictureBox.ScaleHeight * D
        
        StretchBlt TPictureBox.hDC, x, y, w, h, SPictureBox.hDC, 0, 0, SPictureBox.ScaleWidth, SPictureBox.ScaleHeight, SRCCOPY
        
        x = x + SPictureBox.ScaleWidth * D '下一張的 X座標是接在前一張的最右邊緣

             '*當滿足第一排排滿四張後...
        If i = 3 Then
            y = y + SPictureBox.ScaleHeight * D '第二排的圖 Y座標固定是...
            x = 0 'X重新歸零
              End If
    Next i
    TPictureBox.Refresh '將TPictureBox刷新一次,使 記憶體的影像(陣列圖) 正確顯示於上
    
End Sub

此帖於 2009-07-30 03:15 PM 被 mini 編輯.
mini 目前離線  
送花文章: 1999, 收花文章: 7956 篇, 收花: 26748 次
回覆時引用此帖
向 mini 送花的會員:
chung1206 (2009-07-31)
感謝您發表一篇好文章
舊 2009-07-29, 06:44 PM   #9 (permalink)
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設

引用:
作者: mini 查看文章
你的圖都是載到同一個image1.picture裡
當然結果就是如此
如果你的 image 0~7是用 陣列方式生成
那可改成
語法:
for i=0 to 7
    image(i).picture=loadpicture(commonDialog1.FileName)
next i


所以才推薦使用API的方法
因為你用八個Image卻要拼成一張圖
雖然不是不可能
但個人不會 ...

如果一開始是印在一個pictureBox上
那存檔就很容易了

其實不會很難只要你拿一張紙
在上面大改畫出你要的版面
就可以很容易搞清楚座標的方程式了
因為你也沒有詳細講出你的專案條件 (比如 載入的圖是固定8張嗎?)
所以才只能點到為止

個人寫程式比較懶 (以前學校教:是要你畫流程圖,軟體寫好玩的畢業後誰管你這麼多...)
都是用腦子迴響式邏輯,想到什麼就加什麼
所以時常碰到死胡同
此時只要拿一張紙畫一畫通常就可走出胡同
(雖然畫出的結果不一定是對的)
所以你可以試試
感謝大大,我的功能需求很簡單,我載入的圖片只有一張大約2吋照
片這麼大,載入一張後我想自動排列成您下面做好的八張的樣式,然
後可以存檔,就如此而已,謝謝。
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-07-30, 05:47 PM   #10 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 313161
在線等級: 級別:2 | 在線時長:12小時 | 升級還需:9小時級別:2 | 在線時長:12小時 | 升級還需:9小時
註冊日期: 2008-11-08
文章: 5
精華: 0
現金: 9 金幣
資產: 9 金幣
預設

順便問一下mini大大要如何知道每一行已經有四張圖片而自動換行?
http://img220.imageshack.us/img220/6798/52031985.jpg

此帖於 2009-07-30 06:59 PM 被 vbstudents1 編輯.
vbstudents1 目前離線  
送花文章: 0, 收花文章: 1 篇, 收花: 1 次
回覆時引用此帖
舊 2009-07-30, 09:06 PM   #11 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時
註冊日期: 2002-12-07
文章: 13248
精華: 0
現金: 26239 金幣
資產: 3024049 金幣
預設

引用:
作者: vbstudents1 查看文章
順便問一下mini大大要如何知道每一行已經有四張圖片而自動換行?
If i = 3 Then
編號 0~7 那 編號3 就是 第四張圖

其實如果考量每張圖可能 長寬size不同的話
程式碼還有很大的改良空間
mini 目前離線  
送花文章: 1999, 收花文章: 7956 篇, 收花: 26748 次
回覆時引用此帖
舊 2009-07-31, 08:50 PM   #12 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 313161
在線等級: 級別:2 | 在線時長:12小時 | 升級還需:9小時級別:2 | 在線時長:12小時 | 升級還需:9小時
註冊日期: 2008-11-08
文章: 5
精華: 0
現金: 9 金幣
資產: 9 金幣
預設

對ㄚ大大如果圖片尺寸不同就很麻煩了~~~呵呵~~
vbstudents1 目前離線  
送花文章: 0, 收花文章: 1 篇, 收花: 1 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

相似的主題
主題 主題作者 討論區 回覆 最後發表
讓Windows的資料夾自動排列整齊 XP 2000 ME kenWong 作業系統操作技術文件 2 2006-03-24 02:01 PM
如何開啟自動排列 west8988 軟體應用問題討論區 3 2003-07-25 12:09 PM
我的文件中自動排列被隱藏 wenhan 軟體應用問題討論區 1 2003-01-16 11:52 PM


所有時間均為台北時間。現在的時間是 04:51 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1