none
タブ付きMDIアプリの最小化からの再表示 RRS feed

  • 質問

  • VC++2010でMFCを使ったWindowsプログラム開発をしています。

    MFC アプリケーション ウィザードを使ってアプリケーションを作成する際、デフ
    ォルトの設定のままでプロジェクトを作成し、Windows7上で動作させると、背景の
    再描画がおかしくなるようです。

    再現手順としては、
    ① コンパイルして出来上がったアプリケーションを起動する。
    ② 「ファイル」→「新規作成」としてドキュメントをもう一つ開く。
    ③ アプリケーションを最小化する。
    ④ タスクバー上のアイコンをクリックし、2つあるドキュメントのどちらかをクリ
      ックして、画面を再表示します。

    これだけで、画面が二重になって、中身がずれたような状態になります。

    調べてみると、アプリケーション ウィザードの「アプリケーションの種類」で
    「マルチ ドキュメント」と「タブ付きドキュメント」をONにしたプロジェクトで
    発生するようで、「タブ付きドキュメント」をOFFにすると発生しないようです。
    また、開いているドキュメントが一つの場合は発生せず、WindowsXPでも発生しな
    いようです。

    あまりにも簡単に発生するため、「既出では?」と思ったのですが、検索しても見
    つかりませんでした。

    解決方法、もしくはそのポインタをご存じの方がいらっしゃいましたら、教えてい
    ただけないでしょうか。

    よろしくお願いします。

     

    2011年2月21日 5:58

