掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
タブコントロールにドロップするには? (ID:55340)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>> しかしながら、サブクラス化したエリアでドロップしても、 >>「WM_DROPFILES」が表示されることはありませんでした。 WNDCLASS wc; wc.lpfnWndProc = NewProc; こういった部分も複数あると思いますが、 間違いないですよね。 各ウィンドウプロシジャにWM_LBUTTONDOWN など、入れてみて 関数名とウィンドウ名を表示 (OutputDebugString():下記)してみては どうでしょう。 クリックした場所に対応するメッセージが出ているかどうか。 WM_LBUTTONDOWN も WM_DROPFILES と同じ運命になっていたら、 ウィンドウプロシジャの差し違いかもしれない。 ////////////////////////////////////////////////// http://www.kumei.ne.jp/c_lang/sdk/sdk_67.htm こんなのありましたが。(^^;; ////////////////////////////////////////////////// >> MFCは扱ったことがありませんので、 そうだったのですか。 MFC は遅いとか、XXXXだとかいろいろうわさがあるため、 あえて、避けられているのかと思いましたが。 MFC を知っているなら、VB並(言い過ぎ?)に目的のものがさっと作れる 非常に開発効率のよいものと思っています。 大きなプログラムの一部を切り出してテストするにはもってこいの方法です。 MSも日々精進を重ねていますしね。 悪い噂はバグをコンパイラやライブラリのせいにする人から始まると 思っています。 >> プログラムとして一部なのでしょうけど ここで避けたらこんなおいしいツールをみすみす逃すことになります。 他の部分は全て AppWizardが書いてくれたのです。「生成」とは そういう意味で「作成」とは違います。 だから簡単なのです。 手順を説明しますね。 まず、VC++ を起動します。 [ファイル][新規作成][MFC AppWizard(exe)] [プロジェクト名]:名前を入れる [位置]: いつもの場所。 [OK] [ダイアログベース] (ラジオボタン)を押す [次へ] [次へ] [次へ] [終了] [OK] ここでダイアログエディタになるので、 ボタンを一個配置します。 [Button1] 配置したこのボタンをダブルクリックします。 [OnButton1] <- 名前が気に入らなければ変えてください。 [OK] を押す。 とすると void CExDlg::OnButton1() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください } が表示されます。 ここに私のコードを貼り付けます。 "あなたのアプリのウィンドウタイトル" を書き換えます。 そしてコンパイル[F7] そして実行[F5] 以上です。 何秒でできましたか。 さらに上記でダイアログエディタが表示されたところで、 [ClassView]選択。 CXXXXDlg を右クリック。 [Windows メッセージハンドラの追加] [〜メッセージ用フィルタ] を"ウィンドウ"に WM_DROPFILES をダブルクリック。 [既存の編集] これであなたの当初の目的に大分近づいていませんか? ちなみに当方で MFC で追認しても WM_DROPFILES ハンドラ、 OnDropFiles() に来ないという現象には遭遇しなかったのです。 MFC では間違いやすい部分、決り文句な部分、といったことをWizard等の 開発環境がある程度サポートしてくれるので、本質的なところに集中できます。 昔は決まり文句部分を雛型ソースとして管理していたものですが、 その必要もなくなりました。いまでは、OnButton1の中身のような貼り付け コードチップのライブラリをIISで管理している形で...。 >> マウスの変化からAcceptは成功しているので ちょっと説明が足りなかったのですが、 Accept していないウィンドウにもメッセージ WM_DROPFILES が届くという ということです。 Accept の可否に関わらず 自前のウィンドウプロシジャが WM_DROPFILES を 受け取るかどうかを確かめられますよね。 で OnButton1() をちょっと改造して、 アプリの子ウィンドウに SendMessage() するようにしてやれば TABコントロールなどもテストできます。 --------- if 文の中でさらに for( pWnd = pWnd->GetTopWindow(); pWnd; pWnd = pWnd->GetNextWindow( GW_HWNDNEXT )) 再帰すればいいですか。 --------- あと MessageBox のかわりに OutputDebugString() を使ってみませんか。 これは DevStudio のデバッグ窓に出力するものです。 いちいち OK を押さずにすみますよ。 P.S 余談です。 WM_DROPFILES はファイルしかドロップできませんよね。 IE のリンクをドラッグ&ドロップしたり、 VC++ のエディタのように選択したテキストをドラッグ&ドロップしたり。 これには IDropTarget なるクラスを使用します。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.