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

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

ツリー一括表示

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]


親記事 / ▼[ 5 ] ▼[ 6 ]
[4]  VC++ MFC Tips
□投稿者/ Toshi -(2005/12/10(Sat) 14:08:59)

    このスレには、最近自分が VC++ + MFC でハマった事項やちょっとしたテクに対する Tips をメモ的に書いていきます。
[ □ Tree ] [ 返信/引用返信 ] 削除キー/



▲[ 4 ] / 返信無し
[5]  コンボボックス+イメージリスト
□投稿者/ Toshi -(2005/12/10(Sat) 14:22:55)

    イメージリストの扱いに関するWEBページは結構有りますが、どれもbmpファイルを読み込んで使用するパターンばかりです。
    今回、自分で描画したイメージをイメージリストに登録してコンボボックスに使用したかったのですが、ちょっとハマりました。
    そこで、ハマった点をまとめます。

    ・memDCに自分で描画して、GetCurrentBitmap()でビットマップイメージを取得し、イメージリストに登録する訳ですが、何も考えずにこれをやってもイメージリストに登録されるイメージは黒い豆腐になります。
    ポイントは、「.DeleteDC()」です。

    CBitmap *bitmap = memDC.GetCurrentBitmap();
    memDC.DeleteDC();
    imageList.Add(bitmap, (COLORREF)0);

    の手順で行えば正常に登録されます。

    ・またついつい忘れがちになってやってしまうのが、CComboBox を使ったり、DLGエディタでも普通のコンボボックスを貼り付けてしまう事です。
    CComboBoxEx と、Expanded ComboBox を使う必要が有ります。
[ 親 4 / □ Tree ] [ 返信/引用返信 ] 削除キー/



▲[ 4 ] / 返信無し
[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 作りましたが・・・

[ 親 4 / □ Tree ] [ 返信/引用返信 ] 削除キー/


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

- Child Tree -