すべての返信

  • こんにちは

    MFC アプリケーション ウィザードを使ってアプリケーションを作成する際、デフォルトの設定のままでプロジェクトを作成し、Windows7上で動作させると、背景の再描画がおかしくなるようです。

    プロジェクトの新規作成からMFCアプリケーションを選び、完了を押しただけのアプリで試してみましたが、特におかしな症状にはなりませんでした。(Debug/Release 共)

    こちらの環境は Windows7/64bit で、VisutalStudio 2010 で試しました。

    症状からしますと、グラフィックドライバかあるいはそれに関わる何らかのアプリが影響している感じがします。


    電柱一家
    2011年2月21日 8:30
  • 電柱一家さん

     

    確認ありがとうございます。

    そうですか。電柱一家さんの環境では再現しませんでしたか。

    こんな基本的な操作で問題が発生するのなら、もっと問題になっていますよね。

    ただ、こちらでは様々なPC上(10台程度で確認)で確実に発生しますので、ドライバや別アプリの影響ではないように思われます。

    コンパイル環境も、XPやWin7で試しているのですが、結果は同じでした。

    共通するのは...コンパイラだけのようなのですが...

     

    もし何かお気づきの点がありましたら、またお願いします。

    ありがとうございました。

     

    2011年2月21日 8:59
  • WIN7のほうで、AEROは使用していますか?

    システムの詳細設定→パフォーマンス→資格効果タブ
    「デザインを優先する」 or  「パフォーマンスを優先する」
    を切り替えてみて、試してみてはどうでしょうか?

    2011年2月21日 11:45
  • yominetさん

    アドバイス有り難うございます。

    ご指摘の設定を変更してみました。

    結果から言いますと、

    ・「デザインを優先する」→× 全く同じ。

    ・「パフォーマンスを優先する」→Window枠と中身のずれは無くなりました!が、タイトルバーの文字が消えてしまいました。背景も一部変です。

    となりました。

     

    次に、「カスタム」にして、一つずつオプションを確認したところ、「ウィンドウとボタンに視覚スタイルを使用する」をOFFにすると、タイトルバーの文字は消えてしまうものの、Window枠と中身のずれが無くなり、かなり改善するようです。

    また、逆に「ドラッグ中にウィンドウの内容を表示する」をOFFにすると、WindowをRestoreした時に、再描画してくれない部分が出てくるようです。

     

    ただ、見た目重視のソフトウェアなので、「ウィンドウとボタンに視覚スタイルを使用する」をOFFにはできません。

    このような状況から、何か分かる事はありますでしょうか?

    私の周りにあるWindows7では、どれでも起こるんですが、どうして皆さんの所では発生しないのでしょう?

    とても不思議です。

     

    2011年2月21日 12:35
  • 実機上では特に描画の乱れは発生しませんでしたが
    リモートデスクトップ接続して実行したところ、一部に描画の乱れがありました。

    こちらの環境では、具体的には3Dボーダーあたりの再描画がされていないように見受けられます。

    またプロパティウィンドウ近辺の背景?も再描画されていないようです。

    環境:Win7 x64 SP1 / Win2008R2 SP1

    2011年2月21日 21:28
  • pitchcatさん

    確認有り難うございます。

    上の書き込みで、「再描画してくれない部分」と言っているのは、まさにその部分です。

    私だけの現象ではなかったのですね。良かったです。

    Windowの外枠と中身はずれませんでしたか?

     

    実は、CFormViewでViewを作成すると、こちらの環境では背景部分が全部再描画されないので、かなり酷い事になるのです。

     

    何とか修正したいのですが、もし何か思い当たる事があるようでしたら、ご教授ください。

    よろしくお願いします。

    #あと、やたらと行間が広いのですが、どうすれば良いのでしょう?

    #初めての投稿なもので...

     

    • 編集済み PinePine 2011年2月22日 8:46 誤読のため
    2011年2月22日 1:02
  • VS2010を持っていないので試せないのと、
    正式な技術文書などのソースではなく、経験のみで申し訳ないのですが・・・

    DWM(デスクトップコンポジションとかAEROだとかシステム)を利用している場合
    XP以前とは描画タイミングやらOSからもらえるWM_PAINTなどがかなり違うようです。
    #他のウィンドウに隠れていたウィンドウも、個々にオフスクリーンをもって描画しつづけてるためか
    #表にでてもWM_PAINTが飛んでこないとか・・・

    また、経験上、nVidiaとAMDのグラフィックボードの違いでも差が出たことあります

    ので・・・
    プロジェクトをつくるときになんかフラグを立て忘れたとか、
    ウィンドウを生成するときに必要なフラグがあるとか・・・ではなく、
    個々に必要なタイミングで、再描画を促す必要があるかもしれません。

    >#あと、やたらと行間が広いのですが、どうすれば良いのでしょう?
    「Shift+ENTER」です。
    ですが、メモ帳などで別に書いてから貼り付けるほうが楽です。

    2011年2月22日 3:50
  • yominetさん

    情報ありがとうございます。

    メニュー操作などを行うと正常な状態に戻るので、yominetさんのおっしゃるよう
    に、どこかのタイミングで再描画を促せば簡単に直りそうなのですが、その適切な場
    所と方法が分かればと思ってこのフォーラムに書き込みました。
    また、原因が分からないのも気持ち悪いですし。

    Window枠と中身のずれについてですが、その後もう一度画面を見てみますと、中身を
    タイトルバーの左上を原点として描画しているようです。
    つまり、タイトルバーの位置にツールバーが表示され、中身全体が左上にずれていま
    す。

    ヒントのようなものでも結構ですので、また何か分かりましたら教えてください。
    よろしくお願いします。


    >>#あと、やたらと行間が広いのですが、どうすれば良いのでしょう?
    >「Shift+ENTER」です。
    >ですが、メモ帳などで別に書いてから貼り付けるほうが楽です。
    なるほど。
    それで、私の最初の書き込みは正しく表示されていたのですね。

    ありがとうございました。

     

    2011年2月22日 4:43
  • こんにちは

    実は、CFormViewでViewを作成すると、こちらの環境では背景部分が全部再描画されないので、かなり酷い事になるのです。

    こちらでは再現しないので想像だけですが、アイコン状態から復帰したときに CFromView に全体を更新するような命令を入れてみてはいかがでしょう?

    OnActiveApp() を作って、アイコンから復帰したときに Invalidate() して UpdateWindow() するのかな?


    電柱一家
    2011年2月22日 7:59
  • 皆様

    色々な情報を有り難うございます。

    試しにWindows7をクリーンインストールし、VS2010のみをインストールして、上記
    手順で動作させてみたところやはり発生しました。

    このフォーラムに書き込む前は、誰でも発生しているのだと思っていましたが、発
    生しないのが普通なようですね。
    それが分かっただけでも、大きな収穫でした。

    何とか、別のエディション等を入手して試してみようかと思います。

    何か分かりましたら、当フォーラムにて報告させていただきます。
    もちろん、皆様からの情報も引き続きお待ちしております。

    よろしくお願いいたします。

     

    2011年2月23日 1:18
  • その後の調査状況です。

    VS2010 Ultimateの評価版をダウンロードして、再度クリーンインストールした
    Windows7にインストールしてみました。

    そして、上記手順で動作させてみたところ、やはり同じ問題が発生しました。

    う~ん、全く訳が分かりません。
    どうして皆さんの環境では発生しないのでしょう?

     

    2011年2月24日 3:15
  • どうして皆さんの環境では発生しないのでしょう?

    グラフィックカードやドライバのバージョン等個々の環境によって変わってくるんじゃないかと思いますが…

    ところで、CFormView に再描画を指示する方法では駄目だったのでしょうか?


    電柱一家
    2011年2月24日 8:41
  • 電柱一家さん

    返信有り難うございます。

    CFormViewではありませんが、CMainFrameのOnActivateまたはOnActivateAppで、
    アクティブになった事を判断した後、
        Invalidate();
        UpdateWindow();
    としてみましたが、全く改善しませんでした。

    また、
        RecalLayout();
        Invalidate();
        UpdateWindow();
    も試してみましたが同じでした。

    ただし、CMainFrameそのものはちゃんと再描画されているようで、OnActivateの場
    合、ツールバーやメニューなどが重なったままですが、タイトルバーは再描画され
    ました。

    症状としては、Windowの中身が左上にずれて、タイトルバー上にツールバーやメニ
    ューが重なって表示されている訳ですが、タイトルバー上に描画されているツール
    バーやメニューはちゃんと操作が可能で、逆にタイトルバーの右にある最小化、最
    大化、クローズのボタンは、中身が上に重なっているため操作ができません。
    つまり、タイトルバー上に重なっている中身は、ちゃんとそこに存在しています。
    グラフィックカードやドライバなどの問題では、このような状態にならないと思う
    のです。

    また、周りにあるPCも一種類ではなく、NECやPanasonicなど様々なのですが、全て
    で発生します。

    本当に不思議です。

     

    2011年2月24日 9:48
  • 現象発生時の画像を貼ってもらえると分かりやすいです。

    OnDraw/OnPaint/OnEraseBkgndでBreak Pointを設定し、地道にMFC内部まで追いかけてみたほうが良いかもしれません。それからSpyを用いて、描画関係のMessageもCheckしながら作業したほうが、Hintが得やすいです。

    2011年2月24日 11:24
  • kozzさん

    返信ありがとうございます。

    画像については、最初から貼り付けたかったのですが、貼り付け方が分からなかっ
    たもので...
    教えていただけないでしょうか?

    よろしくお願いします。

    2011年2月24日 12:06
  • SkyDriveなどに画像をUploadして、その画像を右クリックで表示されるメニューからコピーします。
    この画面(返信等の編集画面)で右クリックで表示されるメニューから貼り付けます。

    うまくいかなければ、以下を参考にしてください。
      http://social.answers.microsoft.com/Forums/ja-JP/answersfeedbackja/thread/2907d2bd-d218-422c-ac40-284df488845f

    テスト投稿フォーラムで試してみてください。

     

    こんな感じで貼り付けられます。

    2011年2月24日 13:40
  • kozzさん

    返信ありがとうございます。

    なるほど、SkyDriveを使うのですね。
    普段、画像やファイルの共有をしないので、思いが至りませんでした。
    FAQやフォーラムも検索はしたんですが...

    今日は、開発環境に触れない状況ですので、月曜日に画像をアップします。

    ありがとうございました。

     

    2011年2月25日 2:01
  • 皆様

    こちらで発生している問題の画像を貼り付けてみます。
    Windowの中身が左上にずれ、画面右と下に、裏の画面が表示されてる状態です。
    そして、画面右上に少し見えているのが、「閉じる」のボタンです。

    よろしくお願いします。

    2011年2月28日 17:23
  • 明らかに変ですね。
    Client DCの描画原点がWindow DCの原点になっているような状況ですね。

    環境が異なるのですが、私も再現手順をもとに確認してみましたが、発生しませんでした。
    地道に追うしかなさそうな気がします。
    Controlを一つづつ排除しながら、現象の発生を確認しつつ、MFCのSource Codeも含め調査してみては如何でしょうか。
    ある程度調査が進んだら、調査内容からKeywordを抽出し、Connectで検索してみてください。
    すでに不具合として報告されているかもしれません。

    >「マルチ ドキュメント」と「タブ付きドキュメント」をONにしたプロジェクトで発生するようで
    CMDIChildWndExの処理が気になりますね。

    ところで、Windows Updateは全て適用されている状態でしょうか。

    2011年3月1日 13:28
  • kozzさん

    いつも返信ありがとうございます。

    Windows Updateはしばらくかけていなかったので、適用後プロジェクトの作成からや
    り直してみました。
    結果としては、やはり同じでした。


    MFCのソースコードを追っかけるのはちょっと気合い(と時間)が必要ですよね。
    納期との関係もあるので、時間を見つけて調べてみます。

    皆さんのところでは発生していないようなので、「問題の発生しない環境」を構築す
    れば、何か分かるのではないかと思っています。
    その環境でコンパイルすれば良いのであればそれが一番簡単ですし、動作環境に問題
    があるのならその条件が分かるのではないかと。

    引き続き調査は続けていきますので、何か分かりましたら、またこのフォーラムに書
    き込みます。

    2011年3月2日 5:06