none
ダイアログ上のスタティックテキストの背景色をスタティックテキストの長さに合わせて変更したい RRS feed

  • 質問

  • お世話になります、鏑木と申します。
    現在、Windows CE 6.0にてVisual Studio 2005のC++のダイアログベースアプリケーションの開発をしております。
    今回お聞きしたい内容はタイトルの通りなのですが、これは当たり前の動作ではないかと自分では思っていました。

    ダイアログ上にスタティックテキストを置き、そのスタティックテキストのメンバ変数CStatic m_st_textを作成し、
    m_st_text.SetBkColor(RGB(0,0,0))とすれば、そのスタティックテキストの大きさに対応した背景全ての色
    が変化すると思います。

    ですが、現在の開発環境(Widows CE)ではなぜか、そのようにするとスタティックテキスト領域内の入力された文字部分
    の背景のみの色が変化され、その外の、文字が入力されていないスタティックテキスト領域の余った部分はアプリケーションの
    下の画像(デスクトップの画像)が表示されてしまいます。

    この原因や対応策として考えられることがありましたら、ご意見を頂ければと思っております。

    尚、今までの私の対応としては
    SetBkColorではなく、ブラシを作成し、それをSelectObjectする。
    OnEraseBkgndを呼び出し、背景処理をさせる
    としたのですが、結果は同じでした。

    開発環境は前述しましたとおり
    Windows CE 6.0
    Visual Studio 2005
    です。

    2009年9月28日 8:59

回答

  • SetBkColorで設定する背景色というのは
    「文字の隙間などを塗りつぶすときのカラー」です
    ですから、文字が描かれた部分の背景のみに色がつくのは正しい処理です。

    キャンバス全体の初期の色とか、そういう意味ではないです。

    PCでは、
    塗りたい色があるときは、自分で色を設定して塗る
    が基本です

    • 回答としてマーク 鏑木肆星 2009年9月29日 2:42
    2009年9月28日 11:59
  • 皆さんのご指摘の通りですが、更新領域のみが背景も再描画されます。

    おそらく、MFC の DDX を利用していると思われますが、この場合、MFC は TextOut を利用しているのでは、とも思います。

    DDX を利用せず、API の DrawText あるいは DrawTextEx を利用すれば、描画テキストと描画 RECT を指定する形式なので、背景色の再描画も行われると思います。

    • 回答としてマーク 鏑木肆星 2009年9月29日 2:41
    • 回答としてマークされていない 鏑木肆星 2009年9月29日 2:41
    • 回答としてマーク 鏑木肆星 2009年9月29日 2:42
    2009年9月28日 12:46

すべての返信

  • WM_CTLCOLORというメッセージについて調べてみてください。
    2009年9月28日 10:59
  • SetBkColorで設定する背景色というのは
    「文字の隙間などを塗りつぶすときのカラー」です
    ですから、文字が描かれた部分の背景のみに色がつくのは正しい処理です。

    キャンバス全体の初期の色とか、そういう意味ではないです。

    PCでは、
    塗りたい色があるときは、自分で色を設定して塗る
    が基本です

    • 回答としてマーク 鏑木肆星 2009年9月29日 2:42
    2009年9月28日 11:59
  • 皆さんのご指摘の通りですが、更新領域のみが背景も再描画されます。

    おそらく、MFC の DDX を利用していると思われますが、この場合、MFC は TextOut を利用しているのでは、とも思います。

    DDX を利用せず、API の DrawText あるいは DrawTextEx を利用すれば、描画テキストと描画 RECT を指定する形式なので、背景色の再描画も行われると思います。

    • 回答としてマーク 鏑木肆星 2009年9月29日 2:41
    • 回答としてマークされていない 鏑木肆星 2009年9月29日 2:41
    • 回答としてマーク 鏑木肆星 2009年9月29日 2:42
    2009年9月28日 12:46
  • Atsushi777様、いつもご回答ありがとうございます。

    今まではダイアログ上のコントロールの色つけにはWM_CTLCOLORを使用していたのですが、
    PCではOnCtlColor()が自動的に呼び出されますが、なぜかCEではそれが行われず、クラスを
    呼びだした最初の1回のみ呼びだされるため、その後のフラグの変化による背景色の変更などに
    対応させることができなかった為、現在SetBkColorで背景色を動的に変更しようかなと思って
    おりました。
    2009年9月28日 23:54
  • yominet様、ご回答ありがとうございます。

    >SetBkColorで設定する背景色というのは
    >「文字の隙間などを塗りつぶすときのカラー」です
    >ですから、文字が描かれた部分の背景のみに色がつくのは正しい処理です。

    なるほど、そうだったんですね、それで文字の下だけが背景色がついたんですね。。
    やはり、コントロール全体の背景色を変更するためにはWM_CTLCOLORを取得する
    方法になるのでしょうかね。
    2009年9月28日 23:57
  • ミッヒー様、いつもご回答ありがとうございます。

    >おそらく、MFC の DDX を利用していると思われますが、この場合、MFC は TextOut を利用しているのでは、とも思います。
    >DDX を利用せず、API の DrawText あるいは DrawTextEx を利用すれば、描画テキストと描画 RECT を指定する形式なので、背景色の再描画も行われると思います。
    現在のテキストの出力方法はDrawTextです。ミッヒー様の言うとおり、背景色の再描画をすることが出来るのですが、その対応する背景部分がどうも文字の下のみのようです。。
    なので、文字を入力するまえに空白文字を入力した後に、その上に文字を重ねて表示させることで、スタティックテキストの文字以外の隙間をうめるような操作をしています。。
    ただ、これだとちらつきが。。
    2009年9月29日 0:18
  • 鏑木です。

    背景色の変更をSetBkColorではなく、SetTextで指定しているCRectをFillSolidRectで指定色で塗りつぶすことで
    背景色を変更することができました。

    ご回答して頂きました皆様、大変ありがとうございました。
    これからもよろしくお願いいたします。

    鏑木
    2009年9月29日 2:41