对话框中有一个 滑块控件, 一个VIEW(嵌入)……想实现滑动滑块view里的图片缩放显示。滑块控件自身是响应方向键的事件的,通过方向键能滑动。但是点击view之后,再按方向键,滑块不滑动。想在对话框中响应 OnKeyDown事件,达到理想效果。但不知道OnKeyDown函数的具体实现。滑块滑动事件实现如下:
void CMyDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_nZoom = m_Slider.GetPos(); m_pView->m_nZoom = m_nZoom; //m_pView为对话框中的view的指针
m_pView->OnUpdate(NULL, 0, NULL);
m_pView->Invalidate(); CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

解决方案 »

  1.   

    添加wm_keydowm的消息函数 Onkeydown()
    消息触发时候
    m_nZoom 减少一定的比例
    就可以了
      

  2.   

    重写虚函数PreTranslateMessage(),处理WM_KEDOWN消息
    BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
    {
     if(WM_KEYDOWN == pMsg->message)
     {
      // ...
     }
     return CDialog::PreTranslateMessage(pMsg);
    }
      

  3.   

    顶楼上,对话框默认不响应OnKeyDown,解决办法即对PreTranslateMessage作特殊处理之,BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
    {
     if(WM_KEYDOWN == pMsg->message)
     {
        SendMessage(WM_KEYDOWN,pMsg->wParam,pMsg->lParam);
        return TRUE;
     }
     return CDialog::PreTranslateMessage(pMsg);
    }这样OnKeyDown消息就能响应了!
      

  4.   

    想请问VisualEleven,我把SendMessage改成PostMessage不行,原因是什么呢?
      

  5.   

    以上PreTranslateMessage()和Onkeydown()我就是这么用的,但是怎么在Onkeydown里实现OnHScroll一样的功能呢?即怎么让让Onkeydown控制滑块的移动和m_nZoom 的变化?
      

  6.   


    现在的关键是:点击VIEW之后,滑块就不再响应方向键的事件了。是不是因为 点击VIEW之后,焦点已经从窗口转到VIEW里了,所以即使在窗口中实现PreTranslateMessage()和Onkeydown(),也得不到响应?如果从在VIEW中的Onkeydown,向窗口发WM_KEYDOWN消息
    是不是能实现点击VIWE之后,窗口依然能响应WM_KEYDOWN事件呢?
      

  7.   

    上面我自己的回帖中提到的发消息好像不行。我在VIEW里重载了PreTranslateMessage()和Onkeydown,
    在view的Onkeydown向窗口发消息,但dialog好像没接收到。
    extern HWND g_Hwnd; //g_Hwnd是在 dialog的OnInitDialog中通过GetSafeHwnd得到的。
    void CMyViewEx::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    ::SendMessage(g_PreHwnd, WM_KEYDOWN,(WPARAM)0,(LPARAM)0); CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
    }BOOL CMyViewEx::PreTranslateMessage(MSG* pMsg)
    {
    if (pMsg->message == WM_KEYDOWN)
    {
    OnKeyDown((UINT)pMsg->wParam, (UINT)pMsg->lParam, (UINT)pMsg->lParam);
    return TRUE;
    } return CScrollView::PreTranslateMessage(pMsg);
    }
    注意【view是嵌在dialog里的,不是MFC生成的 文档/视图 结构中的视图,】
    【此处的CMyViewEx 是我自定义的继承CScrollView】现在这是头疼呀……问题重述一遍:
    在对话框dialog中嵌入一个view,在view上显示图片; 通过dialog中的滑块滚动,设定view中显示内容的缩放。滑块的位置是在dialog中的OnHScroll事件中通过 GetPos得到的。问题就是,点击view之后,再按方向键,滑块不会滚动。如何在点击VIEW之后再按方向键,滑块依然滚动呢?就像在dialog中按方向键一样。
      

  8.   

    重写 TranslateMessage  虚函数也是可以的,跟重写PreTranslateMessage是一样的