Cbutton и Drawitem

  • Автор темы LordNet
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

LordNet

Гость
#1
Помогите сделать правильно флат кнопку.

Вот я унаследовал свой класс от CButton – CMyButton
В нем я перегружаю DrawItem:

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);

//Картинка по делфиту:
DrawIcon(lpDrawItemStruct->hDC, 0, 0, LoadIcon:):AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_DEF)));

//Картинка при нажатий:
if(lpDrawItemStruct->itemState & ODS_SELECTED)
{
DrawIcon(lpDrawItemStruct->hDC, 0, 0, LoadIcon:):AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_SELECTED)));
}
}


А вот как правильно сделать, что бы картинка менялась при наведений мышки на кнопку?

Я делаю таймер:

BOOL CdddddDlg::OnInitDialog()
{
. . .
SetTimer(1,1,0);
. . .
}

void CMyDlg::OnTimer(UINT_PTR nIDEvent)
{
CPoint CursorPos;
GetCursorPos(&CursorPos);

CRect rr;
m_b.GetWindowRect(&rr);

if(rr.PtInRect(CursorPos))
{
//Картинка не миняеться !!!
m_b.SetIcon( ::LoadIcon( AfxGetInstanceHandle() , MAKEINTRESOURCE(IDI_ICON_MOVE)) );
}

CDialog::OnTimer(nIDEvent);
}


Что я не правильно делаю?
Заранее спасибо.
 
Z

zubr

Гость
#2
Попробуй проверять if(lpDrawItemStruct->itemState & ODS_HOTLIGHT) или ловить нотификации BN_HILITE и BN_UNHILITE. А решение с таймером очень некрасивое.
 
L

LordNet

Гость
#3
Попробуй проверять if(lpDrawItemStruct->itemState & ODS_HOTLIGHT) или ловить нотификации BN_HILITE и BN_UNHILITE. А решение с таймером очень некрасивое.
if(lpDrawItemStruct->itemState & ODS_HOTLIGHT) - Не помогает
if(lpDrawItemStruct->itemState & BN_HILITE|BN_UNHILITE) - Происходит тока при нажатий.

Или я не правильно тебя понял?
 
Z

zubr

Гость
#4
Извини, забыл уточнить - класс кнопок должен быть CBitmapButton, а стиль BS_OWNERDRAW.
if(lpDrawItemStruct->itemState & BN_HILITE|BN_UNHILITE) - Происходит тока при нажатий.
Полная лажа, BN_HILITE и BN_UNHILITE - это код сообщения Windows WM_NOTIFY
Для CButton придется отлавливать сообщение WM_MOUSEMOVE, что нибудь типа этого:
Код:
LRESULT CWzButtonImpl::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
LRESULT lr = CWindowImpl<CWzButtonImpl, CButton>::DefWindowProc(uMsg,wParam,lParam);
bHandled = TRUE;

POINT point = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
UINT nFlags = wParam;

HWND hParent; 

// If the mouse enter the button with the left button pressed then do nothing
if (nFlags & MK_LBUTTON && m_MouseOnButton == 0) 
return lr;

// If our button is not flat then do nothing
if (m_bIsFlat == 0) 
return lr;


hParent = ::GetParent(m_hWnd);

if ((::GetCapture() != m_hWnd) &&	(hParent != NULL)) 
{
m_MouseOnButton = 1;
//SetFocus();	// Thanks Ralph!
SetCapture();
Invalidate();
}
else
{
RECT rc;
GetClientRect(&rc);
if (!PtInRect(&rc,point))
{
// Redraw only if mouse goes out
if (m_MouseOnButton == 1)
{
m_MouseOnButton = 0;
Invalidate();
}
// If user is NOT pressing left button then release capture!
if (!(nFlags & MK_LBUTTON)) 
ReleaseCapture();
}
}

return lr;
}
 
Статус
Закрыто для дальнейших ответов.