关于自绘按钮的问题

佛火 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 );
}
}
...全文
198 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
佛火 2005-12-28
  • 打赏
  • 举报
回复
好像这样就可以了,

case WM_CREATE:
{
SetWindowLong( hWnd, GWL_STYLE, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW );
return CallWindowProc( pWndInfo->m_WndProc , hWnd ,message , wParam ,lParam );
}
goodboyws 2005-12-28
  • 打赏
  • 举报
回复
加上这个
BITMAP bm;
GetObject(hBmp, sizeof(BITMAP), &bm);
SetWindowPos(hButton, NULL, 0, 0, bm.bmWidth, bm.bmHeight, SWP_NOMOVE | SWP_NOZORDER);
goodboyws 2005-12-28
  • 打赏
  • 举报
回复
应该根据图片的大小对按钮进行MoveWindow
佛火 2005-12-28
  • 打赏
  • 举报
回复
。。。那些是MFC写的啊~~~我只是想知道我还需要处理哪些消息或者是哪些消息的处理需要修改,
佛火 2005-12-28
  • 打赏
  • 举报
回复
好的~~~去看看先
Kudeet 2005-12-28
  • 打赏
  • 举报
回复
http://www.vckbase.com/english/code/buttonctrl/index.html
蒋晟 2005-12-28
  • 打赏
  • 举报
回复
http://www.thecodeproject.com/buttonctrl/CKbcButton.asp
佛火 2005-12-28
  • 打赏
  • 举报
回复
结帐~~~
佛火 2005-12-28
  • 打赏
  • 举报
回复
呵呵,这只是一部分而已啦,,勾子要处理所有的常规控件自绘,,按钮只是其中一个小小的部分而已~~
zkx2321 2005-12-28
  • 打赏
  • 举报
回复
费那么大劲。何必呢。

按钮其实就是一个子窗口,有图片的按钮只不过是子窗口上多一个图而已。

看你的代码费那么大劲。还钩子,用得着吗?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