none
WS_EX_LAYOUTRTL設定したツールバーのイメージがスリープから復帰すると左右反転表示される RRS feed

  • 質問

  • OSを問わず、スリープから復帰するとWS_EX_LAYOUTRTL設定したツールバーのイメージが反転表示されてしまう。

    原因、回避方法をご存知の方がいらっしゃいましたら、ご教示くださいますよう、お願い致します。

    ---------------------------------

    開発環境:Win7x86JP、VS2008 SP1

    言語:Visual C++、MFCプロジェクト

    <再現プロジェクトの作成方法>

    新しいプロジェクト-Visual C++ - MFC - MFCプロジェクトを選択

    シングルドキュメント、プロジェクト形式:Visual Studioを選択、MFCの使用方法はスタティックライブラリで・・を選択。 

    あとは、ウィザードに従い完了させる。

    MainFrameのCreateのスタイルにWS_EX_LAYOUTRTLを追加する。

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
     if( !CFrameWndEx::PreCreateWindow(cs) )
      return FALSE;
     cs.dwExStyle |= WS_EX_LAYOUTRTL;
     return TRUE;
    }

    ビルドして任意のOSで実行し、OSをスリープ状態にする。

    スリープから復帰する。

    ツールバーのイメージが左右反転して表示される。

    最小化/最大化、ポップアップなどの再描画をしても元に戻らず、EXEを再起動するしか修正方法がありません。

    スリープすると何かを忘れてしまうのですね。。。

    -----------------------------

    2012年10月4日 7:18

回答

  • Microsoft のサポートに問い合わせてみてみました。

    <対処方法>

    左右反転したツールバーのイメージを作成し、MainFrameのOnCreate()にOnSysColorChange()を追加。

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
          [..中略..]

           OnSysColorChange();    // 追加

          return 0;
    }

    • 回答としてマーク gazira 2012年10月18日 5:22
    2012年10月18日 5:22

すべての返信

  • レス付きませんね。
    残念ながらこの件について詳しいわけではありません。あしからず。
    さて、アラビア語などのRightToLeftタイプのウインドウには
    WS_EX_LAYOUTRTL のほかに
    WS_EX_RTLREADING、
    WS_EX_RIGHT、
    なども指定するようですが、これらは試してみましたでしょうか。
    また、これらの内のいくつかはシステムのサポートしている言語に依存して
    無効になる場合があると明記されています。
    これらの注意書きは、日本語OS上でのデバッグに意味が無い可能性を示唆しています。

    あとは、WM_POWERBROADCAST メッセージをハンドリングして
     PBT_APMRESUMESUSPEND 時に、どういうことになっているのか
    調べる必要があるかもしれません。


    2012年10月5日 5:31
  • 返信ありがとうございます。
    WS_EX_RTLREADING、WS_EX_RIGHTもダメでした。

    VS2005にてWS_EX_LAYOUTRTLを設定して実行すると、最初からツールバーのイメージが左右反転しています。
    スリープから復帰しても反転表示のままです。

    VS2008で「最初からツールバーのイメージが左右反転している」動作が修正されたが、スリープからに入るときに保存する情報か、スリープから復帰した時の情報が欠落していると予測しています。

    2012年10月5日 8:23
  • WS_EX_LAYOUTRTLを使ったことが無かったので、xp(sp3) 非MFC SDKで試してみました。

    わかったこと。

    1. WS_OVERLAPPEDWINDOWにWS_EX_LAYOUTRTLを付けてCreateWindowExすると、子ウィンドウにはWS_EX_LAYOUTRTLが付いてしまう。2.ツールバーのイメージは最初から左右反転している。(スリープは試していません)

    ということで、MFCの不具合のような気がします。

    2012年10月7日 4:37
  • 返信ありがとうございます。

    私も「MFCの不具合のような気がします。」

    左右反転してしまったイメージをどのタイミングで、どの様にすれば修正可能か検討中です。

    -----------

    これまで記載した内容とは別に

    VS2008の場合、ツールバーのイメージは正常ですが、ルーツチップに表示されるイメージは左右反転しています。

    VS2005のは、ルーツチップイメージが表示されませんので、問題ありません。

    -----------

    2012年10月8日 5:39
  • 費用がかかるかと思いますが、Microsoft のサポートに問い合わせてみてはどうでしょうか。
    ゴールを明確にできていれば、それに対する答えを引き出せることが期待できます。
    (MFC の不具合かどうかの回答ももらえるかもしれません)

    // 自分たちで調査するよりは、人件費を考えるとたぶん安く済むんじゃないかなぁ。
    // Microsoft がこう答えたからこうするんですとか、できないんですとか言いやすくなる。

    2012年10月8日 15:26
    モデレータ
  • Microsoft のサポートに問い合わせてみてみました。

    <対処方法>

    左右反転したツールバーのイメージを作成し、MainFrameのOnCreate()にOnSysColorChange()を追加。

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
          [..中略..]

           OnSysColorChange();    // 追加

          return 0;
    }

    • 回答としてマーク gazira 2012年10月18日 5:22
    2012年10月18日 5:22