win Me VC++ Ver6.0 過去ログ
「ダイアログでのドロップ処理」を見せて頂きましたが初心者で十分解らない所が有りますので
よろしくお願いします。
ダイヤログベースのスケルトンを作り(MFC Appwizard(exe)を使用)EditBoxを貼り付けて
ここにドラッグ ドロップ を実現したいのです。(ファイル名を表示)プロジェクト名を
Drag_Drop とします。
1.EditBox の拡張スタイルのドラックドロップにチェックを入れればDragAcceptFilesは
使わなくてもいいのでしょうか?
2.Windows.hをインクルーズするのをソースファイルのどこに書くのでしょうか?
Drag_Drop.cpp? Drag_DropDlg.ccp?
3.最後に肝心の
//ダイアログのプロシージャ
LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
.....
}
関数をコーディングする場合メンバー関数の追加を使うのでしょうか?また、そのクラス
は?
> 1.EditBox の拡張スタイルのドラックドロップにチェックを入れればDragAcceptFilesは
> 使わなくてもいいのでしょうか?
はい
> 2.Windows.hをインクルーズするのをソースファイルのどこに書くのでしょうか?
しなくてよいです。
> 3.最後に肝心の
Appwizardで作成した場合はMFC使用ですので、PreTranslateMessage()内でWM_DROPFILESを
処理するとよいです。
ダイアログプロシージャはCDialogクラスを使用せずにDialogBoxマクロを使用してダイアログ
を作成する場合に実装します。
早速のご教示有難う御座いました。あちこち探しましたが PreTranslateMessage() が見つ
かりませんが? すみません!
見つかりました。か゜、CwinApp,CWndなど 使い方がいまいちですが?
> 使い方がいまいちですが?
どういう事でしょう?
CWndとかの関数をオーバーライド?して使えばいいのでしょうか? また、VBの様に
PeekMessage も使えますか? ナントカ ヤッテミマス。出来上がったらお知らせします。
有難う御座いました。
VBは知らないのでPeekMessageはわかりませんが、下記のようにすれば処理出来ると思います。
BOOL CxxDlg::PreTranslateMessage( MSG* pMsg )
{
switch ( pMsg->message )
{
case WM_DROPFILES:
// エディットボックスか判断
if ( pMsg->hwnd == m_edit.GetSafeHwnd() )
{
// ファイル名を取得する処理
}
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
ココでのm_editは目的のEditBoxの事を指します。
とりあえずテストのためのコーディングをしました。
BOOL CDrag_DropDlg::PreTranslateMessage(MSG *pMsg)
{
switch ( pMsg->message )
{
case WM_DROPFILES:
{
// ファイル名を取得する処理
char FileName[MAX_PATH+1]; // ドロップされたファイルの名前
UINT Count; // ドロップされたファイルの数
HDROP hDrop; //ハンドル
//ドロップされたファイルの数を取得する
Count = DragQueryFile( hDrop, 0xFFFFFFFF, NULL, 0 );
DragQueryFile( hDrop, 0, FileName, MAX_PATH );
AfxMessageBox(FileName);
}
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
コンパイルは出来ますが実行するとバンドルされていない例外はDrag_Drop.exe(SHELL32.DLL)
にあるというエラーが出るのですが?
>コンパイルは出来ますが実行するとバンドルされていない例外はDrag_Drop.exe
>(SHELL32.DLL)にあるというエラーが出るのですが?
もし、Count = DragQueryFile() でエラーが起きているのなら、hDrop には何を指定
しなければならないのか調べてください(msdn ライブラリーで DropQueryFile について
調べれば判ると思います。判らなければ google などで検索して調べて下さい)
そうでないのなら、どこでエラーが起きているか確かめて知らせて下さい
更に、実行するとだけでなく、何をしたらそのエラーがおきたのか判るように示して下さい
ところで、デバッグバージョンで実行してみたのですか、リリースバージョンで実行して
みたのですか?
エラーが出たことはどこに何が出たのでわかったのですか?
島さん ひろぴー お手数をおかけします。
コードの AfxMessageBox(FileName); をコメントアウトしてコンパイルすると
「warning C4700: 値が割り当てられていないローカルな変数 'hDrop' に対して参照が行われまし
た。」が出るので hDrop の使い方が間違っているようですがこれより先は解りません。すみ
ません。
Windowsうんぬんの前にC言語の基礎を勉強した方がよいかと。
>「warning C4700: 値が割り当てられていないローカルな変数 'hDrop' に対して参照が行わ
れました。」
そのままなのですが… CやC++では、変数を定義しただけでは、正しい値は入ってません。
だから、代入なり何なりして正しい値にしてやってから使わないとまずいんじゃないの?
とコンパイラが親切に教えてくれているのです。
>薫 2004/01/28(水) 15:43:05
の
> case WM_DROPFILES:
> ・
> ・
> HDROP hDrop; //ハンドル
>
> //ドロップされたファイルの数を取得する
> Count = DragQueryFile( hDrop, 0xFFFFFFFF, NULL, 0 );
の
DragQueryFile( hDrop, 0xFFFFFFFF, NULL, 0 )
に対する警告ですね
>AfxMessageBox(FileName);
は関係ないよ
>hDrop の使い方が間違っているようですがこれより先は解りません。
MSDNは読んだの?
引数の解説にhDrop
「ドロップされた複数のファイルの名前を保持している、1 個の内部構造体のハンドル
を指定します。」
とあるじゃない
DragQueryFile関数を使用するまでの間に「保持」をどうやって行っているの何もしてい
ないじゃない
いわゆる値の代入は「どうなっちゃたんですか?」と言うことです
初期化されていない、ハンドル「hDrop」が1つ存在しているだけでしょ
CやC++では変数(ハンドル含む)宣言はその後利用しようと思うのなら
初期化(実態化「メモリ領域の確保」)と言う作業が必ず必要です
やらないと実行時にゼロアドレス参照c00005(アクセスバイオレーション)
ページ違反・アクセス侵害の原因になります
これを防ぐ意味での警告エラーですので警告と侮らず、回避しましょう
すみません
「HDROP hDrop;」の部分の初期化が良く解りません。
下記のようなメッセージが10数行出るし
'C:\WINDOWS\SYSTEM\COMCTL32.DLL' をロードしました、合致するシンボル情報は見つかりませ
んでした。
・・・・・
・・・・・・
実行すると「バンドルされていない例外はDrag_Drop.exe(SHELL32.DLL)・・」が出ます。
HDROPという構造体はメモリ上に確保しましたが、中身が空っぽという事です。
ココでいう初期化とは、中身を入れろという事ですね。
みなさんが教えて下さっている事が理解できていればhDropにドロップされたファイルのハンド
ルが定義されていないという事が分かると思います。
何をhDropに設定すればよいかというと、MSDNでWM_DROPFILESを検索してみて下さい。
その定義するものがドコにあるのか分からない場合はMSG構造体を検索して下さい。
何をするにもMSG構造体しか渡されていないのですから、その中身でどうにかするしかない訳で
すね。
hDropの設定の仕方はひろぴーさんのレスで判るとして…
答えを書くのは簡単ですが、MSDNで調べればいいだけです。
「MSDNで調べる」というコトを覚えて下さい。
>下記のようなメッセージが10数行出るし
> 'C:\WINDOWS\SYSTEM\COMCTL32.DLL' をロードしました、合致するシンボル情報は見つか
りませ
> んでした。
は気にしなくても問題ないです。
皆の環境でふつ~に表示されるメッセージですから。
もちろん、私のところでも表示されます。