Results 1 to 1 of 1

Thread: PictureBox Replace Color

Threaded View

  1. #1

    Thread Starter
    PowerPoster
    Join Date
    Jun 2012
    Posts
    2,730

    Lightbulb PictureBox Replace Color

    Hello,

    herewith I want to share a function that just replace a color in a PictureBox.
    I have found way more complicated ways to do that. I think this way is pretty short and not complicated.

    Code:
    ' SAMPLE IN A FORM
    Option Explicit
    
    Private Sub Form_Load()
    Call PictureBoxReplaceColor(Picture1, RGB(255, 255, 255), vbMenuBar)
    ' This replaces for example a white color to the windows system menu color
    ' Usefull if you want to put a picture to a popupmenu (-> SetMenuItemBitmaps)
    End Sub
    
    ' FUNCTION; PUT IN MODULE
    Option Explicit
    Private Declare Function OleTranslateColor Lib "oleaut32" (ByVal Color As Long, ByVal hPal As Long, ByRef RGBResult As Long) As Long
    Private Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
    Private Declare Function SetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
    
    Public Sub PictureBoxReplaceColor(ByVal PictureBox As VB.PictureBox, ByVal FromColor As Long, ByVal ToColor As Long)
    If PictureBox.Picture Is Nothing Then Err.Raise Number:=1, Description:="Picture not set"
    If PictureBox.Picture.Handle = 0 Then Err.Raise Number:=2, Description:="Picture handle is null"
    Dim WinFromColor As Long, WinToColor As Long, MemAutoRedraw As Boolean
    WinFromColor = WinColor(FromColor)
    WinToColor = WinColor(ToColor)
    With PictureBox
    MemAutoRedraw = .AutoRedraw
    .AutoRedraw = True
    Dim X As Long, Y As Long
    For X = 0 To CInt(.ScaleX(.Picture.Width, vbHimetric, vbPixels))
        For Y = 0 To CInt(.ScaleY(.Picture.Height, vbHimetric, vbPixels))
            If GetPixel(.hDC, X, Y) = WinFromColor Then SetPixel .hDC, X, Y, WinToColor
        Next Y
    Next X
    .Refresh
    .Picture = .Image
    .AutoRedraw = MemAutoRedraw
    End With
    End Sub
    
    Public Function WinColor(ByVal Color As Long, Optional ByVal hPal As Long) As Long
    If OleTranslateColor(Color, hPal, WinColor) <> 0 Then WinColor = -1
    End Function
    Last edited by Krool; Jan 22nd, 2017 at 01:29 PM.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width