お世話になります。
今、WinXp VC++6.0 SP5 MFC(App)で
ペイントの下部にあるようなパレット
コントロールを実装しようとしています。
下のようなものをダイアログエディタで作成し、
//IDD_MYDIALOGBAR
// __□はすべてピクチャーコントロール(IDC_COLOR1~IDC_COLOR28)
//|■ |□□□□□□□□□□□□□□
//|_■|□□□□□□□□□□□□□□
//ダイアログバー(m_wndDialogBar)としてCMainFrame
//のOnCreate内で作成しています。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
//(略)
if (!m_wndMyDialogBar.Create(this, IDD_MYDIALOGBAR,
CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,
IDD_MYDIALOGBAR))
{
TRACE0(Failed to create dialog bar m_wndMyDialogBar\n);
return -1; // 作成に失敗
}
m_wndMyDialogBar.EnableDocking(CBRS_ALIGN_BOTTOM);
EnableDocking(CBRS_ALIGN_BOTTOM);
DockControlBar(&m_wndMyDialogBar);
//(略)
}
そして、OnShowWindow内で下のように初期化しています。
void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus)
{
CFrameWnd::OnShowWindow(bShow, nStatus);
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
//塗りつぶす色の定義
COLORREF color[28] = {
RGB(0x00,0x00,0x00),RGB(0x80,0x80,0x80),
RGB(0x80,0x00,0x00),RGB(0x80,0x80,0x00),
RGB(0x00,0x80,0x00),RGB(0x00,0x80,0x80),
RGB(0x00,0x00,0x80),RGB(0x80,0x00,0x80),
RGB(0x80,0x80,0x40),RGB(0x00,0x40,0x40),
RGB(0x00,0x80,0xFF),RGB(0x00,0x40,0x80),
RGB(0x80,0x00,0xFF),RGB(0x80,0x40,0x00),
RGB(0xFF,0xFF,0xFF),RGB(0xC0,0xC0,0xC0),
RGB(0xFF,0x00,0x00),RGB(0xFF,0xFF,0x00),
RGB(0x00,0xFF,0x00),RGB(0x00,0xFF,0xFF),
RGB(0x00,0x00,0xFF),RGB(0xFF,0x00,0xFF),
RGB(0xFF,0xFF,0x80),RGB(0x00,0xFF,0x80),
RGB(0x80,0xFF,0xFF),RGB(0x80,0x80,0xFF),
RGB(0xFF,0x00,0x80),RGB(0xFF,0x80,0x40)
};
int nLoop=0;
CRect rect;
CDC * pDC;
CStatic * pStatic;
//ピクチャーコントロールのID(IDC_COLOR1~IDC_COLOR28で連番)
int nIDStart = IDC_COLOR1;
for(nLoop=0; nLoop<28; nLoop++, nIDStart++){
pStatic = NULL;
// ピクチャーコントロールを取得
pStatic = (CStatic *)m_wndMyDialogBar.GetDlgItem(nIDStart);
if(pStatic == NULL) continue;
// ピクチャーコントロールのデバイスコンテキストを取得
pDC = pStatic->GetDC();
// ピクチャーコントロールのRECTを取得
pStatic->GetClientRect(rect);
rect.DeflateRect(1,1);
// RECTを塗りつぶし
pDC->FillRect(rect, &CBrush(color[nLoop]));
// デバイスコンテキストを開放
ReleaseDC(pDC);
// pStatic->Invalidate();
}
// m_wndMyDialogBar.Invalidate();
}
アプリケーション起動時と終了時にここを通るのですが、
起動時に通ったときにはダイアログバーのピクチャーボックスは
初期化されず(画面に反映されない)、終了時に通ったときにはきちんと
初期化され、ウィンドウが閉じる直前に一瞬ピクチャーボックスに
色が表示されます。
プログラム内のコメントにしてある部分を入れても結果は同様でした。
これを起動時にきちんと初期化されるようにするにはどうしたらいいのでしょうか。
ご存知の方がいましたらどうぞご教授ください。
コントロールは画面に表示される時に自分自身を描画しますから、
それを上から塗りつぶしても意味がありません。
コントロールが描画処理をするときの
ブラシを変更するならば、WM_CTLCOLORを使います。
dairygoodsさん、回答ありがとうございます。
WM_CTLCOLORを使用するとの事ですけども、
OnCtlColor()ではピクチャーコントロールの
色を変更することはできませんでした。
もし、仮に変更できたとしても、
全てのピクチャーコントロールが同一の
色になってしまうと思うのですが。
なんとか他の方法で実現できないものでしょうか。
>OnCtlColor()ではピクチャーコントロールの
>色を変更することはできませんでした。
Staticテキストなら可能でしょう。
何も文字列を設定しなければ色のついた矩形になります。
>もし、仮に変更できたとしても、
>全てのピクチャーコントロールが同一の
>色になってしまうと思うのですが。
OnCtlColor()の引数を調べればどのコントロールからか
分かると思いますけど。
すいません。調査不足でした。
下のようにすることで解決できました。
ありがとうございました。
CColorTool::CColorTool()
{
COLORREF color[28] = {
RGB(0x00,0x00,0x00),RGB(0x80,0x80,0x80),
RGB(0x80,0x00,0x00),RGB(0x80,0x80,0x00),
RGB(0x00,0x80,0x00),RGB(0x00,0x80,0x80),
RGB(0x00,0x00,0x80),RGB(0x80,0x00,0x80),
RGB(0x80,0x80,0x40),RGB(0x00,0x40,0x40),
RGB(0x00,0x80,0xFF),RGB(0x00,0x40,0x80),
RGB(0x80,0x00,0xFF),RGB(0x80,0x40,0x00),
RGB(0xFF,0xFF,0xFF),RGB(0xC0,0xC0,0xC0),
RGB(0xFF,0x00,0x00),RGB(0xFF,0xFF,0x00),
RGB(0x00,0xFF,0x00),RGB(0x00,0xFF,0xFF),
RGB(0x00,0x00,0xFF),RGB(0xFF,0x00,0xFF),
RGB(0xFF,0xFF,0x80),RGB(0x00,0xFF,0x80),
RGB(0x80,0xFF,0xFF),RGB(0x80,0x80,0xFF),
RGB(0xFF,0x00,0x80),RGB(0xFF,0x80,0x40)
};
for(int nLoop=0;nLoop<28;nLoop++){
m_brush[nLoop].CreateSolidBrush(color[nLoop]);
}
}
HBRUSH CColorTool::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
// HBRUSH hbr = CDialogBar::OnCtlColor(pDC, pWnd, nCtlColor);
int CtrlID = pWnd->GetDlgCtrlID();
// TODO: この位置で DC のアトリビュートを変更してください
if(nCtlColor == CTLCOLOR_STATIC){
if(IDC_COLOR1 <= CtrlID && CtrlID <= IDC_COLOR28){
return m_brush[CtrlID - IDC_COLOR1];
}
}
// TODO: デフォルトのブラシが望みのものでない場合には、違うブラシを返してく
ださい
// return hbr;
return CDialogBar::OnCtlColor(pDC, pWnd, nCtlColor);
}