お世話になっております。
初歩的な質問かもしれませんが、ご教授ください。
ダイアログに、ピクチャコントロールを配置して、塗りつぶし、
その上にスタティックテキストで文字を表示させたいと思っています。
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です。
それはピクチャコントロールを塗りつぶしていると言うより、ピクチャコントロールの
ある位置のダイアログを塗りつぶしているのです。
ピクチャコントロールの DC を取得して塗りつぶしてみては。
って恥ずかしい。良く読まずに嘘言った。
スタティックがピクチャコントロールの子だったり兄弟だったりするなら、ピクチャコ
ントロールに WS_CLIPCHILDREN や WS_CLIPSIBLINGS をつけてみるとか。
ピクチャコントロールもWM_CTLCOLORで塗りつぶせばどうでしょうか?
スタイルをビットマップか何かにしてタブオーダをピクチャコントロール→スタティック
にすればうまくいくはずです。
もっとも色を塗りつぶすだけならピクチャコントロールではなくてスタティックでも十分
でしょう。
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)のスタイルをフレームとビットマップで試して
みましたが、だめでした。
なにか足りないところがあるでしょうか?
塗りつぶすブラシを返さないと。
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;
といった感じに。
Blue様、ありがとうございます。
おかげさまで、希望通りのことが実現できました。
お忙しい所ありがとうございました。助かりました。