问题如下:
1.如何在对话框上显示一个矩形框,其可以显示颜色,并且刷新时,此矩形框及其背景颜色还在。(20点)
2.现在在做一个程序,要求此矩形框实时显示鼠标所在位置的颜色,现在鼠标指针的位置及其颜色都已经可以获得,只是现在实时显示其颜色时太耗资源,请问哪位大侠有高招实现?(30点) CPoint pt;
GetCursorPos(&pt); // 得到当前鼠标所在位置
HDC hDC = ::GetDC(NULL); //获取屏幕DC
COLORREF clr = ::GetPixel(hDC, pt.x, pt.y); // 获取当前鼠标点像素值
// 分解出像素点中的红、绿、蓝颜色值
m_iEditRed = GetRValue(clr);
m_iEditGreen = GetGValue(clr);
m_iEditBlue = GetBValue(clr); m_strEditRedHex.Format("%02X", m_iEditRed);
m_strEditGreenHex.Format("%02X", m_iEditGreen);
m_strEditBlueHex.Format("%02X", m_iEditBlue); m_brush.CreateSolidBrush(clr);
m_pDC->FillRect(&m_rect, &m_brush);
1.如何在对话框上显示一个矩形框,其可以显示颜色,并且刷新时,此矩形框及其背景颜色还在。(20点)
2.现在在做一个程序,要求此矩形框实时显示鼠标所在位置的颜色,现在鼠标指针的位置及其颜色都已经可以获得,只是现在实时显示其颜色时太耗资源,请问哪位大侠有高招实现?(30点) CPoint pt;
GetCursorPos(&pt); // 得到当前鼠标所在位置
HDC hDC = ::GetDC(NULL); //获取屏幕DC
COLORREF clr = ::GetPixel(hDC, pt.x, pt.y); // 获取当前鼠标点像素值
// 分解出像素点中的红、绿、蓝颜色值
m_iEditRed = GetRValue(clr);
m_iEditGreen = GetGValue(clr);
m_iEditBlue = GetBValue(clr); m_strEditRedHex.Format("%02X", m_iEditRed);
m_strEditGreenHex.Format("%02X", m_iEditGreen);
m_strEditBlueHex.Format("%02X", m_iEditBlue); m_brush.CreateSolidBrush(clr);
m_pDC->FillRect(&m_rect, &m_brush);
所以不能在OnPaint或OnDraw中实现
对于资源耗尽,没有测试过。你的绘制函数结束时,应该将分配的句柄都立刻释放掉。
ColorRect为你的程序中的矩形框
你要的2。把你写的下面代码,修改如下,放在OnMouseMove中,
CPoint pt;
GetCursorPos(&pt); // 得到当前鼠标所在位置
HDC hDC = ::GetDC(NULL); //获取屏幕DC
COLORREF clr = ::GetPixel(hDC, pt.x, pt.y); // 获取当前鼠标点像素值
// 分解出像素点中的红、绿、蓝颜色值
m_iEditRed = GetRValue(clr);
m_iEditGreen = GetGValue(clr);
m_iEditBlue = GetBValue(clr); m_strEditRedHex.Format("%02X", m_iEditRed);
m_strEditGreenHex.Format("%02X", m_iEditGreen);
m_strEditBlueHex.Format("%02X", m_iEditBlue); InvalidateRect(ColorRect,FALSE);
void CGetScreenColorDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
KillTimer(0);
if(m_bGetColor)
{
UpdateData();
CPoint pt;
GetCursorPos(&pt); // 得到当前鼠标所在位置
HDC hDC = ::GetDC(NULL); //获取屏幕DC
COLORREF clr = ::GetPixel(hDC, pt.x, pt.y); // 获取当前鼠标点像素值
// 分解出像素点中的红、绿、蓝颜色值
m_iEditRed = GetRValue(clr);
m_iEditGreen = GetGValue(clr);
m_iEditBlue = GetBValue(clr);
m_brush.CreateSolidBrush(clr); // 创建刷子
m_pDC->FillRect(&m_rect, &m_brush); // 每10ms矩形框填充一次鼠标当前位置像素的颜色
m_iEditX = pt.x; // 显示鼠标位置
m_iEditY = pt.y;
UpdateData(FALSE);
SetTimer(0, 10, NULL); // 设置新的定时器
}
CDialog::OnTimer(nIDEvent);
}很关键的一个问题就是我不得不使用定时器,因为当鼠标移动到对话框之外时,是无法触发OnMouseMove函数的。使用全局钩子估计也不行,再说也不会使用。
Debug和Release 毕竟不同
我曾经就碰过这种情况
祝你好运.
你可以设置一个全局的颜色,然后在OnTimer(...)中获取鼠标所在点的颜色写到这个全局的颜色变量中。
在OnPaint(...)中画出全局颜色的矩形框。
{
// 你添加的
}
你可以设置一个全局的颜色,然后在OnTimer(...)中获取鼠标所在点的颜色写到这个全局的颜色变量中。
在OnPaint(...)中画出全局颜色的矩形框。
--------------------------------------------------
这样的话不能实时显示鼠标所在位置像素的颜色