VCのようなオブジェクトの貼り付け処理について(ツールバーからのコントロール選択)

[戻る]
裕里 2007/02/28(水) 14:44:40
開発環境はVC++2005 MFC-SDI

本当に度々と申し訳ありません。

今回は、VCでいうところのツールボックスから作成するコントロールを
ダイアログに対してドラッグ&ドロップするところを作成しようと思います。

現状は、ツールバーにコントロールの釦を貼り付けて、押下した時に
その情報を確保し、ダイアログでクリックした時点でコントロールの作成を行ってま
す。

これを下記処理に変更したいと思います。
(1)ツールボックスを作成するために、縦型のツールバーを作成する
   (あの処理は、縦型のツールバーではないのですか?)
(2)ツールバーにて、選択したしたコントロールをドラッグする
   このとき、マウスに付随してコントロールの描画を行う。

まず、自分の拙い力で調べながらやってみます。
力不足時は、申し訳ありませんが、お力添え願えないでしょうか。

たいちう 2007/03/01(木) 09:40:03
縦型のツールバーですが、次のどの方法でもできると思います。
多分ダイアログバーが一番近いのではないかと。

・ドッキングツールバー
・ダイアログバー
・CSplitterWnd + CFormView


コントロールのドラッグについては、ドラッグ中はコントロールの
ビットマップを用意してはどうでしょうか?

ダイアログに小さなビットマップを表示して、それをドラッグする
プログラムを試作しましょう。処理の効率や見栄えを二の次にすると、
WM_LBUTTONUP, WM_LBUTTONDOWN, WM_MOUSEMOVEを処理するだけ。

どうしてもコントロールを動かしたい場合は、
試作するのは、ダイアログに貼り付けたボタンを
ドラッグで動かすプログラムになります。

裕里 2007/03/01(木) 10:04:16
たいちうさん。ありがとうございます。

まずは、試作で試してみます。

裕里 2007/03/01(木) 16:52:34
申し訳ありません。ご教授ください。


ダイアログにボタンを貼り付けて、ツールバーのボタンのように
マウスの押下等で凹凸がでるようにはどのようにしたら、よいのでしょうか。



現状、下記のようなスタイルで設定しているのですが・・・・
m_btn_in[i]->Create((LPCTSTR)"",
                    WS_CHILD | BS_FLAT | BS_BITMAP,
          rect,
          this,
          2000+i);

別箇所で
m_bitmap_in[0].LoadBitmap(IDB_BITMAP5);
m_btn_in[0]->SetBitmap(m_bitmap_in[0]);
m_btn_in[0]->ShowWindow(TRUE);

□で囲われた中にビットマップが表示されてます。


すみません。宜しくお願い致します。

たいちう 2007/03/01(木) 17:27:31
押された状態のビットマップを用意するのが簡単では?

裕里 2007/03/01(木) 17:33:37
なるほど・・・・・
やはり、普通にやると難しいですか?

ぬふや 2007/03/01(木) 19:25:03
DrawEdgeなんてAPIが。
http://msdn.microsoft.com/library/ja/jpgdi/html/
_win32_drawedge.asp?frame=true

貯○愛 2007/03/02(金) 11:45:09
ぬふやさんのコメントを参考に、ボタンではなくて、ダイアログに直接ビットマップを
描画して凹凸を出すよう方法にしました。凸はできるのですが、一度凸になると
戻らなくて、少し調査してみます。

ありがとうございました。

貯○愛 2007/03/02(金) 11:46:07
すみません。私も同じようなことをやっていたのでついつい返事しちゃいました。
ごめんなさい。

渋木宏明(ひどり) [HomePage] 2007/03/02(金) 16:38:54
>やはり、普通にやると難しいですか?

Visual Studio はコモンコントロール以外に独自のコントロールを山ほど使っているの
で、MFC に含まれているクラスだけで実現することはできないです。

SundayProgramer 2007/03/02(金) 23:13:15
>ダイアログにボタンを貼り付けて、ツールバーのボタンのように
>マウスの押下等で凹凸がでるようにはどのようにしたら、よいのでしょうか。

思いつくのは、
1.オーナードロー
2.ボタンを作らずにビットマップだけダイアログに貼り付けておいて凹凸を表示する時に輪郭
だけ表示
です。

オーナードローするなら、
m_btn_in[i]->Create(NULL, WS_CHILD | WS_OWNERDRAW | WS_VISIBLE,
          rect,
          this,
          2000+i);

後は、ダイアログの OnMeasureItem と OnDrawItem をオーバーライド
ただし、ビットマップの表示も自分で実装しなくてはいけません。

VC のツールボックスのように、マウスの移動でボタンを膨らますなら2.のが良いと思いま
す。

OnMouseMove で、DrawEdge などをするだけです。

裕里 2007/03/03(土) 01:15:34
[[解決]]
DrawEdgeとInvaltadRectで元に戻せました

古いスレッドには追加発言できません。