ツールバーを押しっぱなしに対応させたい – プログラミング – Home

ツールバーを押しっぱなしに対応させたい
 
通知
すべてクリア

ツールバーを押しっぱなしに対応させたい


亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

VC6 MFCで、SDIアプリケーションを作成しています。
標準ツールバーに「次へ」「前へ」という機能のコマンドを入れてあるのですが、
クリックしないと動作させることができません。

これを押した瞬間に動作させ、さらに
押しっぱなしているときには定期的に動作を繰り返すには
どのような対応をすればよろしいでしょうか。
スクロールバーの「▲」「▼」ボタンのような動作をさせたいのです。
なにかサンプルや資料をご存知のかたはいらっしゃいませんでしょうか。
よろしくお願いいたします。


引用解決済
トピックタグ
亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

ちょっと表現が下手だったので追記させていただきます。

「押しっぱなしているときには」というのは、
ツールバーがCCmdUI::SetCheck(1)になっている状態ではなく、
ツールバー上でマウスを押しっぱなしている状態ということです。
よろしくお願いいたします。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

押したときにタイマーオン。
離したときにタイマーオフ。
タイマーのイベントでお望みの動作。

で、良いのでは?


返信引用
亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

ありがとうございます。

> 押したときにタイマーオン。
> 離したときにタイマーオフ。

この「押したとき」「離したとき」というのは、
ツールバーからのメッセージにはありませんよね?
ということは、ツールバークラスを継承して
メッセージを独自に処理するということになるのでしょうか?

MFCツールバークラスの継承などについて
サンプルなどがあれば教えていただけると嬉しいのですが…。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

押したときは、普通にツールバーのクリックを拾えばよさげ。
離したときは、どこかでWM_LBUTTONUPを拾うのと、
押したままポインタを動かされるケースのためにWM_MOUSEMOVEで
CToolBarCtrl::GetItemRectと判定すればよいのではないかと。

別に継承は必要ないと思うので、1つずつ実装されてみてはどうでしょう。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> 押したときは、普通にツールバーのクリックを拾えばよさげ。

ごめん。これが離したタイミングで呼ばれるね。忘れてください。
少し試してみて、進展があればまた書きます。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

とりあえず、タイミングとボタン内の検出のみ。
もっと良い方法はありそうなので、ご参考までに。

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);
}


返信引用
亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

なるほど、ツールバーを持つCMainFrame側で
マウス関連の基本的なメッセージを取ってしまって、
ツールバーには渡さないということなのですね。

やはりツールバー自体には、スクロールバーやスピンボタンのような
押しっぱなし動作は組み込まれていないのですかね…。
解説いただきありがとうございます。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

多分ないでしょう。
そのようなツールバーを見たことがありますか?
役に立ちそうな機能が組み込まれていればプログラマは使ってみるでしょうし、
みんなが使いたい機能ならばMSも実装するでしょう。原則として。

亀山さんの要求している設計は、
標準的なWindowsの設計から外れているように思います。
別に悪いことではないですし、必要な時もあるでしょうが、
ある程度の手間は仕方ないと思います。

それと今思いつきましたが、以下のような仕様に変更することが
できれば、標準的な設計に近づき、開発の手間も減ると思います。
(凹んで表示:CToolBarCtrl::SetState)

1回クリックでボタンが凹み、もう一度クリックでボタンが戻る。
凹んでいる間にタイマーで処理する。


返信引用
亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

> 多分ないでしょう。
> そのようなツールバーを見たことがありますか?

たしかに無いんですけど、そういう要望が来てまして…。
やってることは画面上のスクロールバーと同じような動作で、
それをツールバー上で一括操作できるようにしているので、
そういう動作になってほしい気持ちもわかるのですが…。

> 1回クリックでボタンが凹み、もう一度クリックでボタンが戻る。
> 凹んでいる間にタイマーで処理する。

スクロールバーの操作とはちょっと違ってしまいますが、
この動作だと標準のツールバーの機能だけで実現できそうですね。
ちょっと確認してみたいと思います。
ありがとうございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました