Cbutton и Drawitem

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

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

    LordNet Гость

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

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

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

    LordNet Гость

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

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

    zubr Гость

    Извини, забыл уточнить - класс кнопок должен быть CBitmapButton, а стиль BS_OWNERDRAW.
    Полная лажа, BN_HILITE и BN_UNHILITE - это код сообщения Windows WM_NOTIFY
    Для CButton придется отлавливать сообщение WM_MOUSEMOVE, что нибудь типа этого:
    Код (Text):
    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.442
Статус темы:
Закрыта.

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