掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
タブコントロールにドロップするには? (ID:55342)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>> メインウインドウはCreateDialog()で作成しておりまして、処理の追加等以外は >> http://home.a03.itscom.net/tsuzu/programing/tips28.htm >> とほぼ同じものと考えて頂ければよろしいのですけど・・ そのままトレースしてみますね。 IDD_DIALOG を "IDD_DIALOG" に... ダイアログのドラッグ&ドロップを許可すると DlgProc() には WM_DROPFILESは来る。 しかし、ダイアログ全体では受け取りたくない。 IDD_DIALOG_SHEET_1/2 だけで WM_DROPFILES を受け取りたい。 これら2つだけにドラッグ&ドロップを許可。 マウスがドロップ許可状態にならない。 TAB コントロールにも許可を与えると、 ドロップ可能にはなる。 ところが、 TabSheetProc() に WM_DROPFILES は来ない。 という状況まで確認。 // タブコントロールのシート上に貼り付ける子ダイアログを生成 // 親ハンドルにはhDlg(hTabCtrlでない)を指定するのがミソ と書いてあるが、あえて、g_hTabCtrl を指定すると、 WM_DROPFILES が TabSheetProc() に来ますね。 でも子ダイアログがタブコントロールをはみだしてしまっています(私の場合)。 このへん RECT の計算を修正するとよろしいか。 では、今まで WM_DROPFILES はどこへいっていたのか。 上の変更を元に戻します。 g_hTabCtrl = GetDlgItem(hDlg, IDC_TAB); があるので g_hTabCtrl をサブクラス化して TabProc(...)を追加 してみましょう。 WNDPROC g_prgTabOrgProc; DlgProc() { switch() case WM_INITDIALOG: g_hTabCtrl = GetDlgItem(hDlg, IDC_TAB); g_prgTabOrgProc = (WNDPROC)GetWindowLong( g_hTabCtrl, GWL_WNDPROC ); SetWindowLong( g_hTabCtrl, GWL_WNDPROC, (LONG)TabProc ); ... } LRESULT CALLBACK TabProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp) { char s[272]; switch( msg ) { case WM_DROPFILES: sprintf(s,"Tab::OnDropFiles().\n"); OutputDebugString(s); break; } return( CallWindowProc( g_prgTabOrgProc,hTab,msg,wp,lp )); } 子ダイアログのドロップは許可のままにします。 これで Tab コントロールのドロップ許可を禁止にすると マウスカーソルが反応しないところは同じです。 ゆえにドロップできません。 許可にした状態でファイルをドロップすると Tab コントロールが WM_DROPFILES を受け取ってます。 つまり、見かけは子ダイアログがTABコントロールの上に乗っているが、 メッセージに関してはTABコントロールの方が上を覆っているような動作をする。 TABコントロールが上を覆わないようにするには CreateDialog() で親を TABコントロールにしなければならない。 そうすると、RECTの計算のところを考えなければならない。 そういうことですね。 >>たぶんかな〜り妖しいことを書いたのだと いえ、コードはそれで正しいはずです。 >> Debug Assertion Failed! 詳しい内容がわからないので、問題の深刻さは不明ですが、 相手アプリによってはたまにあるんですよ。 こういう場合は SendMessage() を PostMessage() にします。 やけどをするまえに手をひっこめる、といったところです。 最初から Post.. を示せばよかったですね。 Post...でも落ちる場合は見たことがありません。(^^;; (Win98/Win2K/WinXp|VC++6.0) ちなみにおいしいツールとは VC++の AppWizard(DialogBase) のことです。 私のは単なる使い捨てのゴミです。 何といっても相手ウィンドウ名が決め打ちですからね。 wparam/lparam も 0 ですし。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.