none
[VB2010]關於模組之by ref 的 color問題 RRS feed

  • 問題

  • HI~各位,我想把getpointcolor寫進模組中,中途發現了一個問題不知怎處理

    就是把

     ByRef ColorScreen

    轉成

     Optional ByRef ColorScreen

    他需要輸入預設值,當隋便給他時ByRef [ColorScreen As Color = Color.AliceBlue ],他就會出現錯誤"必需是常數運算式",請問有人知道要怎解決嗎?

    Imports System.Runtime.InteropServices
    
    Module GetColorModule
        <DllImport("User32.dll", EntryPoint:="GetDC", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto, exactspelling:=True)> _
        Public Function GetDC(ByVal hwnd As IntPtr) As IntPtr
        End Function
        <DllImport("user32.dll")> _
        Private Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer
        End Function
        Public Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As IntPtr, ByVal X As Int32, ByVal Y As Int32) As Int32
    
        Public Function GPC(ByVal mpx As Integer, ByVal mpy As Integer, ByRef ColorCode As Long, Optional ByRef ColorScreen As Color ) As ModuleHandle
            Dim hdc As IntPtr
            hdc = GetDC(IntPtr.Zero)
            ColorCode = GetPixel(hdc, mpx, mpy)
            ColorScreen = ColorTranslator.FromWin32(ColorCode)
            ReleaseDC(IntPtr.Zero, hdc)
        End Function
    End Module


    補充發問:

     Public Function GPC(ByVal mpx As Integer, optional byref XXX as array) As ModuleHandle

    如果 要 optional byref XXX as array 的話(如上) ,後面的 = 要填上什麼?還是要使用多載?求教學


    2013年4月20日 下午 02:44

解答

  • Color是結構 不是常數運算式

    請使用多載的方式

        Public Function GPC(ByVal mpx As Integer, ByVal mpy As Integer, ByRef ColorCode As Long) As ModuleHandle
            Return GPC(mpx, mpy, ColorCode, Color.AliceBlue)
        End Function
        Public Function GPC(ByVal mpx As Integer, ByVal mpy As Integer, ByRef ColorCode As Long, ByRef ColorScreen As Color) As ModuleHandle
            Dim hdc As IntPtr
            hdc = GetDC(IntPtr.Zero)
            ColorCode = GetPixel(hdc, mpx, mpy)
            ColorScreen = ColorTranslator.FromWin32(ColorCode)
            ReleaseDC(IntPtr.Zero, hdc)
        End Function
    


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    微軟實戰課程日

    • 已標示為解答 CarbonDiarox 2013年4月21日 上午 06:50
    2013年4月20日 下午 04:30

所有回覆

  • Color是結構 不是常數運算式

    請使用多載的方式

        Public Function GPC(ByVal mpx As Integer, ByVal mpy As Integer, ByRef ColorCode As Long) As ModuleHandle
            Return GPC(mpx, mpy, ColorCode, Color.AliceBlue)
        End Function
        Public Function GPC(ByVal mpx As Integer, ByVal mpy As Integer, ByRef ColorCode As Long, ByRef ColorScreen As Color) As ModuleHandle
            Dim hdc As IntPtr
            hdc = GetDC(IntPtr.Zero)
            ColorCode = GetPixel(hdc, mpx, mpy)
            ColorScreen = ColorTranslator.FromWin32(ColorCode)
            ReleaseDC(IntPtr.Zero, hdc)
        End Function
    


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    微軟實戰課程日

    • 已標示為解答 CarbonDiarox 2013年4月21日 上午 06:50
    2013年4月20日 下午 04:30
  • 您可以在程序中自己指定預設值, 例如:

    Private Sub Test(a As Integer, Optional c As Color = Nothing)
       
    If c = Nothing Then
            c
    = Color.Black '預設色彩
       
    End If
       
    ......
    End Sub

    2013年4月21日 上午 03:22
  • 1. GPC 的 ColorScreen 是這個函數唯一回傳值,為何會出現 Optional 的設計?

    2. 為何不把 GPC 回傳值只給 GPC ,用 Return ColorScreen 回傳?

    2013年4月21日 上午 03:59
  • (1)其實傳出值有2個,一個是colorcode (interger),一個是colorcreen(color),因為想有時候傳出是colorcode,有時候是colorcreen,所以想把Optional加上去。

    (2)對啊,可以傳給GPC,我怎麼沒有想到。抱歉,自己亂摸索的,沒有發現可以這樣做。

    2013年4月21日 上午 06:50
  • 最好不要將COLOR當成引數 或是共用變數
    因為COLOR執行個體不是執行緒安全 在多緒下 會出事

    可用Color.ToARGB 將之轉成一個Int32 再傳遞
    收到此Int32後 用Color.FromArgb(Int32)  再重建Color結構
    2013年4月22日 下午 04:52