/*
名称:whatcolor 功能:窗口显示当前鼠标当前位置的颜色值 .
功能:显示当前鼠标所指背景的颜色值。
目的:测试GetPixel 函数功能 ,同时说明从CreateDC 函数得到的 hdcScreen 可以用来在屏幕的任何区域显示一些其他东西,
而不仅仅是颜色。。。(值得思考到底还有什么!)
*/
#include <windows.h>
#define ID_TIMER 1
void FindWindowSize (int *, int *);
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("WhatClr") ;
HWND hwnd ;
int cxWindow, cyWindow ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
RegisterClass (&wndclass);
FindWindowSize(&cxWindow,&cyWindow);
hwnd =CreateWindow(szAppName, TEXT ("What Color"),
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_BORDER, //注意WS_BORDER
CW_USEDEFAULT, CW_USEDEFAULT,
cxWindow, cyWindow,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
void FindWindowSize(int *pcxWindow, int * pcyWIndow)
{
HDC hdcScreen;
TEXTMETRIC tm;
hdcScreen = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL); //CreateIC () ??
GetTextMetrics(hdcScreen,&tm);
DeleteDC(hdcScreen);
*pcxWindow = 2 * GetSystemMetrics(SM_CXBORDER) +
12 * tm.tmAveCharWidth;
*pcyWIndow = 2 * GetSystemMetrics(SM_CYBORDER)+
GetSystemMetrics(SM_CYCAPTION)+
12 * tm.tmHeight;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
static HDC hdcScreen;
static PAINTSTRUCT ps;
static POINT pt;
static COLORREF cr;
static TCHAR str1[15] = {0};
RECT rc;
switch(uMsg)
{
case WM_CREATE:
{
hdcScreen = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); //CreateDC() ?? hdcScreen
SetTimer(hwnd,ID_TIMER,1000,NULL); //在整个窗口过程中,hdcScreen 都在起作用,知道程序结束
return 0;
}
case WM_TIMER:
{
GetCursorPos(&pt);
cr = GetPixel(hdcScreen,pt.x,pt.y);
SetPixel(hdcScreen,pt.x,pt.y,0);
InvalidateRect(hwnd,NULL,FALSE);
return 0;
}
case WM_PAINT:
{
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rc) ;
wsprintf (str1, TEXT (" %02X %02X %02X "),
GetRValue (cr), GetGValue (cr), GetBValue (cr)) ; //GetRValue()
TextOut(hdc,0,0,str1,15); //The GetRValue macro retrieves an intensity value
// for the red component of a red, green, blue (RGB) value.
EndPaint (hwnd, &ps) ;
return 0 ;
}
case WM_CLOSE:
{
DeleteDC(hdcScreen);
KillTimer (hwnd, ID_TIMER) ;
PostQuitMessage (0) ;
return 0 ;
}
}
return DefWindowProc (hwnd, uMsg, wParam, lParam) ;
}