Page 1 of 2 12 LastLast
Results 1 to 10 of 20

Thread: getColor()

  1. #1
    Administrator James's Avatar
    Join Date
    May 2010
    Location
    on the intraweb
    Posts
    3,180

    Default getColor()

    I'm trying to work on a few things to sharpen up my programming skills so that one day I'm as leet as all the other devs here :P.

    Anywho, been playing with some win32 api funcs and I made this.

    Basically anything you click on will return the hex value of the color that you clicked on.
    if it's black it returns 0, but all other colors are returned with their 6 value hex number.

    Once you get the color you can do other things with it such as set things to the color by using SetPixel.

    Code:
    // getColor.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <windows.h> 
    #include <iostream>
    
    using namespace std;
    
    COLORREF getColor(void) 
    {
        POINT p;
        COLORREF color;
        HDC hDC;
        BOOL b;
     
        // Get the device context for the screen
        hDC = GetDC(NULL);
        if (hDC == NULL)
        {
            MessageBoxA(0, "Device context can't be found!", "Error", MB_OK | MB_ICONERROR);
            return 0;
        }
     
        // Get the current cursor position
        b = GetCursorPos(&p);
        if (!b)
        {
            MessageBoxA(0, "Can't get the cursor position!", "Error", MB_OK | MB_ICONERROR);
            return 0;
        }
     
        // Retrieve the color at that position
        color = GetPixel(hDC, p.x, p.y);
     
        // Release the device context again
        ReleaseDC(GetDesktopWindow(), hDC);
     
        return color;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        COLORREF myColor;
        char szBuffer[512];
    
        while(1)
        {
            if( GetAsyncKeyState( VK_LBUTTON ) & 1 )
            {
                myColor = getColor();
                sprintf_s( szBuffer, sizeof( szBuffer ), "My Color is: #%X", myColor );
                MessageBoxA(0, szBuffer, "Results", MB_OK);
            }
        }
        return 0;
    }

  2. #2
    Banned
    Join Date
    May 2010
    Location
    fuck off?
    Posts
    1,145

    Default

    quicker than using photoshop

  3. #3

    Default

    next step:
    make an application that displays the current color the mouse is over as # number,
    aswell as showing a box filled with that color

  4. #4
    Über Prodigy & Developer Razo[R]apiD's Avatar
    Join Date
    May 2010
    Location
    Poland, Lublin
    Posts
    3,257

    Default

    or paint ;p yep xD

    This won't work on Vista & Win7 with fullscreen games.

    Since Vista and Win7, Microsoft made GUI to be rendered with DirectX, so it goes thorugh graphic card's memory/buffer so GetDC(0) won't work anymore. You would need to use directX wrapper for this.

    You can read about this:

    http://en.wikipedia.org/wiki/Desktop_Window_Manager

  5. #5
    Administrator James's Avatar
    Join Date
    May 2010
    Location
    on the intraweb
    Posts
    3,180

    Default

    hummingbird, you're requesting hex converted to RGB correct?

  6. #6

    Default

    Quote Originally Posted by James View Post
    hummingbird, you're requesting hex converted to RGB correct?
    not really, just an application that shows (graphically and textually) the color the mouse is currently over.
    it's not very hard to make, but good to get the basics of window creation and drawing.

  7. #7
    Administrator James's Avatar
    Join Date
    May 2010
    Location
    on the intraweb
    Posts
    3,180

    Default

    I'll see what I can do. Since this is all new to me I want to make the best effort I can in getting it done without pulling out my hair :P.

  8. #8
    Administrator James's Avatar
    Join Date
    May 2010
    Location
    on the intraweb
    Posts
    3,180

    Default

    Here is an update with the RGB values

    Code:
    // getColor.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <windows.h> 
    #include <iostream>
    
    COLORREF getColor(void) 
    {
        POINT p;
        COLORREF color;
        HDC hDC;
        BOOL b;
        HDC CDC = GetDC(GetDesktopWindow());
     
        // Get the device context for the screen
        hDC = GetDC(NULL);
        if (hDC == NULL)
        {
            MessageBoxA(0, "Device context can't be found!", "Error", MB_OK | MB_ICONERROR);
            return 0;
        }
     
        // Get the current cursor position
        b = GetCursorPos(&p);
        if (!b)
        {
            MessageBoxA(0, "Can't get the cursor position!", "Error", MB_OK | MB_ICONERROR);
            return 0;
        }
     
        // Retrieve the color at that position
        color = GetPixel(hDC, p.x, p.y);
    
        SetPixel(CDC, p.x, p.y, color);
     
        // Release the device context again
        ReleaseDC(GetDesktopWindow(), hDC);
     
        return color;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        COLORREF myColor;
        int r,g,b;
        char szBuffer[512];
    
        while(1)
        {
            if( GetAsyncKeyState( VK_LBUTTON ) & 1 )
            {
                myColor = getColor();        
            
                //Convert the hex value to rgb values
                r = ( myColor >> 16 ) & 0xFF;
                g = ( myColor >> 8 ) & 0xFF;
                b = myColor & 0xFF;
    
                sprintf_s( szBuffer, sizeof( szBuffer ), "My Color is: \nHex: #%X \nDecimal(RGB): %i %i %i", myColor, r, g, b);
                MessageBoxA(0, szBuffer, "Results", MB_OK);
            }
        }
        return 0;
    }

  9. #9
    Administrator James's Avatar
    Join Date
    May 2010
    Location
    on the intraweb
    Posts
    3,180

    Default

    Hmm, I'm pretty sure I'm close here, but the damn window isn't coloring haha. Stupid context device. Tried GetDC(NULL), hWnd, GetDesktopWindow(), still nothing.

    The message box pops up properly with the correct values though. Here is what I currently have.

    Code:
    // getColorWin32.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    #include "getColorWin32.h"
    #include <windows.h> 
    #include <iostream>
    
    #define MAX_LOADSTRING 100
    
    // Global Variables:
    HINSTANCE hInst;                                // current instance
    TCHAR szTitle[MAX_LOADSTRING];                    // The title bar text
    TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
    
    // Forward declarations of functions included in this code module:
    ATOM                MyRegisterClass(HINSTANCE hInstance);
    BOOL                InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    
    void CenterWindow(HWND hwnd) 
    {
        RECT rc;
    
        GetWindowRect(hwnd,&rc);
    
        int nWidth = rc.right - rc.left;
        int nHeight = rc.bottom - rc.top;
    
        int X = ((int) GetSystemMetrics(SM_CXFULLSCREEN) - nWidth) /2;       // center window horizontally
        int Y = ((int) GetSystemMetrics(SM_CYFULLSCREEN) - nHeight) /2;      // and vertically
    
        MoveWindow(hwnd,X,Y,nWidth,nHeight,TRUE);
    }
    
    COLORREF getColor(void) 
    {
        POINT p;
        COLORREF color;
        HDC hDC = GetDC(NULL);
        BOOL b;
     
        // Get the device context for the screen
        if (hDC == NULL)
        {
            MessageBoxA(0, "Device context can't be found!", "Error", MB_OK | MB_ICONERROR);
            return 0;
        }
     
        // Get the current cursor position
        b = GetCursorPos(&p);
        if (!b)
        {
            MessageBoxA(0, "Can't get the cursor position!", "Error", MB_OK | MB_ICONERROR);
            return 0;
        }
     
        // Retrieve the color at that position
        color = GetPixel(hDC, p.x, p.y);
     
        // Release the device context again
        ReleaseDC(GetDesktopWindow(), hDC);
     
        return color;
    }
    
    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
    
         // TODO: Place code here.
        MSG msg;
        HACCEL hAccelTable;
    
        // Initialize global strings
        LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadString(hInstance, IDC_GETCOLORWIN32, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);
    
        // Perform application initialization:
        if (!InitInstance (hInstance, nCmdShow))
        {
            return FALSE;
        }
    
        hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GETCOLORWIN32));
    
        // Main message loop:
        while (GetMessage(&msg, NULL, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        return (int) msg.wParam;
    }
    
    //
    //  FUNCTION: MyRegisterClass()
    //
    //  PURPOSE: Registers the window class.
    //
    //  COMMENTS:
    //
    //    This function and its usage are only necessary if you want this code
    //    to be compatible with Win32 systems prior to the 'RegisterClassEx'
    //    function that was added to Windows 95. It is important to call this function
    //    so that the application will get 'well formed' small icons associated
    //    with it.
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
        WNDCLASSEX wcex;
    
        wcex.cbSize = sizeof(WNDCLASSEX);
    
        wcex.style            = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra        = 0;
        wcex.cbWndExtra        = 0;
        wcex.hInstance        = hInstance;
        wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_GETCOLORWIN32));
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName    = NULL;
        wcex.lpszClassName    = szWindowClass;
        wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
        return RegisterClassEx(&wcex);
    }
    
    //
    //   FUNCTION: InitInstance(HINSTANCE, int)
    //
    //   PURPOSE: Saves instance handle and creates main window
    //
    //   COMMENTS:
    //
    //        In this function, we save the instance handle in a global variable and
    //        create and display the main program window.
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       hInst = hInstance; // Store instance handle in our global variable
    
      // HWND hWnd = CreateWindow(szWindowClass, "Testing", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 200, 200, NULL, NULL, hInstance, NULL);
        HWND hWnd = CreateWindowEx(0,szWindowClass,"Testing", WS_VISIBLE|WS_OVERLAPPEDWINDOW, 0,0,200,200,NULL,NULL,hInstance,NULL);
    
       if (!hWnd)
       {
          return FALSE;
       }
    
       CenterWindow(hWnd);
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
    
       return TRUE;
    }
    
    //
    //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    //  PURPOSE:  Processes messages for the main window.
    //
    //  WM_COMMAND    - process the application menu
    //  WM_PAINT    - Paint the main window
    //  WM_DESTROY    - post a quit message and return
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        int wmId, wmEvent;
        PAINTSTRUCT ps;
        HDC hdc;
    
        switch (message)
        {
        case WM_COMMAND:
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
            break;
        case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
            POINT p;
            BOOL b1 = GetCursorPos(&p);
             COLORREF myColor;
            int r,g,b;
            char szBuffer[512];
    
            // Get the device context for the screen
            if (hdc == NULL)
            {
                MessageBoxA(0, "Device context can't be found!", "Error", MB_OK | MB_ICONERROR);
                return 0;
            }
    
            while(1)
            {
                if( GetAsyncKeyState( VK_LBUTTON ) & 1 )
                {
                    myColor = getColor();        
                
                    //Convert the hex value to rgb values
                    r = ( myColor >> 16 ) & 0xFF;
                    g = ( myColor >> 8 ) & 0xFF;
                    b = myColor & 0xFF;
    
                    SetPixel(hdc, p.x, p.y, myColor);
    
                    sprintf_s( szBuffer, sizeof( szBuffer ), "My Color is: \nHex: #%X \nDecimal(RGB): %i %i %i", myColor, r, g, b);
                    MessageBoxA(0, szBuffer, "Results", MB_OK);
    
                    ReleaseDC(hWnd, hdc);
                }
            }
            EndPaint(hWnd, &ps);
        }
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }

  10. #10

    Default

    don't do a while(1) in WM_PAINT


    this is what i came up (don't mind the sloppy coding)
    PHP Code:
    #define WINVER 0x0501
    #define _WIN32_WINNT 0x0501
    #define _WIN32_WINDOWS 0x0410
    #define _WIN32_IE 0x0600
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>

    BOOL                InitInstance(HINSTANCEint);
    LRESULT CALLBACK    WndProc(HWNDUINTWPARAMLPARAM);
    INT_PTR CALLBACK    About(HWNDUINTWPARAMLPARAM);

    int APIENTRY WinMainHINSTANCE hInstanceHINSTANCE hPrevInstanceLPSTR lpCmdLineint nCmdShow )
    {
        
    char szWindowClass[] = "test_WindowClass";

        
    WNDCLASSEX wcex = {0};
        
    wcex.cbSize sizeof(WNDCLASSEX);
        
    wcex.style            CS_HREDRAW CS_VREDRAW;
        
    wcex.lpfnWndProc    WndProc;
        
    wcex.hInstance        hInstance;
        
    wcex.hCursor        LoadCursorNULLIDC_ARROW );
        
    wcex.lpszClassName    szWindowClass;
        
    RegisterClassEx( &wcex );

        
    HWND hWnd CreateWindowEx0szWindowClass"Color"WS_OVERLAPPED WS_CAPTION WS_SYSMENUCW_USEDEFAULT0,
            
    CW_USEDEFAULT0NULLNULLhInstanceNULL );
        if (!
    hWnd) return FALSE;
        
    UpdateWindow(hWnd);

        
    MSG msg;

        while( 
    GetMessage(&msgNULL00) )
        {
            
    TranslateMessage( &msg );
            
    DispatchMessage( &msg );
        }
        return (int) 
    msg.wParam;
    }

    charFormatColorDWORD color )
    {
        static 
    char buf[100];
        
    wsprintfbuf" #%.6X R:%.3i G:%.3i B:%.3i "colorGetRValue(color), GetGValue(color), GetBValue(color) );
        return 
    buf;
    }


    HFONT hFont;

    LRESULT CALLBACK WndProc(HWND hWndUINT messageWPARAM wParamLPARAM lParam)
    {
        
    PAINTSTRUCT ps;
        
    HDC hdchDesk;
        
    RECT rc = {0};
        
    charmsg;
        
    HBRUSH hBr;
        
    HGDIOBJ hOld;
        
    DWORD color;
        switch (
    message)
        {
        case 
    WM_CREATE:
            
    hFont CreateFont( -10000000000000"Courier" );
            
    hdc GetDChWnd );
            
    SelectObjecthdchFont );
            
    msg FormatColor(0);
            
    GetTextExtentPoint32hdcmsgstrlen(msg), (LPSIZE)&rc.right );
            
    AdjustWindowRectEx( &rcWS_OVERLAPPED WS_CAPTION WS_SYSMENUFALSENULL );
            
    SetWindowPoshWndNULL00rc.right rc.leftrc.bottom rc.topSWP_NOMOVE|SWP_NOREPOSITION|SWP_NOZORDER|SWP_SHOWWINDOW );
            
    SetTimerhWnd0x123100NULL );
            break;
        case 
    WM_PAINT:
            
    GetCursorPos( (LPPOINT)&rc );        //abuse RECT for getting the cursor pos
            
    hDesk GetDCNULL );
            
    color GetPixelhDeskrc.leftrc.top );
            
    ReleaseDCNULLhDesk );
            
    hdc BeginPaint(hWnd, &ps);
            
    GetClientRecthWnd, &rc );
            
    hBr CreateSolidBrushcolor );
            
    hOld SelectObjecthdchBr );
            
    Rectanglehdc00rc.rightrc.bottom );
            
    SelectObjecthdchOld );
            
    DeleteObjecthBr );
            
    msg FormatColorcolor );
            
    SetBkModehdcTRANSPARENT );
            
    color RGB255-GetRValue(color), 255-GetGValue(color), 255-GetBValue(color) );    //invert the color for text
            
    SetTextColorhdccolor );
            
    hOld SelectObjecthdchFont );
            
    TextOutAhdc00msgstrlen(msg) );
            
    SelectObjecthdchOld );
            
    EndPaint(hWnd, &ps);
            break;
        case 
    WM_TIMER:                    //we don't care for other timers, we only setup 1 :)
            
    GetClientRecthWnd, &rc );
            
    InvalidateRecthWnd, &rcTRUE );        //force the window to redraw
            
    break;
        case 
    WM_DESTROY:
            
    DeleteObjecthFont );
            
    PostQuitMessage(0);
            break;
        default:
            return 
    DefWindowProc(hWndmessagewParamlParam);
        }
        return 
    0;

    Last edited by hummingbird; January 13th, 2011 at 12:58 AM.

Posting Permissions

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