更新时间:2016-01-14 15:25:56浏览次数:1+次
我们自己来实现一个拾色器,通过本文的详细讲解,你也可以轻松制作一个自己的拾色器哦。下面是拾色器程序的截图:
//hScreen = CreateDC(_T("DISPLAY"),0,0,0);//方法1
hScreen = GetDC(NULL);//方法2
两种方法得到的效果都是一样的。所谓屏幕DC,其实就是当前显示的画面的视频显示卡上的一个位图副本。我们取色就是在这个位图副本对应的坐标取得相应的像素点的值,像素点的值由颜色值构成。我们这里获取的是24位的真彩色,不讨论索引颜色。#include "windows.h"
#include <tchar.h>
TCHAR tip[100]=_T("");
TCHAR txt[100]=_T("C++技术网提示:按住鼠标左键拖动光标到窗口外可以拾取屏幕任何位置的颜色。");
TCHAR clrhex[20]=_T("");
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HDC hScreen;
RECT rect;
static COLORREF clr;
HBRUSH hBrush;
switch (message)
{
case WM_CREATE:
{
//使用下面两种的一种都可以获得屏幕的DC,在窗口销毁要做对应的删除或者释放
//hScreen = CreateDC(_T("DISPLAY"),0,0,0);//方法1
hScreen = GetDC(NULL);//方法2
}
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
//重绘窗口显示提示文字
GetClientRect(hwnd,&rect);//获取客户区矩形
hBrush = CreateSolidBrush(clr);//创建画刷
FillRect(hdc,&rect,hBrush);//使用画刷填充客户区,即显示拾取的颜色
SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));//使用等宽字体
SetBkMode(hdc,TRANSPARENT);//设置文字背景透明
SetTextColor(hdc,RGB(255-GetRValue(clr),255-GetGValue(clr),255-GetBValue(clr)));//设置文字颜色
DrawText(hdc,txt,-1,&rect,DT_WORDBREAK);//显示操作方法
TextOut(hdc,0,50,tip,lstrlen(tip));//输出颜色提示
EndPaint(hwnd,&ps);
return 0;
case WM_LBUTTONDOWN:
SetCapture(hwnd);//捕获鼠标
SetCursor(LoadCursor(NULL,IDC_CROSS));//显示十字架光标
return 0;
case WM_LBUTTONUP:
ReleaseCapture();//释放鼠标
SetCursor(LoadCursor(NULL,IDC_ARROW));//显示箭头光标
return 0;
case WM_MOUSEMOVE:
{
hdc = GetDC(hwnd);
POINT ptScreen;
//提取鼠标坐标,基于客户区坐标
ptScreen.x = (short)LOWORD(lParam);
ptScreen.y = (short)HIWORD(lParam);
ClientToScreen(hwnd,&ptScreen);//转换为屏幕坐标
clr = GetPixel(hScreen,ptScreen.x,ptScreen.y);//获取屏幕中指定坐标的颜色值
wsprintf(clrhex,_T("%X%X%X"),GetRValue(clr),GetGValue(clr),GetBValue(clr));//格式化颜色值到字符数组
//格式化显示的颜色提示
wsprintf(tip,_T("颜色(%d,%d,%d),十六进制:#%s"),GetRValue(clr),GetGValue(clr),GetBValue(clr),clrhex);
GetClientRect(hwnd,&rect);//获取客户区矩形
hBrush = CreateSolidBrush(clr);//创建画刷
FillRect(hdc,&rect,hBrush);//使用画刷填充客户区,即显示拾取的颜色
SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));//使用等宽字体
SetBkMode(hdc,TRANSPARENT);//设置文字背景透明
SetTextColor(hdc,RGB(255-GetRValue(clr),255-GetGValue(clr),255-GetBValue(clr)));//设置文字颜色
DrawText(hdc,txt,-1,&rect,DT_WORDBREAK);//显示操作方法
TextOut(hdc,0,50,tip,lstrlen(tip));//输出颜色提示
DeleteObject(SelectObject(hdc,GetStockObject(WHITE_BRUSH)));//删除画刷
ReleaseDC(hwnd,hdc);
}
return 0;
case WM_DESTROY:
//好习惯,用完删除或者释放
//DeleteDC(hScreen);
ReleaseDC(hwnd,hScreen);
PostQuitMessage(0);
return 0;
default:
break;//跳出到默认处理
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
TCHAR ClassName[] = _T("MyClass");
TCHAR title1[] = _T("C++技术网http://www.cjjjs.com:拾色器");
WNDCLASS wndClass;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WinProc;
wndClass.lpszClassName = ClassName;
wndClass.lpszMenuName=NULL;
wndClass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
if(!RegisterClass(&wndClass))return 0;
HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,10,100,550,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
相关资讯