CxxxApp::InitInstanceでのモードレスダイアログ表示

[戻る]
ぼんじょび 2005/02/25(金) 13:27:36
初めまして。
Windows2000 VC++6.0 MFCにてアプリケーションを作成中です。
悩みは以下の事です。

機能は違うのですが「Lhaca」のような物を作成中です。
ショートカットアイコンやEXEにファイルがドロップされた際、
コピーが開始されるようなものなのですが、
コピー中の作業時間が見えるようにプログレスバーを作りたいと思っています。
そこでプログレスバー用のダイアログをモードレスで出そうと思っているのですが、
プログレスバーやキャンセルボタンが表示されません。
用は"砂時計"状態になってしまいます。
親ダイアログをDoModalする前にCxxxApp::InitInstance()にてモードレスダイアログを出そ
うとしているのですが、そこが問題なのでしょうか?
ちなみにDoModal後はきちんと表示することができます。

手をつけたばかりで理解力に欠けている事も多々ありますが、
なにとぞ御教授お願いいたします。

たく [E-Mail] 2005/02/25(金) 13:56:06
CDialog::DoModalのなかでメッセージポンプが用意されているため
DoModal以降はモードレスダイアログの子ウィンドウを作成・表示するための
メッセージが処理されています。

しかし、DoModal以前にはそのメッセージが処理されませんので、
メッセージを処理するチャンスをモードレスダイアログに与える必要があります。

考えてみると、結構面倒くさいので
親ダイアログからモードレスダイアログを出したほうがよいと思いますよ。

ぼんじょび 2005/02/25(金) 17:55:23
たくさん有難う御座います。

とするとショートカットアイコンにドロップされた場合だけ表示・実行する
ということは難しくなるのでしょうか?
今自分が実現したい工程を書きます。

1、ショートカットにファイルをドロップする。
2、CxxxApp::InitInstance()にてコマンドラインよりファイルパスを取得
3、フォルダ選択ダイアログを表示し、保存場所のパスを取得
4、プログレスバー付のダイアログで進行状況を表示しつつファイルをコピー
5、コピー終了後FALSEを返しアプリケーション終了

という流れです。
プログレスバー付ダイアログの表示以外は出来ています。
アイコンにドロップされた時だけ親ダイアログは出さずして処理して
終了したいと思っています。
親ダイアログは、DoModalでダイアログを表示後、
OnDropFilesをオーバーライドしているためモードレスダイアログも成功します。
アイコンにドロップされた際のメッセージがあればいいのですが・・・。

dairygoods 2005/02/25(金) 17:57:46
> 1、ショートカットにファイルをドロップする。
> 2、CxxxApp::InitInstance()にてコマンドラインよりファイルパスを取得
> 3、フォルダ選択ダイアログを表示し、保存場所のパスを取得
> 4、プログレスバー付のダイアログで進行状況を表示しつつファイルをコピー
> 5、コピー終了後FALSEを返しアプリケーション終了

この流れを実現するために、プログレスバー付のダイアログが
モーダルである必要性を感じないのですが、なにか理由があるのでしょうか?

ぼんじょび 2005/02/25(金) 18:19:32
dairygoodsさん有難う御座います。

> この流れを実現するために、プログレスバー付のダイアログが
> モーダルである必要性を感じないのですが、なにか理由があるのでしょうか?

すいません、説明不足でした。
プログレスバー付ダイアログはモードレスで出したいのです。
しかし、CxxxApp::InitInstance()にて親ダイアログをDoModalする前に
ModalessDialogを表示したいと考えているため、
メッセージ処理が行われず、ダイアログは表示されているのですが「砂時計状態」なのです。

「そのメッセージ処理をしろ」という話だとは思うのですが、
今の自分の力量ではキツイので、もしかしたら他に手があるのでは!という事なのです。

dairygoods 2005/02/25(金) 18:37:36
プログレスバー付ダイアログは、
親ダイアログを出す前に出したいのですよね?

モードレスとは、親ダイアログがあるときに、
親と子の両方を触れるような表示状態を指すので、
親がなく、そのダイアログだけが唯一つ出ている時は、
モードレスだろうがモーダルだろうが違いはないと思うのですが。

#それとも技術的興味や好き嫌いの問題でしょうか。

ゆう 2005/02/25(金) 19:04:20
>> 1、ショートカットにファイルをドロップする。
>> 2、CxxxApp::InitInstance()にてコマンドラインよりファイルパスを取得
>> 3、フォルダ選択ダイアログを表示し、保存場所のパスを取得
>> 4、プログレスバー付のダイアログで進行状況を表示しつつファイルをコピー
>> 5、コピー終了後FALSEを返しアプリケーション終了
>
>この流れを実現するために、プログレスバー付のダイアログが
>モーダルである必要性を感じないのですが、なにか理由があるのでしょうか?

私は逆にモードレスの必要性が感じられません。

モードレスの機能はInitInstaceがTRUEを返さなければ始まりません。
しかしメインダイアログはInitInstanceで生成、破棄される。
という事が問題なのですよね。

モーダルにして以下の様にすればいいだけのような。
   if(コマンドラインがあるのなら)
   {
     上記の処理
   }
   else
   {
     普通のメインダイアログ
   }

dairygoods 2005/02/26(土) 10:17:19
>>この流れを実現するために、プログレスバー付のダイアログが
>>モーダルである必要性を感じないのですが、なにか理由があるのでしょうか?

>私は逆にモードレスの必要性が感じられません。

失礼、モードレスの間違いです。
モードレスにする必要はなく、
モーダルでよいのではないかと言うつもりでした。

混乱させてしまってすみません。

PATIO 2005/03/01(火) 15:05:36
プログレスバー付のダイアログの中で
ファイルをコピーする処理をワーカースレッドにでもして動かせば済みそうですね。
ファイルコピーの部分をグローバル関数にでもしてしまえば、メインのウインドウからも
呼び出せると思いますし、わざわざ難しくする必要は無いように感じます。
皆さんが言われているように他に同時に表示されるべきウインドウがないのであれば、
モードレスにする意味はないと思います。
構成を考え直した方がシンプルになってよいと思いますよ。

ぼんじょび 2005/03/04(金) 10:21:11
[[解決]]
皆さんありがとうございます。
もう一度よく練り直してみようかと思います。
わからない事があったらまた質問させて頂きますので
その時はどうぞ宜しくお願いします。

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