開発環境
Win2000 VC++6.0 SP5 MFC使用
いつもお世話になっております。
以下の件の続きなんですけど
上手くいきません。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200205/02050023.txt
当時は、プッシュボタン(IDC_BUTTON1)のDown-Up間で
ダイアログ上のボタンを外れても
CButtonExのOnLButtonUp();
に飛んできた記憶がありますが、
原因はわかりませんがOnLButtonUp();に
飛んでこなくなりました。
よって以下のように変更しました。
CSampleDlg* Dlg; //追加
class CButtonEx : public CButton
{
UINT m_uTimerID;
}
void CButtonEx::OnTimer(UINT nIDEvent)
{
if( m_uTimerID == nIDEvent )
{
a++;
m_uTimerID = SetTimer(TIMER_ID, TIMER_5000MS, NULL);
}
CButton::OnTimer(nIDEvent);
}
void CButtonEx::OnLButtonDown(UINT nFlags, CPoint point)
{
Dlg->m_button.SetCapture(); //追加
m_uTimerID = SetTimer(TIMER_ID, TIMER_5000MS, NULL);
CButton::OnLButtonDown(nFlags, point);
}
void CButtonEx::OnLButtonUp(UINT nFlags, CPoint point)
{
KillTimer(m_uTimerID);
ReleaseCapture(); //追加
CButton::OnLButtonUp(nFlags, point);
}
プッシュボタンに対してSetCapTureを
使いましたが、プッシュボタンの外で
マウスの左ボタンを離しても
void CButtonEx::OnLButtonUp(UINT nFlags, CPoint point)
に飛んできません。
何か良い方法がありましたら
アドバイスお願いします。
>当時は、プッシュボタン(IDC_BUTTON1)のDown-Up間で
>ダイアログ上のボタンを外れても
>CButtonExのOnLButtonUp();
>に飛んできた記憶がありますが、
>原因はわかりませんがOnLButtonUp();に
>飛んでこなくなりました。
当時と比較してみましょう・・
>Dlg->m_button.SetCapture(); //追加
これは、
SetCapture(); //追加
で良いのでは?
この質問からだと、ここまでの回答しか浮かびません・・
問題は、このコード以外の所にありそうですね・・
私の記憶では真っ当にコードを書いていれば、
キャプチャしていない状態ではボタンアップ時に
ボタンから外れるとボタンアップは飛んでこないはずです。
むしろ、飛んできていた状態の方がおかしかったのでは
と思います。その辺はボタン以外のところにもあるような
気がしますけれど。
> 私の記憶では真っ当にコードを書いていれば、
> キャプチャしていない状態ではボタンアップ時に
> ボタンから外れるとボタンアップは飛んでこないはずです。
ボタンは内部でSetCaptureとReleaseCaptureしていますので、
領域から外れていても、WM_LBUTTONUPは飛んできます。
ただし、Alt+Tabなどでキャプチャを強引にはずすことが出来るので、
WM_LBUTTONUPには期待せず、WM_CAPTURECHANGEDで処理するほうがよいでしょう。
不良PGさん、PATIO さん、dairygoods さん
アドバイス有難うございます。
Upメッセージが飛んでくるようになりました。
CSampleDlg.cppで、ボタンを常に1秒周期で無効→有効
を繰り返していた為、無効になった時に
マウスキャップチャーが外されてたようです。
ボタンを無効にするステップを外したら
再びUpメッセージが飛んでくるようになりました。
>ボタンは内部でSetCaptureとReleaseCaptureしていますので、
>領域から外れていても、WM_LBUTTONUPは飛んできます。
なるほど。
>ただし、Alt+Tabなどでキャプチャを強引にはずすことが出来るので、
>WM_LBUTTONUPには期待せず、WM_CAPTURECHANGEDで処理するほうがよいでしょう
時間があれば試してみようと思います。