none
VB6中做出類似白板的設計,可以在顯示的物件上寫字、畫線...等等 RRS feed

  • 問題

  • 剛學到在VB6的Form上按住滑鼠來畫圖與線的方法,如:

    Private Sub Form_Load()
    With Image1
    '    .BackStyle = 0
        .Height = Form1.ScaleHeight
        .Width = Form1.ScaleWidth
    End With

    End Sub

    Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        DrawFlag = True
        PSet (X, Y), RGB(0, 0, 255)
    End Sub

    Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        If DrawFlag Then
            Line -(X, Y), RGB(0, 0, 255)
        End If
    End Sub

    Private Sub Image1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
        DrawFlag = False
    End Sub

    (程式碼參考《Visual Basic 6.0 程式設計實務入門‧滑鼠與鍵盤事件》,陳徹工作室,2003.3)

    本想利用此特點,應用在類似"白板"的效果,可以在任何文件或檔案上畫線,又不影響原檔;然而又想到若將image的backstyle設為0(透明),但Form依然不透明(form沒有BackStyle屬性可設置)這種取巧的方式依然無用.

    有沒有辦法讓表單與控制項背景皆作透明,如此一來,若我開啟此表單,只要將其放到最大,在上面畫線、寫字,就可以有類似白板的效果,又不會蓋過它背後的畫面了(教學想到的)

    因為有時秀出課文的掃描圖檔,想在上面圈寫文字,方便授課時講解.

    或者有沒有別的設計方法,可以有類似的功能?

    直接用圖片編輯軟體或許可行,但那也只能用在圖片上,於編輯階段時畫線,若要在Word文件上畫,又得用Word功能...其他類推.如果能做成一個透明的表單,直接在上畫線,則我想任何顯示的畫面上皆可在上面畫線而不影響原檔案了.

    (同樣的道理,用滑鼠寫字,則字很醜;但若打好了字,背景為透明,再把此字挪到所須註明的畫面上方或附近,則一樣有白板的效果.且因其皆為透明的,可以無限重疊,只要文字與線條不重疊,皆不會蓋住後方原本的畫面)

    另,在線上說明中有BackStyle屬性,且Applies to內確實有image控制項,但真如前式寫來,執行時卻說找不到方法與資料成員,怎麼會這樣呢?明明有此屬性,編譯時卻顯示有此錯誤哩.尚請高手先進幫忙解惑了!感謝!!

    (哈!抱歉,這個屬性的說明原來在Visual FoxPor 6.0裡,看太過,沒仔細看是Foxpro 不是Basic,可VB6中有否類似屬性可設定?感謝! 我看到有Windows CE Toolkit for Visual Basic 5.0,不知是不是Basic可用的? 可也不知如何運用)

    (又看到應用於UserControl-創建 ActiveX 控制項的--有BackStyle屬性.但只有ActiveX控制項,可以獨立運行麼? 不必依附Form麼? ActiveX應該不能單獨作exe檔吧?)

    <sup></sup>BackStyle Property

    Applies To See Also

    Specifies whether the background of an object is transparent or opaque. Available at design time and run time.

    Syntax

    Object.BackStyle[ = nStyle]

    Settings

    nStyle

    The settings for the BackStyle property are:

    Setting Description
    0 Transparent. Anything behind the object is visible.
    1 (Default) Opaque. The object's BackColor fills the control and obscures any color or graphics behind it.

    Remarks

    You can use the BackStyle property to create transparent controls when you are using a background color on a Form object or when you want to place a control over a graphic. Use an opaque control when you want it to stand out on a busy background.

    An object's BackColor property is ignored if the BackStyle property is set to 0 (Transparent).

    For a Page object, the BackStyle property is read-only when the Tabs property is set to true (.T.) for the PageFrame containing the Page.

    Applies To

    CheckBox, CommandGroup, Container Object, Control Object, EditBox, Image, Label, OptionButton, OptionGroup, Page, Shape, TextBox


    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?




    • 已編輯 任真 2012年5月29日 上午 01:41 補充
    2012年5月29日 上午 01:28

