モーダレスダイアログの後ろで、ダイアログがチカチカ!

[戻る]
モーモー 2002/12/25(水) 16:18:48
またまた、モーモーで、すみません(--;

MDIで作っている画面で、メニューバーのある項目からダイアログを呼んでいます。
そのダイアログには、いくつかのbitmapが貼りつけられているのですが、
ある絵をクリックすると、メインウィンドウに絵を表示するというプログラムを組んでいます。


ダイアログのソースで、
oid CmDlg::OnPict1() 
{
  pictID = IDB_BITMAP1;
}

絵を表示するのはXXXView.cppのOn_Draw()に記述してあり、
CmDlg myDlg;
cBitmap.LoadBitmap(myDlg.pictID);

というふうにbitmapを読みこんでいます。


最初、ダイアログも開いてないし絵もクリックしてないので、
IDが取得されず、実行エラーになっていたので、
On_Draw()の中に、switch文でIDがなければ、何もしない。というふうに、
変更したところ、実行後、ダイアログは問題なく開くのですが
ダイアログをちょっと移動させると、ダイアログとメインウィンドウとが
交互にアクティブ化しているみたいに、チカチカしているのです。
うまく説明できてないかもしれませんが、ダイアログ自身じゃなくてそのダイアログの分身みた
いなのとメインウィンドウがチカチカしているのです。。。


ちなみに、ダイアログを何回も作っているということはないです。確認してみたので…。

他に、原因がわからないので、どなたか教えてください。
よろしくお願いします。

へたれ 2002/12/26(木) 11:54:53
>ちなみに、ダイアログを何回も作っているということはないです。確認してみたの
で…。
そうでしょうか?

OnDraw() 内で
>CmDlg myDlg;
としているようなので、再描画の度にダイアログを作っているような感じがします
が...。

モーモー 2002/12/26(木) 17:45:19
>OnDraw() 内で
>>CmDlg myDlg;
>としているようなので、再描画の度にダイアログを作っているような感じがしますが...。

インスタンスを作ることでダイアログを作ろうとするのですか?
ダイアログは上でも書きましたがメインウィンドウのメニューバーの
ある項目を選択されることにより、起動するようにしているのですが・・・。

sugar 2002/12/26(木) 19:28:07
メニューから起動したモードレスダイアログから、
ビットマップのIDを取得したいんですよね?

OnDraw()内で宣言した
> CmDlg myDlg;
は、メニューから起動したダイアログを指しているとは思えないのですが。

メニューから起動したモードレスダイアログのインスタンスは、どこにありますか?
OnDraw()内からは、それを参照すべきなのではないでしょうか。

モーモー 2003/01/07(火) 11:37:32
あけましておめでとうございますm(__)m

まだまだよろしくおねがいします(^^ゞ


>メニューから起動したモードレスダイアログのインスタンスは、どこにありますか?
これは、メニューバーの”ダイアログを開く”以下のような感じになっています。
void CNTWKView::OnDlg1open() 
{
    CmDlg *dlg1;
    dlg1 = new CmDlg(this);
    
}

それを参照するってことは、『dlg1』を、使えば良いのでしょうか?

sugar 2003/01/07(火) 13:20:26
このコードだと、newで確保した領域は維持されますが、
どこに確保されたかを保持するdlg1がローカル変数では、
OnDlg1open()から抜けてしまうと、以後、変数dlg1は参照できなくなってしまいますよ。

CNTWKViewクラスのメンバ変数として
CmDlgクラスへのポインタ変数を定義した方がよいと思います。

モーモー 2003/01/07(火) 14:02:14
viewにメンバ変数として宣言したところ、


XXXView.cppのOn_Draw()
cBitmap.LoadBitmap(*dlg1.pictID);


の、pictIDが認識されなくなってしまったんですけど…。

n [E-Mail] 2003/01/07(火) 14:57:21
> cBitmap.LoadBitmap(*dlg1.pictID);

これってコンパイルは通った?

モーモー 2003/01/07(火) 15:02:33
いや、通らないです。。。
『'.pictID' : 左側がクラス、構造体、共用体ではありません。』ってなります。

n [E-Mail] 2003/01/07(火) 15:28:01
*dlg.pictID
は
*( dlg.pictID )
と同じで、ポインタ変数( CmDlg* dlg )にドット演算子( . )を使ってるので通らない。
代わりに、
( *dlg ).pictID
こうするか(演算子の優先順序ってやつ)、
又は
dlg->pictID
とすればとりあえずOK。

モーモー 2003/01/07(火) 16:09:32
[[解決]]
おー!!!
読み込みが無事できました。

ありがとうございました m(__)m

sugar 2003/01/07(火) 16:33:42
無事解決したようで何よりですが、以下の点、注意してください。


void CNTWKView::OnDlg1open() 
{
//  CmDlg *dlg1;               <- これは不要になったはず
    dlg1 = new CmDlg(this);
}

メニューを選ぶと、newし続けることになります。
既にnewしてたら、newしない制御をしないと、
メモリリークにつながります。

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