关于自绘按钮的问题
佛火 2005-12-28 08:05:54 使用钩子来实现,显示是正常了,,但是后来发现,如果我的贴图没有完全挡住按钮区域的时候,
在按下鼠标左键和弹起的时候,就能看到一部分普通的按钮(系统绘的),,
请问不让系统绘,全部自己绘,但又要响应鼠标消息,该怎么做?
LRESULT CALLBACK PHButton::HookWndProc( HWND hWnd , UINT message , WPARAM wParam , LPARAM lParam )
{
pWndInfo = (WndInfo*)GetProp( hWnd, HOOK_WND_PROC );
ASSERT( pWndInfo!=NULL );
hDC = GetWindowDC( hWnd );
GetWindowRect( hWnd, &rcButton );
switch( message )
{
case WM_PAINT:
{
return OnPaint( hWnd, (HDC)wParam );
}
case WM_LBUTTONDOWN:
{
pWndInfo->m_ButtonCfg.IsMouseDown = TRUE;
CallWindowProc( pWndInfo->m_WndProc , hWnd ,message , wParam ,lParam );
return OnLButtonDown( hWnd );
}
case WM_LBUTTONUP:
{
CallWindowProc( pWndInfo->m_WndProc , hWnd ,message , wParam ,lParam );
pWndInfo->m_ButtonCfg.IsMouseDown = FALSE;
return OnLButtonUp( hWnd );
}
case WM_MOUSELEAVE:
{
CallWindowProc( pWndInfo->m_WndProc , hWnd ,message , wParam ,lParam );
pWndInfo->m_ButtonCfg.IsMouseIN = FALSE;
return OnMouseLeave( hWnd );
}
case WM_MOUSEMOVE:
{
CallWindowProc( pWndInfo->m_WndProc , hWnd ,message , wParam ,lParam );
POINT pt;
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
RECT rcButton;
GetWindowRect( hWnd , &rcButton );
if( pt.x<=rcButton.right-rcButton.left && pt.y<=rcButton.bottom-rcButton.top )
{
if( !pWndInfo->m_ButtonCfg.IsMouseIN )
{
pWndInfo->m_ButtonCfg.IsMouseIN= TRUE;
OnMouseEnter( hWnd );
TRACKMOUSEEVENT tct;
tct.cbSize = sizeof(TRACKMOUSEEVENT);
tct.dwFlags = TME_LEAVE;
tct.hwndTrack = hWnd;
TrackMouseEvent( &tct );
}
}
return 0;
}
case WM_MOUSEACTIVATE:
{
CallWindowProc( pWndInfo->m_WndProc , hWnd ,message , wParam ,lParam );
if( (UINT) HIWORD(lParam)==WM_LBUTTONDOWN)
{
pWndInfo->m_ButtonCfg.IsMouseDown = TRUE;
return OnLButtonDown( hWnd );
}
return 0;
}
case BM_SETSTATE:
{
CallWindowProc( pWndInfo->m_WndProc , hWnd ,message , wParam ,lParam );
if( pWndInfo->m_ButtonCfg.fState!=(BOOL)wParam)
{
pWndInfo->m_ButtonCfg.fState = wParam;
pWndInfo->m_ButtonCfg.fState = wParam;
if( wParam==TRUE )
return OnLButtonDown( hWnd );
else
return OnLButtonUp( hWnd );
}
return 0;
}
default:
{
return CallWindowProc( pWndInfo->m_WndProc , hWnd ,message , wParam ,lParam );
}
}