小弟初学VC, 请高手用代码来解释. 谢谢!

解决方案 »

  1.   

    这个是标准的窗口消息里都会有的,右击窗口类,然后选择“Add windows message handler..”然后添加相应的消息就可以了,
    WM_LBUTTONUP
    WM_LBUTTONDOWN 
    ....
    ...
      

  2.   

    处理lbuttondown,lbuttonup消息。
    具体的代码,你还是看看书吧。
      

  3.   

    switch (msg)
    {

    case WM_LBUTTONDOWN: // 
    {
    break;
    }
    case WM_LBUTTONUP: // 
    {
    break;
    } }
      

  4.   

    我的意思是: 当鼠标左键一直按住某个BUTTON控键时, 要不挺的执行一个处理,知道鼠标左键抬起.那这个处理能加到WM_LBUTTONDOWN和WM_LBUTTONUP事件里吗?
      

  5.   

    onLbuttondown()
    {
    while(true)
    {
       function();执行处理
    }
    }
      

  6.   

    对话框/视图里面的WM_LBUTTONDOWN和WM_LBUTTONUP是作用不到按钮上的,那仅且对当前所指m_hwnd有效.
    方法:
    一.用DADA_dotnet说的先getmessage,然后switch处理.
    二.新建类CMyButton,派生CButton,添加WM_LBUTTONDOWN和WM_LBUTTONUP消息,就可以处理了.这个简单
      

  7.   

    TO showxier: 派生CButton,添加WM_LBUTTONDOWN和WM_LBUTTONUP消息,就可以处理了
    那么在WM_LBUTTONDOWN和WM_LBUTTONUP事件中怎样判断按下和抬起的是我的目标按钮呢? 也就是怎样关联我要检测的目标BUTTON?
      

  8.   

    TO showxier: 派生CButton,添加WM_LBUTTONDOWN和WM_LBUTTONUP消息,就可以处理了
    那么在WM_LBUTTONDOWN和WM_LBUTTONUP事件中怎样判断按下和抬起的是我的目标按钮呢? 也就是怎样关联我要检测的目标BUTTON?====================================
    你添加事件的对象是那个CButton 而不是CDialog CWnd CView ==
      

  9.   

    派生你自己的Button类。在你的派生类里面处理WM_LBUTTONDOWN,WM_LBUTTONUP消息
    就这样。OK
    呵呵
      

  10.   

    有道理,用settimer和killtimer就行了,不过说不应该用按钮,是不是有什么特别的原因呢,不解
      

  11.   

    派生自己的CBUTTON类,定义你的派生类的对象,
      

  12.   

    to m_sean():
    按钮是通过点击触发事件的,而楼住的意思是按下触发事件。这样一来,点击事件就没有意义了,而且还需要重载按钮类。所以我觉得,这种控制没必要用按钮。
      

  13.   

    用你所派生的类 增加OnTimer,使用定时器检查按钮的状态,不过一直是按下状态就执行指定的操作。
      

  14.   

    有两种方法,希望对你有所帮助,尤其是第二种方法:
    1、添加派生CButton类,然后在派生类中,添加Add windows message handler,选择WM_LBUTTONDOWN和WM_LBUTTONUP消息,然后就可以添加自己的处理代码了。(楼上不少人都提到了,我又不详细说了)2、在对话框类中,添加Add windows message handler,选择WM_InitDialog,然后找到BOOL CTestDlg::OnInitDialog(),添加如下代码(在后面代码中),主要是为了调用重新写过的窗口过程。在BOOL CTestDlg::OnInitDialog()前面,添加窗口过程LRESULT CALLBACK WinSunProc,可以参照windowclass的成员函数来写,所有代码如下:
     
    WNDPROC prevProc;//定义窗口过程变量,用于存储原本的窗口过程
    LRESULT CALLBACK WinSunProc(//新的窗口过程函数
      HWND hwnd,      // handle to window
      UINT uMsg,      // message identifier
      WPARAM wParam,  // first message parameter
      LPARAM lParam   // second message parameter
    )
    {
    if(uMsg==WM_LBUTTONUP)//捕获鼠标抬起的操作
    {
    ::MessageBox(hwnd,"1","2",MB_OK);//可添加自己的处理代码
    return 1;
    }
    else if(uMsg==WM_LBUTTONDOWN)//捕获鼠标按下操作,
    {
    ::MessageBox(hwnd,"3","4",MB_OK););//可添加自己的处理代码
    return 1;
    }
    else
    {
    return prevProc(hwnd,uMsg,wParam,lParam);//如果不是需要捕获的消息,则调用默认的窗口过程
    }
    }
    BOOL CTestDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_BUTTON1)->m_hWnd,GWL_WNDPROC,
    (LONG)WinSunProc);
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }
      

  15.   

    咋就这么麻烦呢?
     什么程序??
    MFC自动生成的对话框么???
    如果是的话..就重载虚函数pretranslatMessage()判断下谁获得焦点,读取鼠标消息做自
    己的事情..~~ 到是我觉得你这个一直不停的处理让人觉得很奇怪...很可能出问题..
    这个处理是什么 一个函数么?? 多长?? 代码什么样的?
      

  16.   

    MFC中的CRectTrack的Track(...)Fuction就是用这个思想去实现的,详细代码:BOOL CRule::Track(CWnd* pWnd, const CPoint &point)
    {
    if (pWnd == NULL)
    return FALSE; if (::GetCapture() != NULL)
    return FALSE; AfxLockTempMaps();  // protect maps while looping
    // set capture to the window which received this message
    pWnd->SetCapture();
    ASSERT(pWnd == CWnd::GetCapture());
    pWnd->UpdateWindow(); // get messages until capture lost or cancelled/accepted
    for (;;)
    {
    MSG msg;
    VERIFY(::GetMessage(&msg, NULL, 0, 0)); if (CWnd::GetCapture() != pWnd)
    break; switch (msg.message)
    {
    // handle movement/accept messages
    case WM_LBUTTONUP:
    {
    goto ExitLoop;
    }
    break;
    }
                      ...
    }

    ExitLoop:
    ReleaseCapture();
    AfxUnlockTempMaps(FALSE);
    return TRUE;
    }