ピクチャコントロールに重ねたテキストについて

[戻る]
COF 2009/08/18(火) 15:53:43
お世話になっております。
初歩的な質問かもしれませんが、ご教授ください。

ダイアログに、ピクチャコントロールを配置して、塗りつぶし、
その上にスタティックテキストで文字を表示させたいと思っています。

DialogのOnPaintで以下のようにしてピクチャコントロールを塗りつぶしていますが、
再描画された際に、重ねたテキストが見えなくなってしまいます。
テキストはOnCtlColor()で文字色を変える処理を行っています。
どうやって、再描画されてもテキストの表示を保つのでしょうか?

void CHogeDlg::OnPaint()
{
    CPaintDC dc(this);

    CRect rect;
    GetDlgItem(IDC_STC1)->GetClientRect(&rect);
    CDC* pdc = GetDlgItem(IDC_STC1)->GetDC();
    pdc->FillSolidRect(rect, RGB(0,0,255));
}

環境は2003 MFCです。

aetos 2009/08/18(火) 16:04:30
それはピクチャコントロールを塗りつぶしていると言うより、ピクチャコントロールの
ある位置のダイアログを塗りつぶしているのです。
ピクチャコントロールの DC を取得して塗りつぶしてみては。

aetos 2009/08/18(火) 16:08:55
って恥ずかしい。良く読まずに嘘言った。

スタティックがピクチャコントロールの子だったり兄弟だったりするなら、ピクチャコ
ントロールに WS_CLIPCHILDREN や WS_CLIPSIBLINGS をつけてみるとか。

Blue 2009/08/18(火) 17:01:51
ピクチャコントロールもWM_CTLCOLORで塗りつぶせばどうでしょうか?
スタイルをビットマップか何かにしてタブオーダをピクチャコントロール→スタティック
にすればうまくいくはずです。

もっとも色を塗りつぶすだけならピクチャコントロールではなくてスタティックでも十分
でしょう。

COF 2009/08/18(火) 17:32:10
aetos様、Blue様、ありがとうございます。

OnCtlColor()で塗りつぶすようにしたのですが、塗りつぶしがうまくできません。

HBRUSH CHogeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    int iCtrlID = pWnd->GetDlgCtrlID();
    
    switch(nCtlColor)
    {
        case CTLCOLOR_STATIC:
            if(iCtrlID == IDC_STC1)
            {
                // 文字色
                pDC->SetTextColor(RGB(255, 255, 255));
                // 背景色
                pDC->SetBkMode(TRANSPARENT);        // 背景透過
                hbr = static_cast<HBRUSH>(GetStockObject(NULL_BRUSH));
                pDC->SetBkColor(RGB(0,0,255));                //青に塗りつぶし
            }
            break;
        default:
            break;
    }
    
    return hbr;
}

ピクチャコントロール(IDC_STC1)のスタイルをフレームとビットマップで試して
みましたが、だめでした。
なにか足りないところがあるでしょうか?

Blue 2009/08/18(火) 17:42:18
塗りつぶすブラシを返さないと。
CBrushnのメンバ変数を用意して、

    case IDC_STATIC1:
        if (this->m_brush1.GetSafeHandle() == NULL) {
            this->m_brush1.CreateSolidBrush(RGB(0, 0, 0xff));
        }
        pDC->SetBkMode(TRANSPARENT);
        hbr = this->m_brush1;
        break;

といった感じに。

COF 2009/08/18(火) 17:55:31
[[解決]]
Blue様、ありがとうございます。

おかげさまで、希望通りのことが実現できました。
お忙しい所ありがとうございました。助かりました。

古いスレッドには追加発言できません。