Re[2]: Заманался - как полностью перекрыть отрисовку заголов
От: ElcnU Россия  
Дата: 29.01.07 14:25
Оценка:
Здравствуйте, ElcnU, Вы писали:

EU>Здравствуйте, Аноним, Вы писали:


EU>недавно с таким сталкивался.

EU>когда правой кнопкой кликаешь на таскбаре по кнопке приложения вызывается WM_NCACTIVATE, при этом возвращай true и стандартный заголовок не прорисуется.
EU>но я тормознулся на перехвате нажатия по кнопкам,закрыть свернуть итд. есть идея в обработчике WM_NCHITTEST вызывать функцию DefWindowProc текущего окна с сообщением WM_NCHITTEST и теме же параметрами(wParam,lParam),смотреть что она вернула и при попадании на системные кнопки возвращать не 0
EU>при выходе из обработчика. ну а кнопки и их модификацию нарисовать самомуотрисовать самому
вот примерно то что я хотел сказать.
написано на АПИ(библиотека класов моя).Если там есть чёто лишнее то писал второпях
class CULGraphDlg:public CULDlg
{
    BOOL m_bClosing;
    LRESULT m_HitTestFlag;
    TCHAR* m_szCaption;
public:
    CULGraphDlg():CULDlg()
    {
        m_bClosing=FALSE;
        m_bMovingWnd=FALSE;
        m_HitTestFlag=0;
        m_szCaption=new TCHAR[255];
    };
    CULGraphDlg(short TemplID,short IconID=0,HWND hParentHWND=NULL):
        CULDlg(TemplID,IconID=0,hParentHWND)
        {
            m_szCaption=new TCHAR[255];
        };
    ~CULGraphDlg()
    {
        delete m_szCaption;
    }
    //=================================
    virtual BOOL PreProcessMSG(ULMSG msg)
    {
        ProcessMSG(&msg,
            WM_SIZE,OnSize,
            WM_NCLBUTTONDOWN,OnNCLButtonDown,
            WM_NCLBUTTONUP,OnLButtonUp,
            WM_LBUTTONDOWN,OnLButtonDown,
            WM_MOUSEMOVE,OnMouseMove,
            WM_PAINT,OnPaint,
            WM_NCPAINT,OnNCPaint,
            WM_ERASEBKGND,OnEraseBkGnd,
            WM_NCHITTEST,OnNCHitTest,
            WM_SETTEXT,OnSetText);
        if(msg.uiMsg==WM_NCACTIVATE)
            return 1;
        return CULDlg::PreProcessMSG(msg);
    };
    //=================================
    HRGN m_hRgn;    // регион

    virtual BOOL OnInitDialog(WPARAM,LPARAM)
    {
        CULDlg::OnInitDialog(0,0);

        RECT rc;
        // прямоугольник окна
        GetWindowRect(m_hWnd, &rc);
        OffsetRect(&rc,  - rc.left,  - rc.top);
        DeleteObject(m_hRgn);
        m_hRgn = CreateRoundRectRgn(
            rc.left, rc.top, rc.right, rc.bottom, 30, 30);
        SetWindowRgn(m_hWnd, m_hRgn, TRUE);
        ::GetWindowText(*this,m_szCaption,255);
        return FALSE;
    };

    virtual BOOL OnSize(WPARAM Type,LPARAM Size)
    {
        return FALSE;
    };
    virtual int  OnNCHitTest(WPARAM wParam,LPARAM CurPos)
    {
        int xPos = LOWORD(CurPos); 
        int yPos = HIWORD(CurPos); 
        LRESULT ret=0;
         ret=DefWindowProc(*this,WM_NCHITTEST,wParam,CurPos);
         m_HitTestFlag=ret;
        if(ret==HTCLOSE)
        {
            m_HitTestFlag=ret;
            return HTCAPTION;
        }
        RECT rcWnd;
        ::GetWindowRect(*this,&rcWnd);
        xPos-=rcWnd.left;
        yPos-=rcWnd.top;
        if((xPos>=250)&&(xPos<=(250+20))&&(yPos>=2)&&(yPos<=(2+20)))
            m_bClosing=TRUE;
        else
            m_bClosing=FALSE;
        return 0;
    };
    virtual BOOL OnNCLButtonDown(WPARAM Type,LPARAM CurPos)
    {
        if(m_bClosing)
            ::SendMessage(*this,WM_CLOSE,0,0);
        return FALSE;
    }
    virtual BOOL OnLButtonUp(WPARAM Type,LPARAM CurPos)
    {
        return FALSE;
    }
    
    virtual BOOL OnSetText(WPARAM,TCHAR* szCaption)
    {
        lstrcpy(m_szCaption,szCaption);
        ::InvalidateRect(*this,NULL,0);
        return TRUE;
    };

    virtual BOOL OnNCPaint(HRGN hRgn,LPARAM)
    {
        HDC hDC;
        hDC=GetWindowDC(*this);
        LOGBRUSH lb;
        lb.lbColor=0xff0000;
        lb.lbStyle=BS_SOLID;
        ::SelectObject(hDC,::CreateBrushIndirect(&lb));
        ::Rectangle(hDC,0,0,300,25);
        //===============================================
        lb.lbColor=0x0000ff;
        lb.lbStyle=BS_SOLID;
        ::SelectObject(hDC,::CreateBrushIndirect(&lb));
        ::Rectangle(hDC,250,2,250+20,20+2);
        ReleaseDC(m_hWnd, hDC);
        return 1;
    }
    virtual BOOL OnPaint(WPARAM,LPARAM)
    {
        PAINTSTRUCT ps;
        HDC hDC;
        hDC=GetWindowDC(*this);
        ::SetBkColor(hDC,0xff0000);
        ::TextOut(hDC,10,5,m_szCaption,lstrlen(m_szCaption));
        ReleaseDC(m_hWnd, hDC);

        hDC=::BeginPaint(*this,&ps);
        LOGBRUSH lb;
        lb.lbColor=0x00ff00;
        lb.lbStyle=BS_SOLID;
        ::SelectObject(hDC,::CreateBrushIndirect(&lb));
        ::Rectangle(hDC,0,0,500,500);
        ::EndPaint(*this,&ps);
        return 0;
    }

    virtual BOOL OnEraseBkGnd(HDC hDC,LPARAM)
    {
        LOGBRUSH lb;
        lb.lbColor=0x00ff00;
        lb.lbStyle=BS_SOLID;
        ::SelectObject(hDC,::CreateBrushIndirect(&lb));
        ::Rectangle(hDC,0,0,500,500);
        return 0;
    }

    POINT m_ptMovingWnd;
    BOOL m_bMovingWnd;
    virtual BOOL OnLButtonDown(WPARAM ButDown,LPARAM CurPos)
    {
        m_ptMovingWnd.x=LOWORD(CurPos);
        m_ptMovingWnd.y=HIWORD(CurPos);
        return FALSE;
    }

    virtual BOOL OnMouseMove(WPARAM ButDown,LPARAM CurPos)
    {
        if(ButDown!=MK_LBUTTON)
            return FALSE;
        if(m_HitTestFlag!=HTCAPTION)
            return FALSE;
        POINT pt={LOWORD(CurPos),HIWORD(CurPos)};
        RECT rcWnd;
        ::GetWindowRect(*this,&rcWnd);
        pt.x=pt.x-m_ptMovingWnd.x;
        pt.y=pt.y-m_ptMovingWnd.y;
        ::SetWindowPos(*this,0,rcWnd.left+pt.x,rcWnd.top+pt.y,rcWnd.right,rcWnd.bottom,
            SWP_NOZORDER);
        return FALSE;
    }
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.