Здравствуйте, 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;
}
};