none
[VB 2008]如何取得鼠標色碼? RRS feed

  • 問題

  • [VB 2008]如何取得鼠標色碼?

    當滑鼠動的時候,怎樣寫才能顯示出該點的色碼?

    如果要以RGB表示該點顏色要怎寫?

    如果要以色碼表示該點顏色要怎寫?

    求各大大求救。

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        
        label1.text = ?
    
     End Sub

    2010年5月19日 下午 01:01

解答

  • Hi,

    基本上我貼的第一個連結就可以做到了

    感覺您一直想找個一行就出來的寫法(像您提到的是不是一定要用API 、get - point - color、與a = ? (X, Y))

    而不去嚐試理解其運作的概念

     

    直接給你程式算了

    Imports System.Runtime.InteropServices
    
    Public Class Form1
     <DllImport("User32.dll", EntryPoint:="GetDC", _
      CallingConvention:=CallingConvention.StdCall, _
      CharSet:=CharSet.Auto, exactspelling:=True)> _
     Public Shared Function GetDC(ByVal hwnd As IntPtr) As IntPtr
     End Function
     Public Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As IntPtr, ByVal X As Int32, ByVal Y As Int32) As Int32
     <DllImport("user32.dll")> _
    Private Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer
     End Function
     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      Dim hdc As IntPtr
      Dim lngColor As Long
      Dim lngX As Long
      Dim lngY As Long
      Dim p As Point = Cursor.Position
      lngX = p.X
      lngY = p.Y
      hdc = GetDC(IntPtr.Zero)   '取該Handle值的DC 
      lngColor = GetPixel(hdc, lngX, lngY) '取該滑鼠位置的顏色 
      Me.Text = "位置: x:" & lngX & ", y:" & lngY & " ; 顏色:" & lngColor
      Label1.BackColor = ColorTranslator.FromWin32(lngColor)
      ReleaseDC(IntPtr.Zero, hdc)  '將DC 釋放 
     End Sub
    End Class
    

     


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年5月21日 上午 04:55

