Ce source récupère la couleur du pixel qui se trouve sous la souris.
La couleur est affiché en décimal R, G, B et en hexa.
Le fond de la form prend la même couleur que celle du pixel.
Pour ceux qui voudraient juste utiliser ce programme sans avoir besoin de compiler, il suffit de renommer le fichier du zip .exec en .exe.
Source / Exemple :
#include "windows.h"
HINSTANCE _hThisInstance; // Handle du module
HWND _hWnd; // Handle de la fenêtre
HWND _hTextBox; // Handle de la textbox
LPSTR _lpAppName = "GetPixelColor"; // Nom de l'appli
//
// Affiche le message d'erreur associé à la dernière
// erreur Win32.
//
void ShowLastError()
{
DWORD nLastError;
LPSTR lpMessageBuffer;
// Récupération du numéro de l'erreur
nLastError = GetLastError();
// Formatage du message
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL);
// Affichage du message et fin de l'appli
MessageBox(NULL, lpMessageBuffer, "ERROR", MB_OK | MB_ICONERROR);
LocalFree(lpMessageBuffer);
}
//
// Traitement des messages.
//
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
static HBRUSH hBackBrush; // Brush de dessin de l'arrière plan de la fenêtre
static POINT cursor; // Position de la souris
static COLORREF nColor; // Couleur du pixel sous la souris
static RECT back; // Rectangle de la zone cliente/fenêtre
static char lpText[50]; // Affichage de la couleur en hexa et rgb
static INT32 nHexa; // La couleur swapée pour afficher un hexa comme on l'attend
static HDC hScreenDC; // HDC de l'écran
switch (nMessage)
{
case WM_TIMER:
// On met à jour seulement si on est hors de notre fenêtre
GetCursorPos(&cursor);
GetWindowRect(_hWnd, &back);
// Pas besoin de ReleasDC pour ce GetDC : CS_OWNDC dans le style de la classe
if (! PtInRect(&back, cursor)) SendMessage(_hWnd, WM_ERASEBKGND, (WPARAM)GetDC(_hWnd), 0);
break;
case WM_ERASEBKGND:
// Récupération des coordonnées de la souris
GetCursorPos(&cursor);
// Récupération de la couleure du pixel sous la souris
hScreenDC = GetDC(0);
nColor = GetPixel(hScreenDC, cursor.x, cursor.y);
nHexa = ReleaseDC(0, hScreenDC);
// Création du brush de dessin de l'arrière plan de la form
hBackBrush = CreateSolidBrush(nColor);
// Dessin de la fenêtre
GetClientRect(_hWnd, &back);
FillRect((HDC)wParam, &back, hBackBrush);
DeleteObject(hBackBrush);
// On remet les octets dans le "bon" sens
nHexa = ((nColor & 0xFF) << 16) | (nColor & 0xFF00) | ((nColor & 0xFF0000) >> 16);
// Affichage de la couleur en hexa
// Le dièze, c'est juste qu'en HTML on en met un.
// %X, ça convertit l'entier en hexa (En majuscule)
// %6X, ça complète la conversion avec des espaces pour que la chaîne fasse 6 caractères
// %06X, ça demande des 0 à la place des espaces pour arriver à 6 caractères
wsprintf(lpText, "#%06X (R = %d, G = %d, B = %d)", nHexa, nColor & 0xFF, (nColor & 0xFF00) >> 8, (nColor & 0xFF0000) >> 16);
SetWindowText(_hTextBox, lpText);
RedrawWindow(_hTextBox, NULL, NULL, RDW_INVALIDATE);
return 1;
case WM_DESTROY:
// On signale que le thread va s'arrêter
PostQuitMessage(0);
break;
default:
// Application du traitement par défaut
return DefWindowProc(hWnd, nMessage, wParam, lParam);
}
return 0;
}
//
// Initialise la fenêtre principale de l'appli.
//
void InitWindow()
{
WNDCLASSEX wincl; // Classe de la fenêtre utilisée
// Création de la classe de fenêtre
wincl.cbSize = sizeof(WNDCLASSEX);
wincl.style = CS_OWNDC;
wincl.lpfnWndProc = WindowProcedure;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hInstance = _hThisInstance;
wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.hbrBackground = NULL;
wincl.lpszMenuName = 0;
wincl.lpszClassName = _lpAppName;
wincl.hIconSm = NULL;
// Enregistrement de la classe
if (!RegisterClassEx(&wincl)) ShowLastError();
// Création de la fenêtre
_hWnd = CreateWindowEx(0, _lpAppName, _lpAppName, WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 300, 100, HWND_DESKTOP, NULL, _hThisInstance, NULL);
_hTextBox = CreateWindowEx(0, "EDIT", "color", ES_READONLY | WS_VISIBLE | WS_CHILD | WS_BORDER, 0, 0, 294, 20, _hWnd, NULL, _hThisInstance, NULL);
}
#pragma comment(linker, "/entry:main")
INT32 _cdecl main()
{
MSG messages; // Réception des messages envoyés à l'application
// Récupération du handle du module
_hThisInstance = GetModuleHandle(NULL);
InitWindow();
if (!SetTimer(_hWnd, 1, 100, NULL)) ShowLastError();
// Boucle de traitement des messages
while (GetMessage(&messages, NULL, 0, 0))
{
// Traduit certains messages
TranslateMessage(&messages);
// Distribution des messages aux fenêtres
DispatchMessage(&messages);
}
KillTimer(_hWnd, 1);
// Code d'erreur en sortie
return messages.wParam;
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.