问题如下:
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.   

    1.这个比较容易吧。在OnPaint中绘制这个矩形和颜色即可
      

  2.   

    在OnPaint中显示,OnMouseMove中只是简单的InvalidateRect(rect,FALSE);
      

  3.   

    怎么会耗资源呢?hDC在用完后立即释放!
      

  4.   

    上面的代码都是在OnTimer中实现的,每10ms执行一次.
      

  5.   

    画图一般在OnPaint中或者OnDraw中
      

  6.   

    但是我要实时画出鼠标所在位置的像素的颜色
    所以不能在OnPaint或OnDraw中实现
      

  7.   

    在OnDraw还是在OnTimer中画都是一回事,你将你这段绘制语句写成一个函数,在OnTimer和OnPaint中分别调用就可以了。
    对于资源耗尽,没有测试过。你的绘制函数结束时,应该将分配的句柄都立刻释放掉。
      

  8.   

    那就在OnMouseMove中InvalidateRect(ColorRect,FALSE);
    ColorRect为你的程序中的矩形框
      

  9.   

    你要的1。在OnPaint中进行
    你要的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);
      

  10.   

    还是不行。下面是详细代码
    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函数的。使用全局钩子估计也不行,再说也不会使用。
      

  11.   

    你的程序可能哪里还有错,你可以先 Release 一下,也许会有所发现的。
    Debug和Release 毕竟不同
    我曾经就碰过这种情况
    祝你好运.
      

  12.   

    一个建议:
    你可以设置一个全局的颜色,然后在OnTimer(...)中获取鼠标所在点的颜色写到这个全局的颜色变量中。
    在OnPaint(...)中画出全局颜色的矩形框。
      

  13.   

    新手问一句:OnTimer的处理语句(你添加的)是不是应该加个判断?if ( nIDEvent==0 )
    {
          // 你添加的
    }
      

  14.   

    我只设置了一个定时器,所以不用判断nIDEvent是否为0
      

  15.   

    一个建议:
    你可以设置一个全局的颜色,然后在OnTimer(...)中获取鼠标所在点的颜色写到这个全局的颜色变量中。
    在OnPaint(...)中画出全局颜色的矩形框。
    --------------------------------------------------
    这样的话不能实时显示鼠标所在位置像素的颜色