计时器(4)之获取鼠标所在位置的颜色

来源:互联网 发布:linux 显存 编辑:程序博客网 时间:2024/05/22 12:47

这个程序可以不用计时器来完成,可以使用(鼠标移动的时候,不断的触发WM_PAINT事件,获取鼠标鼠标位置,然后分别获取R,G,B的值即可)

下面看看这个用计时器完成的程序,里面有用到了一些函数。

static COLORREF cr;POINT pt;GetCursorPos(&pt);cr=GetPixel(hdc,pt.x,pt.y);//然后就可以获得RBG的各项值了GetRValue(cr);GetGValue(cr);GetBValue(cr);


看完整的代码:

#include <windows.h> #define ID_TIMER    1void 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 ;          if (!RegisterClass (&wndclass))     {          MessageBox (NULL, TEXT ("This program requires Windows NT!"),                      szAppName, MB_ICONERROR) ;          return 0 ;     }          FindWindowSize (&cxWindow, &cyWindow) ;          hwnd = CreateWindow (szAppName, TEXT ("What Color"),                          WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | 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) ;     GetTextMetrics (hdcScreen, &tm) ;     DeleteDC (hdcScreen) ;          * pcxWindow = 2 * GetSystemMetrics (SM_CXBORDER)  +                         12 * tm.tmAveCharWidth ;     * pcyWindow = 2 * GetSystemMetrics (SM_CYBORDER)  +                       GetSystemMetrics (SM_CYCAPTION) +                          2 * tm.tmHeight ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){     static COLORREF cr, crLast ;     static HDC      hdcScreen ;     HDC             hdc ;     PAINTSTRUCT     ps ;     POINT           pt ;     RECT            rc ;     TCHAR           szBuffer [16] ;          switch (message)     {     case WM_CREATE:          hdcScreen = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;          SetTimer (hwnd, ID_TIMER, 100, NULL) ;          return 0 ;     case WM_DISPLAYCHANGE:          DeleteDC (hdcScreen) ;          hdcScreen = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;          return 0 ;     case WM_TIMER:          GetCursorPos (&pt) ;          cr = GetPixel (hdcScreen, pt.x, pt.y) ;                    if (cr != crLast)          {               crLast = cr ;               InvalidateRect (hwnd, NULL,FALSE) ;          }          return 0 ;               case WM_PAINT:          hdc = BeginPaint (hwnd, &ps) ;                    GetClientRect (hwnd, &rc) ;                    wsprintf (szBuffer, TEXT ("  %d %02X %02X  "),                    GetRValue (cr), GetGValue (cr), GetBValue (cr)) ;                    DrawText (hdc, szBuffer, -1, &rc,                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;                    EndPaint (hwnd, &ps) ;          return 0 ;               case WM_DESTROY:          DeleteDC (hdcScreen) ;          KillTimer (hwnd, ID_TIMER) ;          PostQuitMessage (0) ;          return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}


效果图如下:

GetDC和CreateDC有什么区别?  

GetDC和releaseDC配对。

CreateDC和DeleteDC配对。

GetDC是获取别人的。不能修改别人的参数。

GreateDC是自己创建的。可以任意修改的。

 

CreateDC和CreateIC区别

CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL),

获取整个屏幕的设备描述表。等同与:GetDC(NULL);

CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL),

只用于获取设备描述表的属性信息,不能用于绘图。