VC6 MFCで、SDIアプリケーションを作成しています。
標準ツールバーに「次へ」「前へ」という機能のコマンドを入れてあるのですが、
クリックしないと動作させることができません。
これを押した瞬間に動作させ、さらに
押しっぱなしているときには定期的に動作を繰り返すには
どのような対応をすればよろしいでしょうか。
スクロールバーの「▲」「▼」ボタンのような動作をさせたいのです。
なにかサンプルや資料をご存知のかたはいらっしゃいませんでしょうか。
よろしくお願いいたします。
ちょっと表現が下手だったので追記させていただきます。
「押しっぱなしているときには」というのは、
ツールバーがCCmdUI::SetCheck(1)になっている状態ではなく、
ツールバー上でマウスを押しっぱなしている状態ということです。
よろしくお願いいたします。
押したときにタイマーオン。
離したときにタイマーオフ。
タイマーのイベントでお望みの動作。
で、良いのでは?
ありがとうございます。
> 押したときにタイマーオン。
> 離したときにタイマーオフ。
この「押したとき」「離したとき」というのは、
ツールバーからのメッセージにはありませんよね?
ということは、ツールバークラスを継承して
メッセージを独自に処理するということになるのでしょうか?
MFCツールバークラスの継承などについて
サンプルなどがあれば教えていただけると嬉しいのですが…。
押したときは、普通にツールバーのクリックを拾えばよさげ。
離したときは、どこかでWM_LBUTTONUPを拾うのと、
押したままポインタを動かされるケースのためにWM_MOUSEMOVEで
CToolBarCtrl::GetItemRectと判定すればよいのではないかと。
別に継承は必要ないと思うので、1つずつ実装されてみてはどうでしょう。
> 押したときは、普通にツールバーのクリックを拾えばよさげ。
ごめん。これが離したタイミングで呼ばれるね。忘れてください。
少し試してみて、進展があればまた書きます。
とりあえず、タイミングとボタン内の検出のみ。
もっと良い方法はありそうなので、ご参考までに。
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
static int c;
switch (pMsg->message) {
case WM_LBUTTONDOWN:
if (PtInButton(pMsg->pt))
TRACE(%d : WM_LBUTTONDOWN\n, ++c);
break;
case WM_LBUTTONUP:
if (PtInButton(pMsg->pt))
TRACE(%d : WM_LBUTTONUP\n, ++c);
break;
case WM_MOUSEMOVE:
if (PtInButton(pMsg->pt))
TRACE(%d : WM_MOUSEMOVE\n, ++c);
break;
}
return CFrameWnd::PreTranslateMessage(pMsg);
}
bool CMainFrame::PtInButton(CPoint p) const
{
CRect r;
m_wndToolBar.GetItemRect(8, r);
m_wndToolBar.ClientToScreen(r);
return (bool)r.PtInRect(p);
}
なるほど、ツールバーを持つCMainFrame側で
マウス関連の基本的なメッセージを取ってしまって、
ツールバーには渡さないということなのですね。
やはりツールバー自体には、スクロールバーやスピンボタンのような
押しっぱなし動作は組み込まれていないのですかね…。
解説いただきありがとうございます。
多分ないでしょう。
そのようなツールバーを見たことがありますか?
役に立ちそうな機能が組み込まれていればプログラマは使ってみるでしょうし、
みんなが使いたい機能ならばMSも実装するでしょう。原則として。
亀山さんの要求している設計は、
標準的なWindowsの設計から外れているように思います。
別に悪いことではないですし、必要な時もあるでしょうが、
ある程度の手間は仕方ないと思います。
それと今思いつきましたが、以下のような仕様に変更することが
できれば、標準的な設計に近づき、開発の手間も減ると思います。
(凹んで表示:CToolBarCtrl::SetState)
1回クリックでボタンが凹み、もう一度クリックでボタンが戻る。
凹んでいる間にタイマーで処理する。
> 多分ないでしょう。
> そのようなツールバーを見たことがありますか?
たしかに無いんですけど、そういう要望が来てまして…。
やってることは画面上のスクロールバーと同じような動作で、
それをツールバー上で一括操作できるようにしているので、
そういう動作になってほしい気持ちもわかるのですが…。
> 1回クリックでボタンが凹み、もう一度クリックでボタンが戻る。
> 凹んでいる間にタイマーで処理する。
スクロールバーの操作とはちょっと違ってしまいますが、
この動作だと標準のツールバーの機能だけで実現できそうですね。
ちょっと確認してみたいと思います。
ありがとうございます。