case WM_VSCROLL:
switch (LOWORD(wParam))
{
case SB_LINEDOWN:
//請注意此處
MessageBox(hwnd, TEXT("linedown"), TEXT("scrollwindow"), MB_OK);
break;
default:
break;
}
這是處理WM_VSCROLL訊息的一段代碼,在上面有個MessageBox函式,我用來觀察我滑鼠對滑動條進行的操作程序,但是我發現一個問題,那就是我滑鼠點擊一下下移滑塊的按鈕后再松開,只要滑鼠放在那個位置沒移走,就會一直彈出提示視窗,這點不解是為什么?
uj5u.com熱心網友回復:
沒看懂!!!!!!!!!uj5u.com熱心網友回復:
MessageBox 改afxDump << "linedown\n";
uj5u.com熱心網友回復:
我想知道不把MessageBox 改為afxDump << "linedown\n"; 為什么當松開了滑鼠左鍵,只要游標一移動到圖中滾動條下的小箭頭上就會不停的彈出視窗?uj5u.com熱心網友回復:
不要用MessageBox看日志.使用OutputDebugString , 除錯模式, 日志就會輸出到"輸出"視窗, 非除錯模式運行,就可以使用debugview來看
uj5u.com熱心網友回復:
/*The WM_CANCELMODE message is sent to cancel certain modes, such as mouse capture.
For example, the system sends this message to the active window
when a dialog box or message box is displayed.
Certain functions also send this message explicitly to the specified window
regardless of whether it is the active window.
For example, the EnableWindow function sends this message
when disabling the specified window.
Default Action
The DefWindowProc function cancels internal processing of standard scroll bar input,
cancels internal menu processing,
and releases the mouse capture.
*/
MessageBox 是個 模態對話框,會影響 訊息。請 小心使用
你也可以 回應 WM_CANCELMODE
uj5u.com熱心網友回復:
case WM_CANCELMODE:
// IMPORTANT MESSAGE! WM_CANCELMODE means that a
// dialog or some other modal process has started.
// we must make sure that we cancel any clicked state
// we are in, kill the timers, and release the capture.
StateClear(dwSpinnerState, SPINNERSTATE_CLICKED);
if (bArrowTimed)
{
SendMessage (hParent, WM_VSCROLL, MAKELONG(SB_ENDSCROLL,
GetWindowLong (hArrow, GWL_ID)), (LONG) hArrow);
KillTimer (hArrow, GetWindowLong (hArrow, GWL_ID));
bArrowTimed = FALSE;
}
ReleaseCapture();
break;
uj5u.com熱心網友回復:
謝謝大家的熱心回答uj5u.com熱心網友回復:
設一下焦點試試。uj5u.com熱心網友回復:
請問:bArrowTimed hParent hArrow 這三歌變數是什么意思? StateClear(dwSpinnerState, SPINNERSTATE_CLICKED); 這個函式我也看不懂?求解釋萬分感謝
uj5u.com熱心網友回復:
只是一個例子#define StateClear(dwState, wFlags) (dwState &= ~(wFlags))
#define SPINNERSTATE_CLICKED (SPINNERSTATE_UPCLICK | SPINNERSTATE_DOWNCLICK)
對 CListCtrl 你 找不到Timer 所以 KillTimer 不行,光 ReleaseCapture(); 沒用。
結論是 在 WM_VSCROLL 中不要 彈出 模態 對話框 !
uj5u.com熱心網友回復:
好訊息, 定時器的 ID 找到了void CBmp45Dlg::OnCancelMode ()
{// 65534 timer ID of dlg's sb
KillTimer(65534);// 對話框 滾動條的 定時器
ClipCursor(NULL);
ReleaseCapture();
afxDump << "OnCancelMode\n";
}
uj5u.com熱心網友回復:
win32 同樣可用case WM_CANCELMODE:
KillTimer(hwnd,65534);// timer of win's sb
ClipCursor(0);
ReleaseCapture();
return 0 ;
case WM_VSCROLL:
。。。
case SB_LINEDOWN:
MessageBox(hwnd,"xixi","haha",MB_OK);
si.nPos += 1 ;
break ;
uj5u.com熱心網友回復:
按照你的代碼,messagebox不再無限彈出,csdn高人輩出,想再請問你個問題,為什么有了KillTimer(hwnd,65534);這個函式,messagebox就不彈出了,其中的原理是什么,還請能幫忙解答一下,越詳細越好,萬分感謝!
uj5u.com熱心網友回復:
那個定時器 例子如下
VOID ArrowTimerProc(HWND hArrow, UINT wMsg, UINT nID, DWORD dwTime)
{
WORD wScroll;
DWORD dwSpinnerState;
// GWL_USERDATA =https://bbs.csdn.net/topics/-21
dwSpinnerState = (DWORD) GetWindowLong (hArrow, GWL_SPINNERSTATE);
if (StateTest(dwSpinnerState, SPINNERSTATE_CLICKED))
{// DOWNCLICK makes SB_LINEUP
wScroll = (StateTest(dwSpinnerState,
SPINNERSTATE_DOWNCLICK)) ? SB_LINEDOWN : SB_LINEUP;
if (uRightBt == WM_RBUTTONDOWN) wScroll += SB_PAGEUP - SB_LINEUP;
{
SendMessage(hArrow,WM_VSCROLL,MAKELONG(wScroll,GetWindowLong(hArrow, GWL_ID)),
(LONG) hArrow);
}
}
// Don't need to call KillTimer(), because SetTimer will reset the right one
// SetTimer(hWnd,nID, 50, (TIMERPROC) ArrowTimerProc);
return ;
}
其中 SendMessage(hArrow, WM_VSCROLL 使得 MessageBox 又彈出。
uj5u.com熱心網友回復:
參考 vc6 幫助中的 CPARROW.Cuj5u.com熱心網友回復:


非常感謝你的幫助,我用spy++發現個有趣的問題,以上代碼如果沒有 KillTimer(hwnd,65534);這句,當我將滑鼠移到滾動條底部箭頭上并且一直按住滑鼠不松開,系統就會一直發送如圖所示的wm_timer訊息,滾動潭訓一直向下滾動,如果加上KillTimer(hwnd,65534);這句即便我一直按住滑鼠不松開,滾動條只會滾動一次就不會滾動了,我感覺問題的解決就是wm_timer訊息上,而且核心在定時器訊息的回呼函式tmprc上,你知道圖中tmprc664e09d0這個地址的函式名是什么嗎?另外我現在用的是vs2015不用vc6.0,你給我的那個例子我查不到。
uj5u.com熱心網友回復:
14樓的 代碼 就是 從 CPARROW.C 來。不過 他的
SetTimer(hWnd,nID, 50, (TIMERPROC) ArrowTimerProc);
nID 是 控制元件 ID ,不是 65534 (-1)。
uj5u.com熱心網友回復:
看win32核心編程uj5u.com熱心網友回復:
1 messagebox彈出是 視窗 得到一個 OnCancelMode () 訊息
2 滾動條· 有 一個 定時器 要 kill
KillTimer(65534);// timer of dlg's sb
uj5u.com熱心網友回復:
你讓彈的,系統肯定乖乖的彈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/73829.html
標籤:界面
