csdn上有个屏幕取色精灵(vc++源码),写的挺棒.
http://hapland.icode.csdn.net/source/1287011
在codeproject上也看到一个屏幕颜色拾取的工程, 用户体验没他写的好.
核心的函数都是一样的
The GetPixel function retrieves the red, green, blue (RGB) color value of the pixel at the specified coordinates. COLORREF GetPixel( HDC hdc, // handle to device context int XPos, // x-coordinate of pixel int nYPos // y-coordinate of pixel );
又看见一个带拾取器的工程, 拾取器类似于spy++, 很实用.
鼠标左键抬起, 就不取颜色了.
http://www.codeproject.com/KB/miscctrl/ColorFindercp1.aspx
ColorFinder - Retrieve the color of any pixel on the Desktop
把这两个工程整合一下,用户体验会更好. 有点手痒痒.
<2011_0228>
工程整合完成, 用起来很舒服~
修正了原来<<屏幕取色精灵>>中颜色捕捉放大区的显示计算错误(原作者用的是固定偏移, 把picture control 移动了位置就不准确了).
现在放大10倍,普通望远镜也不过如此了, 放大显示的位置很精确.
修正后的放大镜代码如下:
void CMainiDlg::SnapScreenColor() { CString str; GetCursorPos(&m_ptCursor); str.Format("CPoint pt = CPoint(%d,%d);", m_ptCursor.x, m_ptCursor.y); m_ctrEditSnapPositionCur.SetWindowText(str); ::StretchBlt(m_hdcShowSnapArea, m_rcSnapDispArea.left, m_rcSnapDispArea.top, m_rcSnapDispArea.right, m_rcSnapDispArea.bottom, m_DesktopDC, (m_ptCursor.x - m_rcSnapDispArea.Width() / (m_nZoorNum * 2)), (m_ptCursor.y - m_rcSnapDispArea.Height() / (m_nZoorNum * 2)), m_rcSnapDispArea.Width() / m_nZoorNum, m_rcSnapDispArea.Height() / m_nZoorNum, SRCCOPY); /** * 在捕捉显示区的中间画十字标尺 */ ::MoveToEx(m_hdcShowSnapArea, m_rcSnapDispArea.left, m_rcSnapDispArea.Height() / 2, NULL); ::LineTo(m_hdcShowSnapArea, m_rcSnapDispArea.right, m_rcSnapDispArea.Height() / 2); ::MoveToEx(m_hdcShowSnapArea, m_rcSnapDispArea.Width() / 2, m_rcSnapDispArea.top, NULL); ::LineTo(m_hdcShowSnapArea, m_rcSnapDispArea.Width() / 2, m_rcSnapDispArea.bottom); CDC * pDesktopDC = CDC::FromHandle(::GetDCEx(NULL, NULL, 0)); m_clrCurrent = pDesktopDC->GetPixel(m_ptCursor); str.Format("%6.6x", m_clrCurrent); str.MakeUpper(); str = "0x" + str; m_ctrEditColorRefCur.SetWindowText(str); BYTE rVal = GetRValue(m_clrCurrent); BYTE gVal = GetGValue(m_clrCurrent); BYTE bVal = GetBValue(m_clrCurrent); str.Format("RGB(%d, %d, %d)", rVal, gVal, bVal); m_ctrEditRgbCur.SetWindowText(str); CDC * pSDC = m_ctrRgbCur.GetDC(); CRect sRect; m_ctrRgbCur.GetClientRect(&sRect); pSDC->FillSolidRect(&sRect, m_clrCurrent); ReleaseDC(pDesktopDC); ReleaseDC(pSDC); }
工程下载点: http://download.csdn.net/source/3047658
放大镜功能和屏幕捕捉,保存图像结合起来,引伸出来的应用很多。
现在能想到的:
* 用放大镜捕捉屏幕上的图标到文件