// 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 }
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; } ... }
WM_LBUTTONUP
WM_LBUTTONDOWN
....
...
具体的代码,你还是看看书吧。
{
case WM_LBUTTONDOWN: //
{
break;
}
case WM_LBUTTONUP: //
{
break;
} }
{
while(true)
{
function();执行处理
}
}
方法:
一.用DADA_dotnet说的先getmessage,然后switch处理.
二.新建类CMyButton,派生CButton,添加WM_LBUTTONDOWN和WM_LBUTTONUP消息,就可以处理了.这个简单
那么在WM_LBUTTONDOWN和WM_LBUTTONUP事件中怎样判断按下和抬起的是我的目标按钮呢? 也就是怎样关联我要检测的目标BUTTON?
那么在WM_LBUTTONDOWN和WM_LBUTTONUP事件中怎样判断按下和抬起的是我的目标按钮呢? 也就是怎样关联我要检测的目标BUTTON?====================================
你添加事件的对象是那个CButton 而不是CDialog CWnd CView ==
就这样。OK
呵呵
按钮是通过点击触发事件的,而楼住的意思是按下触发事件。这样一来,点击事件就没有意义了,而且还需要重载按钮类。所以我觉得,这种控制没必要用按钮。
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
}
什么程序??
MFC自动生成的对话框么???
如果是的话..就重载虚函数pretranslatMessage()判断下谁获得焦点,读取鼠标消息做自
己的事情..~~ 到是我觉得你这个一直不停的处理让人觉得很奇怪...很可能出问题..
这个处理是什么 一个函数么?? 多长?? 代码什么样的?
{
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;
}