偶是win32sdk/api 方式,不是MFC, VC6,win2000. 打算在WM_NOTIFY 和WM_LBUTTONUP
里画点什么,可是怎么画呢?

解决方案 »

  1.   

    为你写了代码!我测试过了,是你要的吧?
    int gl_nPrevX;
    int gl_nPrevY;
    int gl_nStarX;
    int gl_nStarY;
    int gl_nEndX;
    int gl_nEndY;
    int gl_nCurrX;
    int gl_nCurrY;
    int gl_nMouseState;//1--左键按下void DrawRect(HWND hWnd, int left,int top,int right,int bottom)
    {
    HDC hDC = GetDC(hWnd);
    int old_rop = SetROP2(hDC,R2_XORPEN);
    SetBkMode(hDC,TRANSPARENT);

    HPEN hPen = CreatePen(PS_SOLID,1, RGB(0,200,0));  
    HPEN hOldPen = (HPEN)SelectObject(hDC,&hPen);    
    HBRUSH hBrush = CreateSolidBrush(RGB(50,0,0));
    HBRUSH hOldBr = (HBRUSH)SelectObject(hDC,hBrush);

    Rectangle(hDC,left,top,right,bottom);

    SelectObject(hDC,hOldPen);
    SelectObject(hDC,hOldBr);
    SetROP2(hDC,old_rop);
    }
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message) 
    {
    case WM_COMMAND:
    break;
    // 2004-11-26 handwolf (add_start)
    case WM_LBUTTONDOWN:
    {
    gl_nStarX = LOWORD(lParam);
    gl_nStarY = HIWORD(lParam);
    gl_nMouseState = 1;
    }
    break;    
    case WM_LBUTTONUP:
    {
    int left = min(gl_nStarX,gl_nPrevX);
    int right = max(gl_nStarX,gl_nPrevX);
    int top = min(gl_nStarY,gl_nPrevY);
    int bottom = max(gl_nStarY,gl_nPrevY);
    DrawRect(hWnd,left,top,right,bottom);

    gl_nEndX = LOWORD(lParam);
    gl_nEndY = HIWORD(lParam);
    gl_nMouseState = 0;
    }
    break;    
    case WM_MOUSEMOVE:
    {
    gl_nCurrX = LOWORD(lParam);
    gl_nCurrY = HIWORD(lParam);
    if(gl_nMouseState == 1)
    {
    int left = min(gl_nStarX,gl_nPrevX);
    int right = max(gl_nStarX,gl_nPrevX);
    int top = min(gl_nStarY,gl_nPrevY);
    int bottom = max(gl_nStarY,gl_nPrevY);

    DrawRect(hWnd,left,top,right,bottom);

    left = min(gl_nStarX,gl_nCurrX);
    right = max(gl_nStarX,gl_nCurrX);
    top = min(gl_nStarY,gl_nCurrY);
    bottom = max(gl_nStarY,gl_nCurrY);

    DrawRect(hWnd,left,top,right,bottom);
    }
    gl_nPrevX = LOWORD(lParam);
    gl_nPrevY = HIWORD(lParam);
    }
    break;   
    // 2004-11-26 handwolf (add_end)

    case WM_PAINT:
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
       }
       return 0;
    }
      

  2.   

    Windows使用了SetLayeredWindowAttributes,当然只支持Window2000及以上版本,98下不支持
      

  3.   

    To  handwolf(初学者) :好极了,已经做出来了.不过TextOut有点问题,搞得一片黑呼呼的.
    怎么使得文字也可以透明地画出呢?
      

  4.   

    方法一:
     先画到bitmap上,然后再画到视图上
      

  5.   

    void DrawRect(HWND hWnd, int left,int top,int right,int bottom)
    {
    HDC hDC = GetDC(hWnd);
    int old_rop = SetROP2(hDC,R2_XORPEN);
    SetBkMode(hDC,TRANSPARENT);

    //text
    HDC hDCPic = CreateCompatibleDC(hDC) ;
    HBITMAP hBmp = CreateCompatibleBitmap(hDC,(right-left)/2,(bottom-top)/2) ;
    SelectObject(hDCPic,hBmp) ;  
    PatBlt(hDCPic,0,0,(right-left)/2,(bottom-top)/2,PATCOPY) ;
    SetBkColor(hDCPic,RGB(255,255,255)) ;
    SetBkMode(hDCPic,TRANSPARENT);
    TextOut(hDCPic,10,10,"Hello",5);    
    BitBlt(hDC,left+(right-left)/4,top+(bottom-top)/4,(right-left)/2,(bottom-top)/2,hDCPic,0,0,SRCINVERT) ;   


    HPEN hPen = CreatePen(PS_SOLID,1, RGB(0,200,0));  
    HPEN hOldPen = (HPEN)SelectObject(hDC,&hPen);    
    HBRUSH hBrush = CreateSolidBrush(RGB(50,0,0));
    HBRUSH hOldBr = (HBRUSH)SelectObject(hDC,hBrush);
    //rect
    Rectangle(hDC,left,top,right,bottom);


    SelectObject(hDC,hOldPen);
    SelectObject(hDC,hOldBr);
    SetROP2(hDC,old_rop);
    }
      

  6.   

    handwolf(初学者) :偶在newsgroup上看到KB214814,原来的工作算是吃苦了.不过还是非常感谢,分数都给你了.另外,偶有个问题,也是在newsgroup解决的,但是csdn没有回收分数的,你去reply一下吧,
    我把分数给你.地址是:http://community.csdn.net/Expert/topic/3586/3586010.xml?temp=.2883722