介绍 这个程序从桌面得到像素的颜色,在一个窗口中显示它们,并有一个4 - 1放大镜。稍后可以将它们复制到剪贴板中。 背景 这个版本是用户友好的。选定的颜色填满了这5个框。关联的按钮以“选择格式”选项选择的格式将其颜色复制到复制窗口。这些按钮最初是禁用的,否则对话框窗口的背景颜色将被复制。按Copy将此值发送到剪贴板。 我知道,你会认为这是以前做过的,甚至在这个网站上,但这就是为什么我提出这篇文章:我订阅了Lockergnome -一个Windows狂热者的通讯。上周,他们推出了一个名为TakeColor的下载程序。我想看看我是否能对它进行伪逆向工程。结果发现这有点挑战性:TakeColor - flaxie.com。 使用的代码 的元素: 一个菜单。 显示像素颜色的窗口。 一个缩放窗口(4 - 1放大镜)。 显示十六进制,HTML,或RGB。 鼠标的坐标。 选定颜色的列表。 显示最后五种选定颜色的五个框。 复制到剪贴板。 解释 菜单不大,使用了资源编辑器。第一个挑战是ON_UPDATE_COMMAND_UI不能用于非系统菜单。此函数切换菜单项。我们可以用ToggleMenuItem(0,1)调用它。我手工编码菜单项和子项目,这个调用在选项菜单上设置一个复选标记,保持在顶部。隐藏,Copy co全无CColorTakeDlg::ToggleMenuItem(int nMenu, int nPos) { // Onupdate命令UI不能在非系统菜单中工作 CMenu *pMenu = GetMenu(); GetSubMenu(nMenu); GetMenuItemID(nPos); GetMenuState(nID, MF_BYCOMMAND); 断言(nState ! = 0 xffffffff); 如果(nState,MF_CHECKED) CheckMenuItem(nID, MF_UNCHECKED | MF_BYCOMMAND); 其他的 CheckMenuItem(nID, MF_CHECKED | MF_BYCOMMAND); } 显示当前颜色。隐藏,复制CodeCDC *pSDC = m_current.GetDC(); 绘图用的矩形类sRect; m_current.GetClientRect(及sRect); pSDC→FillSolidRect(及sRect m_colCurrent); ReleaseDC (pSDC); 缩放窗口。隐藏,收缩,拷贝Codeif (bEnableZoom) { CDC *pDC = m_zoom.GetDC(); 绘图用的矩形类m_rect; m_zoom.GetClientRect(及m_rect); InflateRect(及m_rect 1 0); pDC→SetStretchBltMode (COLORONCOLOR); //将20 x 20的窗口拉伸到81 x 81, //接近4到1个放大镜 pDC→StretchBlt (m_rect。左,m_rect.top, m_rect.Height m_rect.Width()()、pDesktopDC pt.x - m_nOffset, pt.y - m_nOffset, m_nWidth、m_nWidth SRCCOPY); pen.DeleteObject (); 钢笔。CreatePen(PS_SOLID, 1, RGB(255, 0,0)); CPen *pOldPen = pDC->SelectObject(& gt; pen); CPoint点; //在x轴和y轴的中点画一条红线 点。x = m_rect.Width () / 2; 点。y = m_rect.top; pDC→函数(点); 点。y = m_rect.bottom; pDC→画线(点); 点。x = m_rect.left; 点。y = m_rect.Height () / 2; pDC→函数(点); 点。x = m_rect.right; pDC→画线(点); pDC→SelectObject (pOldPen); ReleaseDC (pDC); } 显示十六进制,HTML,或RGB。隐藏,拷贝Codeswitch (m_nSelect) { 例0: format ("%02X, %02X, %02X", rVal, gVal, bVal);/ /十六进制 m_color.SetWindowText ((LPCTSTR) str); 打破; 案例1: format ("#%02X%02X ", rVal, gVal, bVal);/ / HTML m_color.SetWindowText ((LPCTSTR) str); 打破; 案例2: format ("%d, %d, %d", rVal, gVal, bVal);/ / RGB m_color.SetWindowText ((LPCTSTR) str); 打破; } 鼠标坐标:这是一个相当大的挑战,我使用SetCapture()从桌面获取光标。在以前的版本中,这是一个错误。隐藏,OnTimer(UINT nIDEvent) { // TODO:在这里添加您的消息处理程序代码和/或调用默认值 m_hwnd =::GetDesktopWindow(); 装运箱str; 点pt; pt.x = pt.y = 0; / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = //获取鼠标指针位置并显示它 / / = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = GetCursorPos(及pt); format ("X: %d, Y: %d", pt.x, pt.y); m_mouse.SetWindowText ((LPCTSTR) str); … … 选定颜色的列表。隐藏,CodeCString str复印件; m_color.GetWindowText (str); m_list1。InsertString (0, str); UpdateData(假); 显示最后五种选定颜色的五个框。隐藏,复制代码//将当前选择的颜色存储在最左边 // 5个盒子,将旧的移到右边。 空白CColorTakeDlg: CopyColor () { m_nColor [4] = m_nColor [3]; m_nColor [3] = m_nColor [2]; m_nColor [2] = m_nColor [1]; m_nColor [1] = m_nColor [0]; m_nColor [0] = m_colCurrent; DrawColorBoxes (); } 复制到剪贴板。隐藏,复制Codevoid CColorTakeDlg: OnCopy () { //待办事项:在这里添加控制通知处理程序代码 m_edit1。SetSel (0,1); //将选定的颜色复制到剪贴板 m_edit1.Copy (); } 的兴趣点 这个程序使用CHotKeyCtrl类将选中的颜色复制到列表和第一个框中。函数void GetHotKey(WORD &wVirtualKeyCode, WORD &wModifiers)常量;用于从控件中获取热键。wVirtualKeyCode是按下的键盘键(A - Z),而wModifiers是控制键(Shift、Ctrl、Alt和Windows键)。在CommCtrl.h中定义的修饰符标志可以是以下值的组合:复制Code
#define HOTKEYF_SHIFT 0x01 #define HOTKEYF_CONTROL 0x02 #define HOTKEYF_ALT 0x04 #define HOTKEYF_EXT 0x08
然后必须使用:Hide来注册热键。复制Code
BOOL RegisterHotKey( HWND hWnd, // handle to window int id, // hot key identifier UINT fsModifiers, // key-modifier options UINT vk // virtual-key code );
fsModifiers的值是在WinUser.h中定义的。隐藏,复制Code
#define MOD_ALT 0x0001 #define MOD_CONTROL 0x0002 #define MOD_SHIFT 0x0004 #define MOD_WIN 0x0008
如你所见,值是不一样的,所以我有:Hide 复制Code
void CColorTakeDlg::OnNewHotkey() { // TODO: Add your control notification handler code here UnregisterHotKey(m_hWnd, HOTKEYID); m_hotkey1.GetHotKey(wVirtualKeyCode, wModifiers); switch(wModifiers) { case HOTKEYF_SHIFT: fsModifiers = MOD_SHIFT; break; case HOTKEYF_CONTROL: fsModifiers = MOD_CONTROL; break; case HOTKEYF_ALT: fsModifiers = MOD_ALT; break; case HOTKEYF_EXT: fsModifiers = MOD_WIN; break; } RegisterHotKey(m_hWnd, HOTKEYID, fsModifiers, wVirtualKeyCode); }
这仅仅是四种组合,我不想允许所有16种,所以我使用SetRules()。隐藏,复制Code
m_hotkey1.SetHotKey(0x43, HOTKEYF_ALT); m_hotkey1.SetRules(HKCOMB_CA | HKCOMB_SA | HKCOMB_SC | HKCOMB_SCA | HKCOMB_NONE, HOTKEYF_ALT); RegisterHotKey(m_hWnd, HOTKEYID, MOD_ALT, 0x43); wVirtualKeyCode = 0x43; wModifiers = HOTKEYF_ALT; fsModifiers = MOD_ALT;
你想要它滑稽,然后把光标放在放大镜窗口。当你接近1像素宽的交叉线时,你会在窗口中看到它们是4像素宽。如果你再靠近一点,就是16像素宽。大约在他们得到64像素宽的时候,窗口会变成红色。 警告 如果你在Win95/Win98的旧版本Windows上使用这个程序,缩放窗口不能正常工作,那么你就有问题了。GDI资源导致StretchBlt(…)返回FALSE:请参阅MSDN知识库文章。 历史 2005年3月19日-版本1.0。 2005年3月25日- 1.1版本-新的线程方法。 2005年3月31日-版本1.2 -修正错误,增加标记为选定。 2005年11月22日-版本1.3 -新的缩放方法。 2005年12月4日-版本1.4 -最终版本,用户友好。 本文转载于:http://www.diyabc.com/frontweb/news5278.html