所有回覆

  • Hi,

    參閱

    如何使用 Visual C# 來取得參考的滑鼠指標的像素的色彩

    http://support.microsoft.com/kb/892462

     

    Color.ToArgb Method

    http://msdn.microsoft.com/en-us/library/system.drawing.color.toargb(v=VS.71).aspx

     

    ColorTranslator.ToHtml 方法

    http://msdn.microsoft.com/zh-tw/library/system.drawing.colortranslator.tohtml(v=VS.80).aspx


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年5月19日 下午 01:39
  • hi,

    感謝大大所提供的資訊

    Color.ToArgb Method 是拿取某點色彩(我猜)

    ColorTranslator.ToHtml 是轉換色彩成值(我猜)

    但小弟才疏學淺,無法看得明白,可以麻煩寫一個小例來參考一下嗎?


    • 已標示為解答 CarbonDiarox 2010年5月20日 下午 05:07
    • 已取消標示為解答 CarbonDiarox 2010年5月20日 下午 05:07
    2010年5月19日 下午 02:11
  • Hi,

    寫錯了

    ToArgb應改為R、G、B三個屬性

    對應的是您所問的"以RGB表示該點顏色要怎寫?"

    ToHtml對應的是您問的"以色碼表示該點顏色要怎寫?"

    取點的顏色要用我貼的第一個連結

    範例上面兩個連結內都有

    您有連過去看嗎?為何連功用都要用猜的?

    這跟才疏學淺沒關吧?!


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年5月19日 下午 02:24
  • Color. ToArgb 方法 給你個中文版

    http://msdn.microsoft.com/zh-tw/library/system.drawing.color.toargb%28VS.90%29.aspx

    蹂躪給的link和這一個, 都有範例程式碼.


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月19日 下午 02:43
    版主
  • HI,回大大

    其定實,上面3個連結

    第一個,半明

    很抱歉,我還沒有找到怎樣可以在[VB 2008]上開一個Visual C# Windows 應用程式,由於不怎看得明,我try在[VB 08]上直接把源碼copy去run,但好像沒反應。

    第2個,我看了3~4次都不明怎用

    因此我只能用猜的Color.ToArgb Method ,由於看成to-argb,不是看成to-a-rgb,所以只能猜它用來做什麼的

    第3個,我可看得明是一個轉換的過程,但須要一個參數,所以我猜參數是上面的連結所留下。

     

    我try努力去看,但好像不怎明白,可以請大大幫忙,寫一個在form外取得色彩的程式碼嗎?

     

    2010年5月19日 下午 03:38
  • Hi!

    參考先前的發問 已答覆關於螢幕取點的取點速度


    歡迎參觀我的Blog.NET菜鳥自救會
    2010年5月19日 下午 03:48
    版主
  • Hi,

    C#轉VB.NET可使用轉換網站

    http://www.developerfusion.com/tools/convert/csharp-to-vb/

    第二個我上篇有提到改用R、G、B三個屬性就可以取到您要的資料

    這部分自己造個Color去點點看就會知道了

    第三個傳入的參數就是Color

    一樣可以先造個Color測試其效果

    網頁上的範例也可以跑跑看

    當第二個與第三個都搞懂了

    您就只差從第一個問題取得Color

     

    另外您提到"我看了3~4次都不明怎用"、"看得明是一個轉換的過程"、"try努力去看",程式不該是用看的,當您看不懂時就該動手了


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年5月19日 下午 04:03
  • 那幾個MSDN的文件中都有Visual Basic的範例吧 ?

    ColorTranslator.ToHtml 方法
    Visual Basic

    Public Sub ToHtml_Example(ByVal e As PaintEventArgs)

        ' Create an instance of a Color structure.
        Dim myColor As Color = Color.Red

        ' Translate myColor to an HTML color.
        Dim htmlColor As String = ColorTranslator.ToHtml(myColor)

        ' Show a message box with the value of htmlColor.
        MessageBox.Show(htmlColor)
    End Sub

    Color. ToArgb 方法

    Visual Basic


    Public Sub ToArgbToStringExample1(ByVal e As PaintEventArgs)
        Dim g As Graphics = e.Graphics

        ' Color structure used for temporary storage.
        Dim someColor As Color = Color.FromArgb(0)

        ' Array to store KnownColor values that match the criteria.
        Dim colorMatches(167) As KnownColor

        ' Number of matches found.
        Dim count As Integer = 0

        ' Iterate through KnownColor enums to find all corresponding colors
        ' that have a non-zero green component and zero-valued red
        ' component and that are not system colors.
        Dim enumValue As KnownColor
        For enumValue = 0 To KnownColor.YellowGreen
            someColor = Color.FromKnownColor(enumValue)
            If someColor.G <> 0 And someColor.R = 0 And _
            Not someColor.IsSystemColor Then
                colorMatches(count) = enumValue
                count += 1
            End If
        Next enumValue
        Dim myBrush1 As New SolidBrush(someColor)
        Dim myFont As New Font("Arial", 9)
        Dim x As Integer = 40
        Dim y As Integer = 40

        ' Iterate through the matches found and display each color that
        ' corresponds with the enum value in the array. Also display the
        ' name of the KnownColor and the ARGB components.
        Dim i As Integer
        For i = 0 To count - 1

            ' Display the color.
            someColor = Color.FromKnownColor(colorMatches(i))
            myBrush1.Color = someColor
            g.FillRectangle(myBrush1, x, y, 50, 30)

            ' Display KnownColor name and four component values. To display
            ' component values:  Use the ToArgb method to get the 32-bit
            ' ARGB value of someColor (created from a KnownColor). Create
            ' a Color structure from the 32-bit ARGB value and set someColor
            ' equal to this new Color structure. Then use the ToString method
            ' to convert it to a string.
            g.DrawString(someColor.ToString(), myFont, Brushes.Black, _
            x + 55, y)
            someColor = Color.FromArgb(someColor.ToArgb())
            g.DrawString(someColor.ToString(), myFont, Brushes.Black, _
            x + 55, y + 15)
            y += 40
        Next i
    End Sub


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月19日 下午 04:08
    版主
  • 那麼,請問各大大

    要如何取得滑鼠某點顏色?我試過用C##轉VB的,我TRY用,但好像沒反應(我不會用?)。

    其實,取某點顏色是不是一定要用API ?有沒有其他更好的方法?

    內部程式有沒有提供取某點顏色?get - point - color ?

     

    2010年5月20日 下午 01:43
  • 感謝上面的大大,由小歐大提供的連結:關於螢幕取點的取點速度

    內裡提到怎樣可以取得picturebox內某點的color,但小弟要在form外取點,卻苦想不到。而這類文章並不多常見,因此希望各大大能提供多一些參考方法或提示。

    我參考過文件庫,裡面好像沒有題到相關的內容,懇求各大大指點一下。

     Create a Bitmap object from an image file.
    
     Dim myBitmap As Bitmap = Me .PictureBox1.Image

     ' Get the color of a pixel within myBitmap.
    Dim pixelColor As Color = myBitmap.GetPixel(e.X, e.Y)
     Dim g As Graphics = Graphics.FromImage(myBitmap)
    2010年5月20日 下午 03:40
  • http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/d7f4b64e-0f15-4a0a-ae44-2b6be487dd7f

    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/2fe1e508-5694-4e61-a5fa-5bbc048b1059

     


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月20日 下午 04:11
    版主
  • 感謝大大提供的資料,但我不是很明日跟顏色有什麼直接關係,可以麻煩大大可以指出我須要用到跟顏色有關的部份嗎?

    這2個連結,對我另一個問題

    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/30c33324-739c-4196-b8ac-7ecd8423bd53

    提供了一個很好的參考,感謝大大再次提供。

    2010年5月20日 下午 05:05
  • 那兩個和滑鼠有關, 因為你不是也要取得Form外的座標嗎 ?

    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月21日 上午 01:40
    版主
  • 感謝大大的題示,我已經能從form外取得座標了。但還沒知道怎樣才能從form外取某一點的顏色,想請問大大能否給個題示?

    這是我程式的核心部份心一,希望各大大能不吝見解,給予小小的題示。解答下面 "?"部份 應該填上什麼才可取得a,感謝各大大。

    dim a as color (假設X,Y是座標的參數)

    a = ? (X, Y)

     

    2010年5月21日 上午 04:13
  • Hi,

    基本上我貼的第一個連結就可以做到了

    感覺您一直想找個一行就出來的寫法(像您提到的是不是一定要用API 、get - point - color、與a = ? (X, Y))

    而不去嚐試理解其運作的概念

     

    直接給你程式算了

    Imports System.Runtime.InteropServices
    
    Public Class Form1
     <DllImport("User32.dll", EntryPoint:="GetDC", _
      CallingConvention:=CallingConvention.StdCall, _
      CharSet:=CharSet.Auto, exactspelling:=True)> _
     Public Shared Function GetDC(ByVal hwnd As IntPtr) As IntPtr
     End Function
     Public Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As IntPtr, ByVal X As Int32, ByVal Y As Int32) As Int32
     <DllImport("user32.dll")> _
    Private Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer
     End Function
     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      Dim hdc As IntPtr
      Dim lngColor As Long
      Dim lngX As Long
      Dim lngY As Long
      Dim p As Point = Cursor.Position
      lngX = p.X
      lngY = p.Y
      hdc = GetDC(IntPtr.Zero)   '取該Handle值的DC 
      lngColor = GetPixel(hdc, lngX, lngY) '取該滑鼠位置的顏色 
      Me.Text = "位置: x:" & lngX & ", y:" & lngY & " ; 顏色:" & lngColor
      Label1.BackColor = ColorTranslator.FromWin32(lngColor)
      ReleaseDC(IntPtr.Zero, hdc)  '將DC 釋放 
     End Sub
    End Class
    

     


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年5月21日 上午 04:55
  • 其實大大感覺到的是事實,的確想用一行就寫出來。

    因為我對VB其實並不怎了解,因為取DLL的部份,是新見識到的,即近幾天見大大發表才見識到的。

    其實VB我只學過1年(中學老師教[VB 6.0]),中學都是教很基礎的東西(物件屬性,簡單的運算、迴圈等等),之後就沒再學過,

    之後的都在[VB 08]上自己慢慢試,因為工具book上沒沾邊,[F1]又沒找到相關的東西,上網找方法才找到這裡(網站)可以問一下。希望大大日後多多題點。

     

    同時感謝大大題供的程式,小弟才疏學淺,想請教一個問題。

    大大從上面取了3個dll,這些dll 要怎取?

    即是:

    什麼情況下取?作用在表單以外的時候要取?

    要取那一個?

    要到那裡取?是像API那樣取?

     

     

    2010年5月21日 上午 08:10
  • 同時感謝大大題供的程式,小弟才疏學淺,想請教一個問題。

    大大從上面取了3個dll,這些dll 要怎取?

    即是:

    什麼情況下取?作用在表單以外的時候要取?

    要取那一個?

    要到那裡取?是像API那樣取?

    那些 DLL 是 Windows API 屬於 Windows 作業系統一部分的動態連結程式庫 (DLL)。, 您可以到 pinvoke.net 去查詢

     

     


    歡迎參觀我的Blog.NET菜鳥自救會
    2010年5月21日 上午 09:17
    版主
  • 我看不懂「取」這字在整篇文章中該怎樣解。

    還有自己沒學好的時候別牽拖到老師身上,我開始用 VB 1.0 的時候哪有老師教阿,從頭到尾只有線上手冊教我,那時候連網站都沒有...

    對於入門的開發者不懂 API 是正常的,特別是 VB / C# ,因為這些學習上跳過了 Windows SDK ,會懂才怪。要從底層了解 Windows API ,這本書是最好的入門書:

    Charles Petzold Windows 程式開發設計指南 華彩軟體 第五版 2000/6/2 CD016 957-8239-73-4 精裝附光碟

    大概看前三章看完,回頭看目錄後,就可以收到書架上了,這本書算是字典級,看懂書的起頭,剩下來的就是需要啥就由目錄去查。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年5月21日 下午 12:45
  • 大大你誤會了,我並沒有怪老師沒教好,那只是課程并沒有安排教而已。

    而上文的"取"字的意思是"拿取"(take)/(get)的意思,大家的國家不一樣,說話方式不一樣而已。

    按大大學習的時間來看,資歷可不少呢......呵呵......以後還要大大多多題醒呢.....謝大大題示。

    看大大寫東西的風格跟個人名稱有點出入呢......

    2010年5月21日 下午 01:03
  • Dim x, y As Long
        Dim color As Color
        Dim hdc As IntPtr
        Dim colorvalue As Long
    
        x = MousePosition.X
        y = MousePosition.Y  'X & Y 就是mouse的座標
    
        hdc = GetDC(IntPtr.Zero)  '取該Handle值的DC 實驗証明:hdc是一個亂數
        Colorvalue = GetPixel(hdc, x, y) '取該滑鼠位置的顏色 
    
        TextBox1.Text = x & " , " & y
        TextBox3.Text = colorvalue
        MaskedTextBox1.BackColor = ColorTranslator.FromWin32(colorvalue) '把值轉成color
    
        ReleaseDC(x, y) '將x,y 釋放 
    
    這是自己胡亂刪減修改的版本。
    2010年9月6日 下午 05:39
  • Hi,

    若仍有不解可參閱

    [VB.NET]使用Win32 API擷取滑鼠游標位置的顏色

    http://www.dotblogs.com.tw/larrynung/archive/2010/05/26/15454.aspx


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年9月8日 上午 04:09