プログラミングボード
プログラミングボード

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 検索 過去ログ

[6]  CStaticのカラー化
□投稿者/ Toshi -(2005/12/10(Sat) 14:58:10)

    (前提として、私はカプセル化出来るオーナードローを好んで使います。
     試した事は有りませんし、詳しく突っ込んで調べた事も無いのですが、
     コントロールカラーもリフレクターを使えばカプセル化出来るかも
     知れません。)

    CStatic を派生させて CColorStatic を作りました。
    しかし、どうも上手く動いてくれず、ハマりました。
    DLGエディッタで指定した各種プロパティがどうも無効になってしまうのです。
    調べた結果、オーナードローの値が 0x0d なのに、Allign周りのスタイル値が 0,1,2 だったり、とーもスタイル値の組み合わせが破綻してる様です。
    対策として、通常オナードローが指定されていないコントロールでも強引にオーナードローにする為に、PreSubclassWindow()で ModifyStyle()すると思いますが、
    その PreSubclassWindow() 内で ModifyStyle() する直前に、メンバー変数を用意し、
    m_dwOrgStyle = GetStyle();
    で、オーナードロースタイルを設定する前の値を保存しておき、DrawItem() では
    m_dwOrgStyle を使って色々描画制御してやる必要が有ります。

    また、オーナードロー時に GetWindowText() を行っても「\t」が取れず、また、CDC::DrawText() もタブを展開してくれないと言う問題も有りました。
    よってタブを使う際は、DLGエディッタで入力したデフォルトストリングを使う事は諦め、CColorStatic::SetText() を用意して別途メンバー変数 CString m_strText にテキストを保持させ、( PreSubclassWindow() 内で m_strText = GetWindowText() を行っておけばタブを使わない場合は DLGエディッタの文字が使える)DrawItem() では m_strTextを元に自前でタブ展開を行う必要が有ります。
    もちろん、ワードラップもしてくれないので、こいつも自前で処理する必要が有ります。
    この辺の処理は一度悩めばカラーボタンなどにも応用が効くので面倒でも関数を作る価値は有ります。
    (私が作ったワードラップメソッドは「えいや」なので、今回は提示を控えます)
    (私が作ったタブ展開メソッドはイメージリスト対応でちょっと複雑で分かり辛いので、今回は提示を控えます)
    ちなみに、カラーボタンは性能を考えなければ デフォルトで用意されているActiveX 使った方が早いですね。
    今の職場は 「ActiveX使われると誰もメンテできなくなるからやめて」って言う所だし、いずれにせよ ActiveX のカラーボタンは重いしで、自分で CColorButton 作りましたが・・・

記事引用  削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←VC++ MFC Tips /Toshi 返信無し
 
上記関連ツリー

Nomal VC++ MFC Tips /Toshi (05/12/10(Sat) 14:08) [4]
Nomal コンボボックス+イメージリスト /Toshi (05/12/10(Sat) 14:22) [5]
Nomal CStaticのカラー化 /Toshi (05/12/10(Sat) 14:58) [6] ←Now

All 上記ツリーを一括表示
 
上記の記事へ返信
Pass/

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 検索 過去ログ

- Child Tree -