解答

  • 您好,

    請試一下「VB6 Transparency」。

    是否有考慮使用VB.NET?

    只要調整Form的Opacity屬性就可以了!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年5月29日 上午 01:34
  • 啊!不好意思,沒看清楚你的主旨是 "怎樣弄透明" 。

    你需要呼叫Windows API去做,這裡有兩個URL你可以參考,它們都是用同樣的API和方法做。
    1) VB6 - Making a form transparent
    2) Color Constants / Color Forms / Controls / Transparency VB6

    .

    另外你可以改變兩個圖的RGB去實現透明效果,但比較麻煩,因為你要把兩個不同的圖的RGB相加再除二 (或除其他參數去取得不同 %的透明效果)
    3) Real-Time Image Blending/Transparency (VB6)


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog


    2012年5月29日 上午 07:33
  • 當你堅持 VB6 的時候,你會發現資源很少,因為大家都早改用 VBNET 了。

    VB3 內建範例有附一個好像是叫 IconWork 的原始碼。

    VB5 以前我記得有另外一個內建範例。

    我以前從 VB 4.0 看到 6.0 這一系列的書,專門講這方面的需求:

    https://www.google.com.tw/#hl=zh-TW&q=%22Visual+Basic%22+%E5%A4%9A%E5%AA%92%E9%AB%94+%E6%AD%B7%E9%9A%AA

    我還看過一個螢幕保護程式的原始碼,是類似你要的,在桌面上畫一堆圖,可以看到背景的桌面。

    你可以看這個關鍵字搜尋的結果:

    https://www.google.com.tw/#hl=zh-TW&q=VB6+%E4%B8%8D%E8%A6%8F%E5%89%87%E8%A1%A8%E5%96%AE

    我記得是用個透明表單,然後畫在上面,就是那個螢幕保護程式用的方式。


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


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

    • 已標示為解答 任真 2012年6月2日 上午 04:55
    2012年6月1日 下午 04:26
  • 由前面所示第二式是成功了,程式碼如下:

    'Call API SetLayeredWindowAttributes
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function SetLayeredWindowAttributes Lib "user32" _
    (ByVal hwnd As Long, ByVal crKey As Long, _
    ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
    Dim DrawFlag As Boolean '外部宣告
    Private Sub Command1_Click()
    MakeTransparent hwnd, 55
    End Sub
    ' Para1 傳 Handle Value , Para2 傳 1 ~ 254 之間的值 , 值越小透明度越高
    Sub MakeTransparent(ByVal hwnd As Long, Perc As Byte)
    If (Perc > 0 Or Perc < 255) And Len(Environ("OS")) > 0 Then
    SetWindowLong hwnd, -20, GetWindowLong(hwnd, -20) + 524288
    SetLayeredWindowAttributes hwnd, 0, Perc, 2
    End If
    End Sub

    Private Sub Form_Load()
    Me.WindowState = vbMaximized
    End Sub

    'http://www.dotblogs.com.tw/PowerHammer/archive/2008/03/24/2253.aspx
    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
        DrawFlag = True
            PSet (x, y), RGB(0, 0, 255)

    End Sub

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
        If DrawFlag Then
            Line -(x, y), RGB(0, 0, 255)
            DrawWidth = 5
        End If

    End Sub

    Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
        DrawFlag = False

    End Sub
    'http://tw.myblog.yahoo.com/clonin-vb/article?mid=41&prev=-2&next=-2&page=1&sc=1#yartcmt

    附所見圖:

    只是問題又來了:即表單透明後,連畫的線也透明了,不知可否表單透明,但畫的線較不透明或不透明.(即所畫之線與表單的透明程度不同調呢?)

    接著,如擦布功能,及線條粗線功能.可以安個控制項供設定,但又浮現此控制項也會隨表單一起透明的困境.如何使此控制項不隨表單一塊透明,猶如線條也不一起透明.擦布的功能應也是畫線的功能,只是此畫出之線,也得和表單一樣透明才行.再來,最簡單的方式用cls方法可以一次清乾淨,但卻少了靈活性.如果只想要部分擦拭掉,則非設計擦布功能(即畫出透明線條以蓋過原畫的線條才行了)


    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?


    • 已標示為解答 任真 2012年6月2日 上午 07:26
    • 已編輯 任真 2012年6月2日 上午 07:57 補充
    2012年6月2日 上午 07:25

所有回覆

  • 您好,

    請試一下「VB6 Transparency」。

    是否有考慮使用VB.NET?

    只要調整Form的Opacity屬性就可以了!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年5月29日 上午 01:34
  • 有! 非常感謝! VB6學完後準備學2010了 書也買了.

    看亂先生補充的VB6 Transparency裡又須用到API,看來也不是簡單的設置(如屬性),又得學習了!


    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?


    • 已編輯 任真 2012年5月29日 上午 01:44 補充
    2012年5月29日 上午 01:39
  • 有一個短片救你怎用VB6寫一個自家的Paint,你可以參考一下。

    [Youtube] : How To Make Your Own Paint in Visual Basic 6.0


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    2012年5月29日 上午 01:52
  • 謝謝 有用.又學到了新的東西,主要是線條的寬度....^^

    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?

    2012年5月29日 上午 02:03
  • 如果沒有更簡便的方法,就選2樓亂馬客先生的解答為解答了

    實因在下於亂先生提示的方法還不甚了了(能力有限,於API還不解,一時無法實作),不敢說是一定行之有效的方法,所以遲未選為解答.請見諒.

    再次感謝二位先生即時的幫助.不過4樓的MS先生主要是指導繪圖方法,沒觸及我所最需要的"透明"設定的部分.


    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?

    2012年5月29日 上午 02:56
  • 啊!不好意思,沒看清楚你的主旨是 "怎樣弄透明" 。

    你需要呼叫Windows API去做,這裡有兩個URL你可以參考,它們都是用同樣的API和方法做。
    1) VB6 - Making a form transparent
    2) Color Constants / Color Forms / Controls / Transparency VB6

    .

    另外你可以改變兩個圖的RGB去實現透明效果,但比較麻煩,因為你要把兩個不同的圖的RGB相加再除二 (或除其他參數去取得不同 %的透明效果)
    3) Real-Time Image Blending/Transparency (VB6)


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog


    2012年5月29日 上午 07:33
  • 先生實在太用心了 只是我一時消化不了,為不使先生美意打折,我就先選您為解答吧 也向亂先生致歉了.但我想,如果我懂API的話,亂先生的解答應該一開始就可以了.是吧? 恕孫某初學,還在懵懂中.只能先勾解答,日後再慢慢研磨了(發現先生所示皆非一時半刻可熟悉的.見諒見諒) 為免辜負二先生美意,也讓其他先進以為我問答沒有誠意,謹先選擇MS先生的權作解答.希望對有相同疑問的同學,也有幫助. 任真謹啟 謝謝大家

    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?

    2012年5月29日 上午 10:43
  • 既有討論:

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=232%20VB6%20PictureBox%20%e5%9c%96%e5%b1%a4

    兩圖層相疊參考線上手冊:

    PaintPicture 方法

    FormPictureBox Printer 上繪製圖形檔案 (.bmp、.wmf、.emf、
    .cur, .ico或 .dib) 內的內容。不支援指名引數

    語法

    object.PaintPicture picture, x1, y1, width1, height1, x2, y2, width2, height2, opcode

    PaintPicture 方法的語法具有下列幾個單元:

    單元 描述
    object 選擇性引數。物件運算式,其值為「適用於」清單中的某個物件。如果省略 object會假設擁有駐點Form 物件為 object
    Picture 必要的引數。繪製到 object
    上的圖形來源。FormPictureBox 必須是 Picture
    屬性。
    x1, y1 必要的引數。單精確度數值,用來指定在 object 上繪製
    picture 的目標座標 (x-軸和y-軸)。object
    ScaleMode 屬性決定使用的測量單位。
    Width1 選擇性引數。單精確度數值,指示 picture
    的目標寬度。object ScaleMode
    屬性決定使用的測量單位。如果目標寬度比來源寬度 (width2) 大或小,將適當地延伸或壓縮
    picture。如果該引數省略,則使用來源寬度。
    Height1 選擇性引數。 單精確度數值,指示 picture
    的目標高度。object ScaleMode
    屬性決定使用的測量單位。如果目標高度比來源高度 (height2) 大或小,將適當地延伸或壓縮
    picture。如果該引數省略,則使用來源高度。
    x2, y2 選擇性引數。單精確度數值,指示 picture 內剪貼區的座標
    (x-軸和 y-軸)。object ScaleMode
    屬性決定使用的測量單位。如果該引數省略,則假設為 0。
    Width2 選擇性引數。單精確度數值,指示 picture
    內剪貼區的源寬度。object ScaleMode
    屬性決定使用的測量單位。如果該引數省略,則使用整個來源寬度。
    Height2 選擇性引數。 單精確度數值,指示 picture
    內剪貼區的來源高度。object ScaleMode
    屬性決定使用的測量單位。如果該引數省略,則使用整個來源高度。
    Opcode 選擇性引數。是僅由點陣圖使用的長型數值或程式碼。用來定義在繪製 pictur object 上,對 picture 執行處理位元的運算 (例如,vbMergeCopy
    vbSrcAnd)。關於處理位元的運算元常數的完整清單,請參閱 Visual Basic 說明中的 RasterOp 常數。

    在 opcodes 的使用上有一些限制。例如:如果該資料是圖示或中繼檔,以及和該模式相互交談的 opcode (或 SDK 中的「筆刷」),像是和目的端的
    FillStyle 屬性實際交談的MERGECOPY, PATCOPY、PATPAINT、及 PATINVERT,除了vbSrcCopy
    外,其他的 opcode 均無法使用。

    注意   Opcode 用於在點陣圖上傳送一個處理位元運算元,當傳送其他影像類型時,將一個值給該參數,會造成
    「程序呼叫或引數不正確」的錯誤。這是設計時造成的。要避免這個錯誤,除了點陣圖以外的影像,將 Opcode
    參數設為空。

    請注意

    您可以使用負的目標高度數值 (height1) 和 (或) 目標寬度數值 (width1)水平或垂直翻轉點陣圖。

    您可以任意省略多個選擇性的尾隨引數。如果省略了一或多個選擇性的尾隨引數,則不可在最後一個引數後面君加逗號。如果想指定某個選擇性引數,必須先指定語法中出現在該引數前的全部引數。

    注意,在將一個.Bmp 載入 PictureBox 控制項和使用 Windows API 函數 BitBlt()
    加入圖形之間有一點不同。當您 BitBlt 一個影像時,PictureBox 不知道像您使用 LoadPicture
    方法那樣去修正大小。將 ScaleWidthScaleHeight 屬性設定為影像的大小也不起作用。如果您想在
    BitBlt'ing 之後用 PictureBox
    修正新圖形的大小,必須用程式碼人工執行,轉換單位並處理邊界,下面是如何執行的一個簡單範例:

    Sub ResizePictureBoxToImage(pic as PictureBox, twipWd _ as Integer, twipHt as Integer) ' 此程式碼假設所有單位均為 twips'如果不這樣,必須在呼叫此程序之前先轉換為twips '也假設該影像也 blt’ed 0,0 Dim BorderHt as Integer, BorderWd as Integer BorderWd = Pic.Width - Pic.ScaleWidth BorderHt = Pic.Height - Pic.ScaleHeight pic.Move pic.Left, pic.Top, twipWd + BorderWd, _ twipHt + BorderHtEnd Sub

    RasterOp 常數

    常數 說明
    vbDstInvert &H00550009 反向目標點陣圖
    vbMergeCopy &H00C000CA 合併模式和來源點陣圖
    vbMergePaint &H00BB0226 Or 運算合併反向播放的來源點陣圖和目標點陣圖
    vbNotSrcCopy &H00330008 複製反向播放的來源點陣圖到目標點陣圖
    vbNotSrcErase &H001100A6 Or 運算合併來源點陣圖和目標點陣圖,然後反向播放
    vbPatCopy &H00F00021L 將模式複製到目標點陣圖
    vbPatInvert &H005A0049L Xor 運算合併目標點陣圖與模式
    vbPatPaint &H00FB0A09L Or 運算合併反向播放的來源點陣圖與模式。然後用 Or
    運算合併上述結果與目標點陣圖
    vbSrcAnd &H008800C6 And 運算合併目標像素與來源點陣圖
    vbSrcCopy &H00CC0020 複製來源點陣圖到目標點陣圖
    vbSrcErase &H00440328 反向播放目標點陣圖並用 And 運算合併所得結果與來源點陣圖
    vbSrcInvert &H00660046 Xor 運算合併目標像素和來源點陣圖
    vbSrcPaint &H00EE0086 Or 運算合併目標像素和來源點陣圖

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


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

    2012年5月30日 下午 03:13
  • 如果你沒有 VB6 的線上手冊,請直接改用 VBNET ,線上手冊內容多到萬頁以上,市面的書最多千頁而已。

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


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

    2012年5月30日 下午 03:14
  • 謝謝心冷兄又來作答,感恩!

    我有簡字版的,可以對應.曾有一貼自行解決了安裝問題

    VBNet是一定要學的,書也買了,想我兄已經知道了(是您指導我的)甚至也開始留意VS 11了 

    對不起,若我行文仍有拗口之處,請多海涵.我盡量留意!只是有時習性使然,有時也因懶得多打幾字,故用較簡潔(類似文言)的語詞表示.但通常都像白話的縮語或省稱、略稱,可以單字想到其複詞義的.若真不幸還留有此殘渣,還望您能讀懂.我若沒留意而又讓您讀不懂請跟我說,我一定馬上再改.勞駕了.

    對了 剛才略看一下,並無有關於透明的設置呢 守真駑鈍,可否請心冷兄再指點一二?

    簡化版說明貼附如下供諸兄對譯參攷:

    <object classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" id="hhobj_4" type="application/x-oleobject"><param name="Width" value="0" /><param name="Height" value="0" /><param name="Command" value="ALink" /><param name="Item1" value="" /><param name="Item2" value="defnamedarguments" /></object><object classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" id="hhobj_5" type="application/x-oleobject"><param name="Width" value="0" /><param name="Height" value="0" /><param name="Command" value="ALink" /><param name="Item1" value="" /><param name="Item2" value="defobjectexpression" /></object><object classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" id="hhobj_6" type="application/x-oleobject"><param name="Width" value="0" /><param name="Height" value="0" /><param name="Command" value="ALink" /><param name="Item1" value="" /><param name="Item2" value="deffocus" /></object><object classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" id="hhobj_7" type="application/x-oleobject"><param name="Width" value="0" /><param name="Height" value="0" /><param name="Command" value="ALink" /><param name="Item1" value="" /><param name="Item2" value="vbdefbitmap" /></object><object classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" id="hhobj_8" type="application/x-oleobject"><param name="Width" value="0" /><param name="Height" value="0" /><param name="Command" value="ALink" /><param name="Item1" value="" /><param name="Item2" value="defarg" /></object><object classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" id="hhobj_9" type="application/x-oleobject"><param name="Width" value="0" /><param name="Height" value="0" /><param name="Command" value="ALink" /><param name="Item1" value="" /><param name="Item2" value="vbdefsyntax" /></object>

    <sup></sup>PaintPicture 方法

    <object classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" height="19" id="hhobj_1" style="width:48px;height:19px;top:61px;left:10px;" type="application/x-oleobject" width="48"><param name="Width" value="1270" /><param name="Height" value="503" /><param name="Command" value="ALink" /><param name="Item1" value="" /><param name="Item2" value="vbmthPaintPicture_C;vbmthPaintPictureC;vbmthPaintPictureMoveC;vbproBooksOnlineJumpTopic" /><param name="Button" value="请参阅" /><param name="Font" value=",,,,underline" /></object>    <object classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" height="19" id="hhobj_2" style="width:32px;height:19px;top:61px;left:84px;" type="application/x-oleobject" width="32"><param name="Width" value="847" /><param name="Height" value="503" /><param name="Command" value="ALink" /><param name="Item1" value="" /><param name="Item2" value="vbmthPaintPicture_X;vbmthPaintPictureX" /><param name="Button" value="示例" /><param name="Font" value=",,,,underline" /></object>    <object classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" height="19" id="hhobj_3" style="width:48px;height:19px;top:61px;left:142px;" type="application/x-oleobject" width="48"><param name="Width" value="1270" /><param name="Height" value="503" /><param name="Command" value="ALink" /><param name="Item1" value="" /><param name="Item2" value="vbmthPaintPicture_A;vbmthPaintPictureA" /><param name="Button" value="应用于" /><param name="Font" value=",,,,underline" /></object>

    用以在 Form, PictureBox Printer 上绘制图形文件(.bmp、.wmf、.emf、.cur、.ico或 .dib)的内容。不支持命名参数

    语法

    object.PaintPicture picture, x1, y1, width1, height1, x2, y2, width2, height2, opcode

    PaintPicture 方法的语法包含下列部分:

    部分 描述
    object 可选的。一个对象表达式,其值为“应用于”列表中的一个对象。如果省略 object,带有焦点Form 对象缺省为 object
    Picture 必需的。要绘制到 object 上的图形源。Form PictureBox 必须是 Picture 属性。
    x1, y1 必需的。均为单精度值,指定在 object 上绘制 picture 的目标坐标(x-轴和y-轴)。object ScaleMode 属性决定使用的度量单位。
    Width1 可选的。单精度值,指示 picture 的目标宽度。object ScaleMode 属性决定使用的度量单位。如果目标宽度比源宽度 (width2) 大或小,将适当地拉伸或压缩 picture。如果该参数省略,则使用源宽度。
    Height1 可选的。 单精度值,指示 picture 的目标高度。object ScaleMode 属性决定使用的度量单位。如果目标高度比源高度 (height2) 大或小,将适当地拉伸或压缩 picture。如果该参数省略,则使用源高度。
    x2, y2 可选的。均为单精度值,指示 picture 内剪贴区的坐标(x-轴和y-轴)。object ScaleMode 属性决定使用的度量单位。如果该参数省略,则缺省为 0。
    Width2 可选的。单精度值,指示 picture 内剪贴区的源宽度。object ScaleMode 属性决定使用的度量单位。如果该参数省略,则使用整个源宽度。
    Height2 可选的。 单精度值,指示 picture 内剪贴区的源高度。object ScaleMode 属性决定使用的度量单位。如果该参数省略,则使用整个源高度。
    Opcode 可选的。是长型值或仅由位图使用的代码。它用来定义在将 pictur 绘制到 object 上时对 picture 执行的位操作(例如, vbMergeCopy vbSrcAnd 操作符)。关于位操作符常数的完整列表,请参阅 Visual Basic Help 文件中的 RasterOp Constants 主题。

    在使用opcode时有一些限制。例如,如果资源是图标或图元文件,则只能使用 vbSrcCopy,而不能使用其他的opcode;并且,与图案 (或 SDK 术语中的"画笔"),如 MERGECOPY、 PATCOPY、 PATPAINT 和 PATINVERT,相交互的opcode实际上是同目标的 FillStyle 属性交互。

    注意   Opcode 用于将按位操作传递到位图。当传递其他图象类型时将一个值给该参数会造成“无效过程调用或参数”错误。这是设计的原因。要避免这个错误,对于除位图外的图象,将 Opcode 参数置为空。

    说明

    通过使用负的目标高度值 (height1) 和 / 或目标宽度值 (width1) 可以水平或垂直翻转位图。

    可以省略任何多个可选的尾部的参数 。如果省略了一个或多个可选尾部参数,则不能在指定的最后一个参数后面使用逗号。如果想指定某个可选参数,则必须先指定语法中出现在该参数前面的全部参数。

    注意,在将一个.Bmp加载入 PictureBox 控件和使用 Windows API 函数 BitBlt() 添加图片之间有一点不同。当您对一个图象使用 BitBlt() 时,PictureBox 控件不知道象您使用 LoadPicture方法那样去调整大小。将 ScaleWidthScaleHeight 属性设置为图象的大小也不起作用。如果您想在使用 BitBlt 之后用 PictureBox 调整新图片的大小,必须用代码手工做,转换单位并处理边框,下面是如何这样做的一个简单示例:

    Sub ResizePictureBoxToImage(pic as PictureBox, twipWd _
      as Integer, twipHt as Integer)
     ' 该代码假设所有的单位都为缇。如果
     ' 不是,必须在调用该例程之前,转换为缇。
     ' 这里也假设图象显示在0,0处。
     Dim BorderHt as Integer, BorderWd as Integer
     BorderWd = Pic.Width - Pic.ScaleWidth
     BorderHt = Pic.Height - Pic.ScaleHeight
     pic.Move pic.Left, pic.Top, twipWd + BorderWd, _
       twipHt + BorderHt
    End Sub

    <sup></sup>RasterOp 常数

    <object classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" height="19" id="hhobj_1" style="width:48px;height:19px;" type="application/x-oleobject" width="48"><param name="Width" value="1270" /><param name="Height" value="503" /><param name="Command" value="ALink" /><param name="Item1" value="" /><param name="Item2" value="vbidxRasterOpConstantsC;vbproBooksOnlineJumpTopic" /><param name="Button" value="请参阅" /><param name="Font" value=",,,,underline" /></object>

    常数 描述
    vbDstInvert &H00550009 反转目标位图
    vbMergeCopy &H00C000CA 合并模式和源位图
    vbMergePaint &H00BB0226 Or 运算合并反转的源位图和目标位图
    vbNotSrcCopy &H00330008 将反转的源位图复制到目标
    vbNotSrcErase &H001100A6 Or 运算合并源位图和目标位图,然后反转
    vbPatCopy &H00F00021L 将模式复制到目标位图
    vbPatInvert &H005A0049L Xor 运算合并目标位图与模式
    vbPatPaint &H00FB0A09L Or 运算合并反转的源位图与模式。然后用 Or 运算合并上述结果与目标位图
    vbSrcAnd &H008800C6 And 运算合并目标像素与源位图
    vbSrcCopy &H00CC0020 将源位图复制到目标位图
    vbSrcErase &H00440328 反转目标位图并用 And 运算合并所得结果与源位图
    vbSrcInvert &H00660046 Xor 运算合并目标像素和源位图
    vbSrcPaint &H00EE0086 Or 运算合并目标像素和源位图


    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?




    • 已編輯 任真 2012年5月31日 上午 02:49 補充
    2012年5月31日 上午 02:28
  • 圖不是直接透明,而是兩張圖以邏輯運算方式結合,產生第二張疊在上面的圖可以透下去。

    這是一本線上電子書,看第七章下面 A Word About Blitting 那節下面各小節,直接有圖給你看。

    http://vb.mvps.org/hardcore/index.html


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


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

    2012年5月31日 下午 03:56
  • 謝謝心冷兄 原文書,又是VB的hardcore 看來我得慢慢咀嚼消化一下

    也知我兄雖然不諳古文,然於英文恐怕卻較弟嫻熟許許多了.正好也讓我好好練習復習一下英文

    只是怕我兄沒留意我指"白板"的功能,不但是表單上的圖透明,而是表單本身的透明,這樣方能在其放到最大時,有透明白板的效果,可以在呈現的文件或圖檔上,任意畫圖寫字作記號也.(也許兄所示已有關此項說明,而是弟來不及消化細看,還望我兄見諒)

    p.s.對了 兄所示電子書好像只有ie能讀,Firefox Palemoon Opera Chrome都不行.呵.


    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?


    • 已編輯 任真 2012年6月1日 上午 08:55 補充
    2012年6月1日 上午 08:47
  • 當你堅持 VB6 的時候,你會發現資源很少,因為大家都早改用 VBNET 了。

    VB3 內建範例有附一個好像是叫 IconWork 的原始碼。

    VB5 以前我記得有另外一個內建範例。

    我以前從 VB 4.0 看到 6.0 這一系列的書,專門講這方面的需求:

    https://www.google.com.tw/#hl=zh-TW&q=%22Visual+Basic%22+%E5%A4%9A%E5%AA%92%E9%AB%94+%E6%AD%B7%E9%9A%AA

    我還看過一個螢幕保護程式的原始碼,是類似你要的,在桌面上畫一堆圖,可以看到背景的桌面。

    你可以看這個關鍵字搜尋的結果:

    https://www.google.com.tw/#hl=zh-TW&q=VB6+%E4%B8%8D%E8%A6%8F%E5%89%87%E8%A1%A8%E5%96%AE

    我記得是用個透明表單,然後畫在上面,就是那個螢幕保護程式用的方式。


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


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

    • 已標示為解答 任真 2012年6月2日 上午 04:55
    2012年6月1日 下午 04:26
  • 心冷兄 我非堅持VB6 只是目前在學這個 系統又有安裝這個,方便實做罷了.想知VB6可不可以做到.

    讀君一席話,總能勝讀十年書!讀了十年,恐怕也未能如兄見識之廣.任真何幸!若無兄如是分秒間傳授您曾經費了多少年經眼的寶貴經驗,不知茫茫書海,將從何邂逅了.

    感謝兄不辭辛勞,再三提點.關於此題,反倒弟身為事主卻怠慢多了.實在是所學太淺,不及一一消化吸收與摸索.在我這本VB6的書學完之後,會開始先接觸上次買到的SQL或VB 2010的新書吧.

    這個問題我都記下備分了,但願那天緊迫時,再拿出來復習實作!若還有問題,再請教我兄.只不知屆時,尚有如此幸運蒙諸兄清閒指教了.

    今天發現解答標示可以複選,就將諸兄勠力指教者,感覺有受用,就先標識為解答,以表感謝了!


    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?


    • 已編輯 任真 2012年6月2日 上午 04:57 補充
    2012年6月2日 上午 04:55
  • 大概看了我兄所示的搜尋結果,見此帖「

    [分享]VB6不規則透明表單範例[複製鏈接]

    」可是須要會員才能下載範例.目前無法一窺其奧妙.不過針對VB6透明表單的製作,確實有人嘗試,也似乎確實可行.

    哇 用透明表單檢索 所得更多 感謝我兄指引!

    https://www.google.com.tw/#hl=zh-TW&q=VB6+%E9%80%8F%E6%98%8E+%E8%A1%A8%E5%96%AE&oq=VB6+%E9%80%8F%E6%98%8E+%E8%A1%A8%E5%96%AE&aq=f&aqi=&aql=&gs_l=serp.3...193130.206344.0.206629.18.18.0.0.0.0.149.824.17j1.18.0...0.0.1Sby7mLw6iA&bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&fp=be6d50e6353763e2&biw=994&bih=839

    諸兄好!稟諸兄:

    已成功了!

    用此兄所提供的程式碼 照貼就可以了:

    http://tw.myblog.yahoo.com/clonin-vb/article?mid=41&prev=-2&next=-2&page=1&sc=1#yartcmt

    Private Declare Function GetWindowLong Lib "user32" Alias _
    "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias _
    "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, _
    ByVal dwNewLong As Long) As Long
    Private Declare Function SetLayeredWindowAttributes Lib "user32" _
    (ByVal hwnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, _
    ByVal dwflags As Long) As Long

    Private Const GWL_EXSTYLE = (-20)
    Private Const WS_EX_LAYERED = &H80000
    Private Const WS_EX_TRANSPARENT = &H20&
    Private Const LWA_ALPHA = &H2&

    Private Sub Form_Load()
     Dim lOldStyle As Long
     Dim bTrans As Byte
     Me.BackColor = 0
     SetWindowLong Me.hwnd, -20, GetWindowLong(Me.hwnd, -20) Or WS_EX_LAYERED
     SetLayeredWindowAttributes Me.hwnd, 0, 0, 1 '第二個參數指的是顏色
     bTrans = 10 '透明度 0~255之間 越小越透明
     lOldStyle = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
    End Sub

    這個好像也可以(還沒試.但有附VB.Net也有附VB6的程式碼)

    http://www.dotblogs.com.tw/PowerHammer/archive/2008/03/24/2253.aspx

    哈 前一個透明好像沒用.當點透明區塊時,就穿過了表單本身.能否引發其畫圖機制,恐怕還待試!

    試過了,不行!Form_MouseMove無作用了.請教高手解惑.(其實這第一段的程式碼許多我都看不懂,還不會)

    又再搜索下,發現本壇一個多月前也有人問過類似的問題了

    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/06b4e6a6-5337-4eb8-b75b-739e80a2127e


    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?








    • 已編輯 任真 2012年6月2日 上午 05:44 補充
    2012年6月2日 上午 05:14
  • 由前面所示第二式是成功了,程式碼如下:

    'Call API SetLayeredWindowAttributes
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function SetLayeredWindowAttributes Lib "user32" _
    (ByVal hwnd As Long, ByVal crKey As Long, _
    ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
    Dim DrawFlag As Boolean '外部宣告
    Private Sub Command1_Click()
    MakeTransparent hwnd, 55
    End Sub
    ' Para1 傳 Handle Value , Para2 傳 1 ~ 254 之間的值 , 值越小透明度越高
    Sub MakeTransparent(ByVal hwnd As Long, Perc As Byte)
    If (Perc > 0 Or Perc < 255) And Len(Environ("OS")) > 0 Then
    SetWindowLong hwnd, -20, GetWindowLong(hwnd, -20) + 524288
    SetLayeredWindowAttributes hwnd, 0, Perc, 2
    End If
    End Sub

    Private Sub Form_Load()
    Me.WindowState = vbMaximized
    End Sub

    'http://www.dotblogs.com.tw/PowerHammer/archive/2008/03/24/2253.aspx
    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
        DrawFlag = True
            PSet (x, y), RGB(0, 0, 255)

    End Sub

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
        If DrawFlag Then
            Line -(x, y), RGB(0, 0, 255)
            DrawWidth = 5
        End If

    End Sub

    Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
        DrawFlag = False

    End Sub
    'http://tw.myblog.yahoo.com/clonin-vb/article?mid=41&prev=-2&next=-2&page=1&sc=1#yartcmt

    附所見圖:

    只是問題又來了:即表單透明後,連畫的線也透明了,不知可否表單透明,但畫的線較不透明或不透明.(即所畫之線與表單的透明程度不同調呢?)

    接著,如擦布功能,及線條粗線功能.可以安個控制項供設定,但又浮現此控制項也會隨表單一起透明的困境.如何使此控制項不隨表單一塊透明,猶如線條也不一起透明.擦布的功能應也是畫線的功能,只是此畫出之線,也得和表單一樣透明才行.再來,最簡單的方式用cls方法可以一次清乾淨,但卻少了靈活性.如果只想要部分擦拭掉,則非設計擦布功能(即畫出透明線條以蓋過原畫的線條才行了)


    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?


    • 已標示為解答 任真 2012年6月2日 上午 07:26
    • 已編輯 任真 2012年6月2日 上午 07:57 補充
    2012年6月2日 上午 07:25
  • 暫時用"白色"作為擦布,改良如下:(按鍵盤左上ESC鍵可以全部清除.按滑鼠右鍵 可以擦掉. 按Ctrl+w可以關閉)

    將其打開(執行)後,可以在螢幕上寫字畫圖,當作白板功能
     用滑鼠(左鍵)寫字畫圖

    ''Call API SetLayeredWindowAttributes
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function SetLayeredWindowAttributes Lib "user32" _
    (ByVal hwnd As Long, ByVal crKey As Long, _
    ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
    Dim DrawFlag As Boolean '¥~³¡«Å§i
    'Private Sub Command1_Click()
    'MakeTransparent hwnd, 55 '155
    'End Sub
    ' Para1 ¶Ç Handle Value , Para2 ¶Ç 1 ~ 254 ¤§¶¡ªº­È , ­È¶V¤p³z©ú«×¶V°ª
    Sub MakeTransparent(ByVal hwnd As Long, Perc As Byte)
    If (Perc > 0 Or Perc < 255) And Len(Environ("OS")) > 0 Then
    SetWindowLong hwnd, -20, GetWindowLong(hwnd, -20) + 524288
    SetLayeredWindowAttributes hwnd, 0, Perc, 2
    End If
    End Sub

    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyEscape Then Me.Cls
    If KeyCode = vbkeyesc Then Me.Cls
    If Shift = vbCtrlMask And KeyCode = vbKeyW Then Unload Me

    End Sub

    Private Sub Form_Load()
    Me.WindowState = vbMaximized
    MakeTransparent hwnd, 55 '155

    End Sub

    'http://www.dotblogs.com.tw/PowerHammer/archive/2008/03/24/2253.aspx
    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
        DrawFlag = True
        If Button = vbRightButton Then
            DrawWidth = 15
            PSet (x, y), RGB(255, 255, 255)
        Else
            DrawWidth = 5
            PSet (x, y), RGB(0, 0, 255)
        End If

    End Sub

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
        If DrawFlag Then
            If Button = vbRightButton Then
                DrawWidth = 15
                Line -(x, y), RGB(255, 255, 255)
            Else
                DrawWidth = 5
                Line -(x, y), RGB(0, 0, 255)
            End If
            
        End If

    End Sub

    Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
        DrawFlag = False

    End Sub
    'http://tw.myblog.yahoo.com/clonin-vb/article?mid=41&prev=-2&next=-2&page=1&sc=1#yartcmt


    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?

    2012年6月2日 上午 08:20