|
論壇說明 | 標記討論區已讀 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2009-07-27, 11:09 AM | #1 |
註冊會員
|
疑問 - VB6.0載入圖檔自動排列
-------------------- 閱讀本主題的最佳解答 -------------------- 各位先進們好,請教一下載入一張圖片後自動排滿整個版面的功能該怎麼做?例圖: http://farm3.static.flickr.com/2611/...5e3ac2.jpg?v=0 謝謝指教。 |
送花文章: 25,
|
2009-07-27, 12:05 PM | #2 (permalink) |
管理版主
|
可以使用兩個 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 語法:
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 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 至於如何實現你的例子 主要在於控制 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 '像素 |
送花文章: 2019,
|
2009-07-29, 03:15 PM | #7 (permalink) | ||
管理版主
|
引用:
當然結果就是如此 如果你的 image 0~7是用 陣列方式生成 那可改成 語法:
for i=0 to 7 image(i).picture=loadpicture(commonDialog1.FileName) next i 引用:
因為你用八個Image卻要拼成一張圖 雖然不是不可能 但個人不會 ... 如果一開始是印在一個pictureBox上 那存檔就很容易了 其實不會很難只要你拿一張紙 在上面大改畫出你要的版面 就可以很容易搞清楚座標的方程式了 因為你也沒有詳細講出你的專案條件 (比如 載入的圖是固定8張嗎?) 所以才只能點到為止 個人寫程式比較懶 (以前學校教:是要你畫流程圖,軟體寫好玩的畢業後誰管你這麼多...) 都是用腦子迴響式邏輯,想到什麼就加什麼 所以時常碰到死胡同 此時只要拿一張紙畫一畫通常就可走出胡同 (雖然畫出的結果不一定是對的) 所以你可以試試 |
||
送花文章: 2019,
|
2009-07-29, 03:43 PM | #8 (permalink) |
管理版主
|
以下是隨手做的 (右邊的SPictureBox本來是隱藏的,為了展示所以Visible設為 True) (由圖可看出 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 編輯. |
送花文章: 2019,
|
向 mini 送花的會員:
|
chung1206 (2009-07-31)
感謝您發表一篇好文章 |
2009-07-29, 06:44 PM | #9 (permalink) | |
註冊會員
|
引用:
片這麼大,載入一張後我想自動排列成您下面做好的八張的樣式,然 後可以存檔,就如此而已,謝謝。 |
|
送花文章: 25,
|
主題工具 | |
顯示模式 | |
|
|
相似的主題 | ||||
主題 | 主題作者 | 討論區 | 回覆 | 最後發表 |
如何開啟自動排列 | west8988 | 軟體應用問題討論區 | 3 | 2003-07-25 12:09 PM |
我的文件中自動排列被隱藏 | wenhan | 軟體應用問題討論區 | 1 | 2003-01-16 11:52 PM |