自己写的一款取色工具,源码如下:
1 // ----------------------------------------------------- 2 // 函数名 : CCatchColorDlg::OnBnClickedButtonCatchcolor 3 // 函数功能: 取色事件 4 // 输入参数: 5 // 输出参数: 6 // 返回值 : 7 // ----------------------------------------------------- 8 void CCatchColorDlg::OnBnClickedButtonCatchcolor() 9 { 10 // 鼠标状态为左键按下 11 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); 12 13 // 设置鼠标的形状 14 m_hPoint = AfxGetApp()->LoadCursor(IDC_CURSOR1); 15 ::SetCursor(m_hPoint); 16 InitAll(FALSE); 17 18 } 19 20 void CCatchColorDlg::OnEnChangeEditRgb() 21 { 22 UpdateData(); 23 24 // 如果是系统取色 25 if (CatchColorMode_System == m_iCurrentMode) 26 { 27 if (m_strRgb.IsEmpty()) 28 { 29 m_strHex.Empty(); 30 } 31 else 32 { 33 int nIndex = m_strRgb.Find(","); 34 int nIndexTmp = 0; 35 CString strRed; 36 CString strGreen; 37 CString strBlue; 38 strRed.Empty(); 39 strGreen.Empty(); 40 strRed.Empty(); 41 while (-1 != nIndex && 0 != nIndex) 42 { 43 if(strRed.IsEmpty()) 44 { 45 strRed = m_strRgb.Left(nIndex); 46 } 47 else if (strGreen.IsEmpty()) 48 { 49 strGreen = m_strRgb.Mid(nIndexTmp + 1, nIndex - nIndexTmp - 1); 50 strBlue = m_strRgb.Right(m_strRgb.GetLength() - nIndex - 1); 51 } 52 else 53 { 54 m_strHex.Empty(); 55 break; 56 } 57 nIndexTmp = nIndex; 58 nIndex = m_strRgb.Find(_T(","), (nIndex + 1)); 59 } 60 61 // RGB编辑框是否不为空 62 BOOL bRgbNotEmpty = (!strRed.IsEmpty()) 63 && (!strBlue.IsEmpty()) 64 && (!strGreen.IsEmpty()); 65 if (bRgbNotEmpty) 66 { 67 // 是否是不合法的RGB值 68 BOOL bNotValidRGB = (!CheckRGB(atoi(strRed))) 69 || (!CheckRGB(atoi(strGreen))) 70 || (!CheckRGB(atoi(strBlue))); 71 if (bNotValidRGB) 72 { 73 m_strHex.Empty(); 74 } 75 else 76 { 77 m_strHex.Format(_T("#%02X%02X%02X"), atoi(strRed), atoi(strGreen), atoi(strBlue)); 78 m_Color = RGB(atoi(strRed), atoi(strGreen), atoi(strBlue)); 79 } 80 } 81 GetDlgItem(IDC_STATIC_COLOR)->RedrawWindow(); 82 UpdateData(FALSE); 83 } 84 } 85 UpdateData(FALSE); 86 GetDlgItem(IDC_STATIC_COLOR)->RedrawWindow(); 87 } 88 89 void CCatchColorDlg::OnEnChangeEditHex() 90 { 91 UpdateData(); 92 93 if (CatchColorMode_System == m_iCurrentMode) 94 { 95 if (m_strHex.IsEmpty() 96 || MaxHexWidth != m_strHex.GetLength() 97 || HEX_FLAG != m_strHex.Left(strlen(HEX_FLAG))) 98 { 99 return; 100 } 101 else 102 { 103 int iHex = 0; 104 int iLength = m_strHex.GetLength(); 105 106 char* pstrHex = NULL; 107 pstrHex = (char*)malloc(sizeof(char)*(iLength + 1)); 108 memset(pstrHex, 0, (iLength + 1)); 109 memcpy(pstrHex, (LPCTSTR)m_strHex, iLength); 110 111 char* pHex = NULL; 112 pHex = &pstrHex[1]; 113 iHex = strtol(pHex, NULL, 16); 114 115 int iRed = 0, iGreen = 0, iBule = 0; 116 ChangeHexToRGB(iHex, iRed, iGreen, iBule); 117 m_strRgb.Format(_T("%d, %d, %d"),iRed, iGreen, iBule); 118 119 free(pstrHex); 120 pstrHex = NULL; 121 122 m_Color = RGB(iRed, iGreen, iBule); 123 GetDlgItem(IDC_STATIC_COLOR)->RedrawWindow(); 124 UpdateData(FALSE); 125 } 126 } 127 } 128 129 BOOL CCatchColorDlg::CheckRGB(int color) 130 { 131 return ((MinRGBValue <= color) && (MaxRGBValue >= color)); 132 } 133 134 135 void CCatchColorDlg::GetCurrentColor() 136 { 137 UpdateData(); 138 139 // 如果是屏幕取色 140 if (CatchColorMode_Screen == m_iCurrentMode) 141 { 142 HDC hDC = ::GetDC(NULL); 143 CPoint pt; 144 GetCursorPos(&pt); 145 COLORREF clr = ::GetPixel(hDC,pt.x,pt.y); 146 147 CString ClrText; 148 m_strRgb.Format( _T("(%d,%d,%d)"), GetRValue(clr), GetGValue(clr), GetBValue(clr)); 149 m_strHex.Format(_T("#%02X%02X%02X"), GetRValue(clr), GetGValue(clr), GetBValue(clr)); 150 151 ::ReleaseDC(NULL, hDC); 152 m_Color = clr; 153 GetDlgItem(IDC_STATIC_COLOR)->RedrawWindow(); 154 155 UpdateData(FALSE); 156 } 157 158 } 159 160 void CCatchColorDlg::SetCurrentColor() 161 { 162 ReleaseCapture(); 163 m_iCurrentMode = CatchColorMode_System; 164 SetClipboard(m_strHex); 165 CString strMeg; 166 strMeg.Empty(); 167 strMeg.Format(_T("%s已经被保存到剪贴板上了."), m_strHex); 168 MessageBox(strMeg, _T("取色"), MB_OK|MB_ICONINFORMATION); 169 InitAll(TRUE); 170 } 171 172 BOOL CCatchColorDlg::SetClipboard(CString strText) 173 { 174 if (!OpenClipboard()) 175 { 176 return FALSE; 177 } 178 179 EmptyClipboard(); 180 int iLength = strText.GetLength(); 181 HGLOBAL hglbCopy; 182 LPTSTR lptstrCopy; 183 hglbCopy = GlobalAlloc(GMEM_MOVEABLE, 184 (iLength + 1) * sizeof(char)); 185 186 if (NULL == hglbCopy) 187 { 188 CloseClipboard(); 189 return FALSE; 190 } 191 192 lptstrCopy = (LPTSTR)GlobalLock(hglbCopy); 193 memcpy(lptstrCopy, (LPCTSTR)strText, iLength); 194 GlobalUnlock(hglbCopy); 195 SetClipboardData(CF_TEXT, hglbCopy); 196 CloseClipboard(); 197 return TRUE; 198 } 199 200 void CCatchColorDlg::ChangeHexToRGB(int iHex, int& iRed, int& iGreen, int& iBlue) 201 { 202 iRed = ( 0xff <<16 & iHex ) >> 16; 203 iGreen = ( 0xff <<8 & iHex ) >> 8; 204 iBlue =0xff & iHex; 205 206 } 207 void CCatchColorDlg::OnBnClickedButtonCatchsyscolor() 208 { 209 m_iCurrentMode = CatchColorMode_System; 210 211 CColorDialog colorDlg; 212 if (IDOK == colorDlg.DoModal()) 213 { 214 COLORREF clr = colorDlg.GetColor(); 215 CString ClrText; 216 m_strRgb.Format(_T("(%d,%d,%d)"), GetRValue(clr), GetGValue(clr) ,GetBValue(clr)); 217 m_strHex.Format(_T("#%02X%02X%02X"), GetRValue(clr), GetGValue(clr), GetBValue(clr)); 218 m_Color = clr; 219 220 UpdateData(FALSE); 221 222 CString strMeg; 223 strMeg.Empty(); 224 225 if (SetClipboard(m_strHex)) 226 { 227 strMeg.Format(_T("%s已被成功拷贝到剪贴板上了"),m_strHex); 228 } 229 else 230 { 231 strMeg.Format(_T("%s无法拷贝到剪贴板上")); 232 } 233 MessageBox(strMeg, _T("成功"), MB_OK | MB_ICONINFORMATION); 234 GetDlgItem(IDC_STATIC_COLOR)->RedrawWindow(); 235 } 236 else 237 { 238 return; 239 } 240 } 241 242 243 HBRUSH CCatchColorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 244 { 245 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 246 247 // 如果是颜色静态文本框 248 if(IDC_STATIC_COLOR == pWnd->GetDlgCtrlID()) 249 { 250 pDC->SetBkMode(TRANSPARENT); 251 m_brush.Detach(); 252 m_brush.CreateSolidBrush(m_Color); 253 pDC->SelectObject(&m_brush); 254 hbr = m_brush; 255 } 256 else if (CTLCOLOR_STATIC == nCtlColor 257 && IDC_STATIC_COLOR != pWnd->GetDlgCtrlID()) 258 { 259 pDC->SetBkMode(TRANSPARENT); 260 pDC->SetTextColor(RGB(0, 0, 0)); 261 pDC->SetBkColor(DEFAULT_COLOR); 262 hbr = m_TextBrush; 263 } 264 return hbr; 265 } 266 267 void CCatchColorDlg::OnLButtonDown(UINT nFlags, CPoint point) 268 { 269 270 UpdateData(); 271 272 // 如果是屏幕取色模式,鼠标左键按下,则取色 273 if (CatchColorMode_Screen == m_iCurrentMode) 274 { 275 GetCurrentColor(); 276 } 277 // 如果不是屏幕取色模式,鼠标左键按下,则移动对话框 278 else 279 { 280 PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y)); 281 } 282 283 CDialog::OnLButtonDown(nFlags, point); 284 285 } 286 287 void CCatchColorDlg::InitAll(BOOL bEnable) 288 { 289 GetDlgItem(IDC_BUTTON_CATCHSYSCOLOR)->EnableWindow(bEnable); 290 GetDlgItem(IDC_BUTTON_GETVERSION)->EnableWindow(bEnable); 291 292 if (!bEnable) 293 { 294 m_iCurrentMode = CatchColorMode_Screen; 295 SetCapture(); 296 } 297 } 298 299 void CCatchColorDlg::OnLButtonUp(UINT nFlags, CPoint point) 300 { 301 // 如果当前模式是屏幕取色模式,鼠标左键松开,则取色,并显示 302 if (CatchColorMode_Screen == m_iCurrentMode) 303 { 304 GetCurrentColor(); 305 SetCurrentColor(); 306 } 307 308 CDialog::OnLButtonUp(nFlags, point); 309 } 310 311 void CCatchColorDlg::OnMouseMove(UINT nFlags, CPoint point) 312 { 313 // 鼠标移动,取色 314 GetCurrentColor(); 315 316 CDialog::OnMouseMove(nFlags, point); 317 } 318 319 BOOL CCatchColorDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 320 { 321 if (HTNOWHERE == nHitTest) 322 { 323 // 如果是屏幕取色模式,设置鼠标的形状为取色工具图标 324 if (CatchColorMode_Screen == m_iCurrentMode) 325 { 326 ::SetCursor(m_hPoint); 327 return TRUE; 328 } 329 } 330 331 return CDialog::OnSetCursor(pWnd, nHitTest, message); 332 }