CxxxApp::InitInstanceでのモードレスダイアログ表示 – プログラミング – Home

通知
すべてクリア

[解決済] CxxxApp::InitInstanceでのモードレスダイアログ表示


ぼんじょび
 ぼんじょび
(@ぼんじょび)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

初めまして。
Windows2000 VC++6.0 MFCにてアプリケーションを作成中です。
悩みは以下の事です。

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

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


引用未解決
トピックタグ
たく
 たく
(@たく)
ゲスト
結合: 21年前
投稿: 29
 

CDialog::DoModalのなかでメッセージポンプが用意されているため
DoModal以降はモードレスダイアログの子ウィンドウを作成・表示するための
メッセージが処理されています。

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

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


返信引用
ぼんじょび
 ぼんじょび
(@ぼんじょび)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

たくさん有難う御座います。

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

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

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


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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

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


返信引用
ぼんじょび
 ぼんじょび
(@ぼんじょび)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

dairygoodsさん有難う御座います。

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

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

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


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

プログレスバー付ダイアログは、
親ダイアログを出す前に出したいのですよね?

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

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


返信引用
ゆう
 ゆう
(@ゆう)
ゲスト
結合: 23年前
投稿: 114
 

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

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

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

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


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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

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

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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


返信引用
ぼんじょび
 ぼんじょび
(@ぼんじょび)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

皆さんありがとうございます。
もう一度よく練り直してみようかと思います。
わからない事があったらまた質問させて頂きますので
その時はどうぞ宜しくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました