Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Создал CScrollBar на собственном контроле..


Автор: The Thing 8.7.2006, 12:37
создаю на собственнонаписаном контроле CScrollBar. Он создается, но не реагирует на нажатия мыши! smile

Код

    if(result){
        RECT rc;
                                ...
        m_scrollbar.Create(WS_VISIBLE|WS_CHILD, rc, pWnd, 2001);

    }


Я так подразумеваю, что моему контролу, просто-на-просто не передаются сообщения от View.
Наверное вопрос должен звычать следующим образом:

Как передать сообщения моему контролу? 

Автор: The Thing 8.7.2006, 15:39
Проблема еще в том, что мой контрол наследуется от CWnd и крепится к SDI Документу;
т.е.

Код

CKadr::CKadr()
{
    VERIFY(RegisterWindowClass());
}

BOOL CKadr::RegisterWindowClass()
{
  WNDCLASS wndcls;
  HINSTANCE hInst = AfxGetInstanceHandle();

  if (!(::GetClassInfo(hInst, _T("KADR"), &wndcls)))
  {
    wndcls.style            = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
    wndcls.lpfnWndProc      = ::DefWindowProc;
    wndcls.cbClsExtra       = wndcls.cbWndExtra = 0;
    wndcls.hInstance        = hInst;
    wndcls.hIcon            = NULL;
    wndcls.hCursor          = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
    wndcls.hbrBackground    = (HBRUSH) (COLOR_3DFACE + 1);
    wndcls.lpszMenuName     = NULL;
    wndcls.lpszClassName    = _T("KADR");

    if (!AfxRegisterClass(&wndcls))
    {
      AfxThrowResourceException();
      return FALSE;
    }
  }

  return TRUE;
}

BOOL CKadr::Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
    SetSizeControl(rect);

    CWnd* pWnd = this;
    BOOL result = pWnd->Create(_T("KADR"), lpszWindowName, dwStyle, rect, pParentWnd, nID);

    if(result){
        static RECT rc;
        m_scrollbar.Create(WS_VISIBLE|WS_CHILD, rc, pWnd, 2001);

    }


    return result;
}


Код

BOOL CTestView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
    // TODO: Add your specialized code here and/or call the base class
    
    BOOL result = CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);

    if(result){
        m_control.Create("KadrView", WS_VISIBLE|WS_CHILD, rect, this->GetOwner(), 2000);
...


Может я чего не так делаю?.. посмотрите плз. Может стиль какой не указал?. или еще что-нить 

Автор: The Thing 8.7.2006, 16:41
Вот тут можно поймать все мои сообщения..
Код

void CMainFrame::OnParentNotify(UINT message, LPARAM lParam)
{
    CFrameWnd::OnParentNotify(message, lParam);
    
    CTestView *pView = (CTestView*) GetActiveView();
    if(!pView) return;
    
    if(message = 2000){
        pView->SendNotifyMyCtrl(message, lParam);
    }
}

...

void CTestView::Start(UINT mess, LPARAM lParam)
{
                //а вот тут надо передать моему контролу.. 
    m_control.SendNotifyMessage(WM_NOTIFY, WPARAM(mess), lParam);
}


Я не силен с сообщениями.. пока не получается, например отреагировать скролбару на мое сообщение.
Кто может помочь.. -помогите! 

Автор: The Thing 8.7.2006, 17:20
Немного подправив методы уже отлавливаю нажатие клавиши мышей... но Скрол также не работает! smile


Код

void CMainFrame::OnParentNotify(UINT message, LPARAM lParam)
{
    CFrameWnd::OnParentNotify(message, lParam);
    
    CTestView *pView = (CTestView*) GetActiveView();
    if(!pView) return;
    
    pView->SendNotifyMyControl(lParam, message);    

}


void CTestView::SendNotifyMyControl(UINT mess, LPARAM lParam)
{
        m_control.SendMessage(lParam, mess, LPARAM(0));
}
 

Автор: The Thing 8.7.2006, 23:38
Все...  разобрался.. Я не правильно создал контрол..получилось сам от себя, что-ли. 
BOOL CKadr::Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
    SetSizeControl(rect);

/*
CWnd* pWnd = this;
    BOOL result = pWnd->Create(_T("KADR"), lpszWindowName, dwStyle, rect, pParentWnd, nID);
*/

    BOOL result = CWnd::Create(_T("KADR"), lpszWindowName, dwStyle, rect, pParentWnd, nID);
...
} 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)