none
DrawFocusRect问题,画出来的东西总是重叠,还有就是坐标不可往反方向画,还有形状不是矩形... RRS feed

  • 问题

  • 我想画一个类似Adodb中的矩形选区这种东西。

    LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    
    
    
    {
    
    
    
     static HCURSOR g_hCurSize;
    
    
    
     static POINT pointClickPos;
    
    
    
    
    
    
    
     switch(uMsg)
    
    
    
     {
    
    
    
     case WM_CREATE:
    
    
    
      g_hCurSize = LoadCursor(NULL, IDC_SIZEWE);
    
    
    
      break;
    
    
    
     case WM_COMMAND:
    
    
    
      break;
    
    
    
     case WM_CLOSE:
    
    
    
      DestroyWindow(hWnd);
    
    
    
      break;
    
    
    
     case WM_LBUTTONDOWN:
    
    
    
      pointClickPos.x =  (int)LOWORD(lParam);
    
    
    
      pointClickPos.y = (int)HIWORD(lParam);
    
    
    
      break;
    
    
    
     case WM_LBUTTONUP:
    
    
    
      break;
    
    
    
     case WM_MOUSEMOVE:
    
    
    
      int nXPos;
    
    
    
      int nYPos;
    
    
    
      HDC hdcDraw;
    
    
    
      RECT rectCli;
    
    
    
    
    
    
    
      nXPos = (int)LOWORD(lParam);
    
    
    
      nYPos = (int)HIWORD(lParam);
    
    
    
    
    
    
    
      if(MK_LBUTTON == wParam)
    
    
    
      {
    
    
    
       hdcDraw = GetDC(hWnd);
    
    
    
       GetClientRect(hWnd, &rectCli);
    
    
    
       SetRect(&rectCli, pointClickPos.x, pointClickPos.y, nXPos, nYPos);
    
    
    
       //DrawFocusRect(hdcDraw, &rectCli);
    
    
    
       //HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
    
    
    
       //HBRUSH hBrush = CreateSolidBrush(RGB(255, 0, 0));
    
    
    
       //SelectObject(hdcDraw, (HGDIOBJ)hBrush);
    
    
    
       //SelectObject(hdcDraw, (HGDIOBJ)hPen);
    
    
    
       //Rectangle(hdcDraw, pointClickPos.x, pointClickPos.y, nXPos, nYPos);
    
    
    
       ::DrawFocusRect(hdcDraw, &rectCli);
    
    
    
       ReleaseDC(hWnd, hdcDraw);
    
    
    
      }
    
    
    
    
    
    
    
      break;
    
    
    
     case WM_DESTROY:
    
    
    
      PostQuitMessage(0); 
    
    
    
      break;
    
    
    
     default:
    
    
    
      return DefWindowProc(hWnd, uMsg, wParam, lParam);
    
    
    
     }
    
    
    
     return 0;
    
    
    
    }
    
    
    
    
    
    
    
    

    唯今之计“问”。
    2010年1月24日 2:47

答案

  • DrawFocusRect works only in MM_TEXT mode.

    Because DrawFocusRect is an XOR function, calling it a second time with the same rectangle removes the rectangle from the screen.

    MM_TEXT   Each logical unit is converted to 1 device pixel. Positive x is to the right; positive y is down.


    0xBAADF00D
    2010年1月25日 15:53
    版主
  • 这个意思就是。如果你两个矩形都是用DrawFocusRect画的。 有重复的地方的画,重叠的地方就被擦除了。
    2010年1月29日 1:54
  • 其实就是一个半透明矩形吧?不需要用那个函数。代码要你自己写,我可以给你提供点思路。

    最简单的办法是用PhotoShop建立一个半透明的PNG图片,然后用GDI+直接重复贴图多次。用GDI+可以大大简化代码,你可以参考GDI+的Alpha通道部分的文章。

    用API简单一点的办法就是建立一个DC在他上面画一个填冲了颜色的矩形,然后用AlphaBlend贴图即可。可以参考MSDN中GDI使用方法部分

    或者直接获取该处的像素矩阵,自己通过半透明的色彩计算公式计算出新的像素,再贴回原位。这需要一些算法和熟练的编程技术。

    0xBAADF00D
    2010年2月15日 2:49
    版主

全部回复

  • 那位朋友帮帮忙?
    唯今之计“问”。
    2010年1月25日 1:51
  • DrawFocusRect works only in MM_TEXT mode.

    Because DrawFocusRect is an XOR function, calling it a second time with the same rectangle removes the rectangle from the screen.

    MM_TEXT   Each logical unit is converted to 1 device pixel. Positive x is to the right; positive y is down.


    0xBAADF00D
    2010年1月25日 15:53
    版主
  • 用DrawRect好不好
    2010年1月26日 2:12
  • DrawFocusRect works only in MM_TEXT mode.

    Because DrawFocusRect is an XOR function, calling it a second time with the same rectangle removes the rectangle from the screen.

    MM_TEXT   Each logical unit is converted to 1 device pixel. Positive x is to the right; positive y is down.


    0xBAADF00D
    工作在MM_TEXT模式?


    第二次调用,清除矩形?不懂...
    唯今之计“问”。
    2010年1月28日 1:56
  • 这个意思就是。如果你两个矩形都是用DrawFocusRect画的。 有重复的地方的画,重叠的地方就被擦除了。
    2010年1月29日 1:54
  • 新年快乐!

    能帖些代码示范一下么,谢谢!


    唯今之计“问”。
    2010年2月14日 12:25
  • 其实就是一个半透明矩形吧?不需要用那个函数。代码要你自己写,我可以给你提供点思路。

    最简单的办法是用PhotoShop建立一个半透明的PNG图片,然后用GDI+直接重复贴图多次。用GDI+可以大大简化代码,你可以参考GDI+的Alpha通道部分的文章。

    用API简单一点的办法就是建立一个DC在他上面画一个填冲了颜色的矩形,然后用AlphaBlend贴图即可。可以参考MSDN中GDI使用方法部分

    或者直接获取该处的像素矩阵,自己通过半透明的色彩计算公式计算出新的像素,再贴回原位。这需要一些算法和熟练的编程技术。

    0xBAADF00D
    2010年2月15日 2:49
    版主