Cbutton и Drawitem

Тема в разделе "MS Visual C++", создана пользователем LordNet, 3 дек 2006.

Статус темы:
Закрыта.
  1. LordNet

    LordNet Гость

    Репутация:
    0
    Помогите сделать правильно флат кнопку.

    Вот я унаследовал свой класс от 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);
    }


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

    zubr Гость

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

    LordNet Гость

    Репутация:
    0
    if(lpDrawItemStruct->itemState & ODS_HOTLIGHT) - Не помогает
    if(lpDrawItemStruct->itemState & BN_HILITE|BN_UNHILITE) - Происходит тока при нажатий.

    Или я не правильно тебя понял?
     
  4. zubr

    zubr Гость

    Репутация:
    0
    Извини, забыл уточнить - класс кнопок должен быть CBitmapButton, а стиль BS_OWNERDRAW.
    Полная лажа, 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;
    }
     
Загрузка...
Похожие Темы - Cbutton Drawitem
  1. Dock1100
    Ответов:
    2
    Просмотров:
    2.522
Статус темы:
Закрыта.

Поделиться этой страницей