各位大俠:
我搞了好久都不知道這個陰影是怎么實作,希望有人告訴我是怎么弄的。不要程式,只
要告訴我個思路。謝謝各位
uj5u.com熱心網友回復:
貌似半透明的圖片......uj5u.com熱心網友回復:

每隔一像素設定蘭色,貌似沒透明
uj5u.com熱心網友回復:
發錯圖了,本來想發放大了7倍的圖的,看得很清楚uj5u.com熱心網友回復:
A、就是藍點+透明色的圖,覆寫上去——這個需要GDI。B、純VB的方式,要兩張圖。
1)白底加黑點的圖,用 AND 方式合并上去(挖掉了黑點)。
2)黑底加藍點的圖,用 OR 方式合并上去(填充了藍點)。
AND、OR 是 PaintPicture 的引數,你自己試一下。
uj5u.com熱心網友回復:
貌似可以直接畫上去吧?uj5u.com熱心網友回復:
c# 中這個功能很好實作就是把一個picturebox設定成透明度可變的,就能解決,但VB中我試了好久都不能uj5u.com熱心網友回復:
.Net 中的 Graphics 是 GDI+。VB6 的 PaintPicture 是 BitBlt,所以要按我#4的B方案呼叫兩次。
可以參考這個帖子3樓,把原始圖換成白底藍點。
uj5u.com熱心網友回復:
Option Explicit
Dim m_x As Long
Dim m_y As Long
Private Sub Form_Load()
Set Picture1.Picture = LoadPicture("D:\Administrator\desktop\1431419873_479672.bmp")
Picture1.ScaleMode = 3
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
m_x = X
m_y = Y
Picture1.Refresh
End Sub
Private Sub Picture1_Paint()
Dim xx As Long
Dim yy As Long
Picture1.ForeColor = &HCE6E3D
For yy = m_y To m_y + 300 Step 2
For xx = m_x To m_x + 300 Step 2
Picture1.PSet (xx, yy)
Next
Next
End Sub
uj5u.com熱心網友回復:
PaintPicture 比 PSet 快多了!uj5u.com熱心網友回復:
建議你做像素陣列運算,這樣處理速度會比較快(圖形處理沒速度是不行的),思路可以這樣:通過三個GDI設備來處理影像,然后回顯到指定輸出設備(如螢屏或視窗中),步驟如下:
1、先加載原始圖片到一個指定的GDI設備,具體可用GDI+函式來加載圖片到設備(這樣兼容的影像格式多點)。
2、創建一個與你想設定“陰影”的區域大小一樣的GDI設備作為緩沖設備。
3、再創建一個最終合成用的與原圖大小一致的GDI設備。
4、可以用BitBlt函式將原始圖片設備的圖,按取圖的位置和大小把“陰影”部分圖片復制到GDI緩沖設備。
5、可以用GetBitmapBits函式將GDI緩沖設備的影像資料取出到位元組陣列中。
6、按照GDI影像資料格式修改位元組陣列中相關像素的資料內容(這和你創建的位圖格式與資料位有關,注意,位圖資料的行位元組要保持2的倍數,這是GDI的特性,而位圖檔案格式則是保持4的倍數,這就是位圖檔案的資料格式與GDI的區別,不清楚可以看看BMP檔案格式,留意BMP檔案格式資料部分,把4的倍數改成2的倍數就是GDI的位圖概念了),實作你所謂的設定“陰影”的處理程序。具體可以用類似8樓的回圈方法來回圈設定資料內容,不過要把Picture1.PSet換成設定陣列資料而已。
7、再用SetBitmapBits函式將計算好的位元組陣列資料放回到GDI緩沖設備。
8、在最終合成設備上先用BitBlt把原圖復制進去,再用BitBlt把GDI設備的圖也根據“陰影”坐標復制上去。
9、可以把合成設備的圖用BitBlt復制到PictureBox或Form等能顯示到螢屏的設備來觀察結果。
這個處理程序理論上是VB內做這種資料處理能做到最快的做法了,當然如果你通過呼叫外部API來實作相同的運算,并且用匯編或C/C++來弄,效率可能會更快,如果能用GPU、顯存什么的硬體來搞那就更沒話說了,但是,如果運算程序在vb內部,這樣是最快的了。
不要看主要程序是在第6步中,最終實作的方法可能與上面呼叫Picture1.PSet (xx, yy)差不多,但是,VB在單純的用回圈處理記憶體資料上效率與呼叫物件方法或什么API函式還是有本質區別的,由于這個設定陣列資料的執行程序相當簡單,與呼叫某個物件方法或API函式從涉及的資源呼叫與CPU指令量不是一個資源級別,所以處理速度會有根本質的差異。
比如設定一個記憶體資料只需要3潭訓編指令可完成,涉及到的資源只是直接尋址并設定內容的兩三個交換暫存器。但換做是呼叫別的什么方法或API就有可能把簡單的3潭訓編指令變成幾百或幾千潭訓編指令來執行相同的設定一個像素內容的操作,更有勝的可能會變成用幾萬潭訓編指令才能完成相同的目的。雖然在VB代碼里看上去呼叫一個方法或API很簡潔,并不顯得代碼量大,但那個方法內部撰寫可能呼叫了N個API函式來實作的,而每個API函式又是呼叫別的API或回圈N次才回傳的,這樣下去,每呼叫一次這種方法或API都有可能成千上萬倍的去執行一些多余的程序。因為那些函式為了兼容性、穩定性、資料型別什么的會做很多作業,不是單單為了設定你一個像素內容而存在的,所以真正在CPU里跑的程式并不會像VB代碼是看上去那么簡單簡潔。而直接設定記憶體資料就簡單很多,即使存在VB內部可能不會像C/C++語言或匯編那樣更加明確的處理記憶體資料,但是可想而知即使被VB轉換CPU里的代碼量也不會增加多少。這樣的程序節約了無用代碼的執行,也減少了記憶體交換的程序,程式速度自然就快了。
uj5u.com熱心網友回復:
pset確實慢,不過這種陰影效果就這么簡單,這只是提供個方法而已
uj5u.com熱心網友回復:

uj5u.com熱心網友回復:
制作一個藍色點陣圖,滑鼠移動時將藍色點陣圖用半透明的形式畫到背景圖上即可轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/95298.html
標籤:VB基礎類
上一篇:服務器與多客戶端間通信時,服務器能否知道哪個客戶端給他發送了資料
下一篇:VB6能否控制多點觸摸?
