计时器(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),
只用于获取设备描述表的属性信息,不能用于绘图。
- 计时器(4)之获取鼠标所在位置的颜色
- 获得鼠标所在位置的颜色
- js获取鼠标所在位置
- VC获取鼠标所在位置窗口
- JTable中怎样获取鼠标所在位置的行数
- delphi中获取memo鼠标所在位置的行和列
- 动态获取当前屏幕中光标所在位置的颜色
- 动态获取当前屏幕中光标所在位置的颜色
- 动态获取当前屏幕中光标所在位置的颜色
- 动态获取当前屏幕中光标所在位置的颜色
- [转] 动态获取当前屏幕中光标所在位置的颜色
- 取得鼠标所在位置的对象
- 取得鼠标所在位置的对象
- 取得鼠标所在位置的对象
- JS获取鼠标位置、当前元素所在位置
- 获取任务栏所在位置的代码
- elementFromPoint 获得鼠标所在位置处的对象
- opencv显示鼠标所在位置的rgb值
- 注册控件bat
- C#索引器
- 在AIR编写的Android/iOS程序中控制设备方向
- arcgisServer JavascriptAPI下载地址
- 黑马程序员笔记——数据库sql杂碎
- 计时器(4)之获取鼠标所在位置的颜色
- C++的string的用法详解
- 二进制中1的个数
- libxml2.dylb 导致<libxml/tree.h> 老是找不到头文件
- android 手机拍照上传项目的开发-----JAVA利用socket传图片给linux服务器
- 编程之美3.1
- 如何把Java源文件转化为可执行文件
- 我为成为一名IT人做的准备
- spring2.5系列之---------三种实例化Bean的方法