プロが教える店舗&オフィスのセキュリティ対策術

環境:Windows XP Home、Visual C++
WINAPIにてボタンの色を変更したいと思っております。
ですので、オーナードローで作成しようと思ったのですが、
色だけ変更したいだけなのに文字列やその他といった、
全てを自分で書かなくちゃいけなくなりました。

他に簡単に出来る方法は無いのでしょうか?

以下に一応、したい事を記述します。
ボタンをクリックした時に、
ChooseColorダイアログを表示して、選択させる。
もしOKでダイアログを閉じた場合、
ボタンはそこで選択した色に変更させる。

よろしくお願いします。

A 回答 (1件)

 こんばんは。



 ただ着色するだけならば、WM_CTLCOLORBTNで、ブラシをすり替えれば良いみたいです。
 http://m--takahashi.com/bbs/pastlog/07200/07144. …

 どちらにしろ、「押されて凹んだ・テキスト表示」等は、WM_DRAWITEMを処理する羽目に陥るようです。
 以下参考程度に(手間は大して変らない事が分かると思います)。

typedef struct __brush
{
HBRUSH hbr;
COLORREF color;
COLORREF arCustColor[16];
} brush;

static brush s_brush = {::CreateSolidBrush(0)};

static int CallCC(HWND hWnd, brush* p)
{
CHOOSECOLOR cc= {sizeof(cc)};
cc.hwndOwner= hWnd;
cc.lpCustColors = p->arCustColor;
cc.rgbResult= p->color;
cc.Flags= CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT;

if(!::ChooseColor(&cc))return 0;

//必ず開放する
if(p->hbr)::DeleteObject(p->hbr);
p->hbr = ::CreateSolidBrush(p->color = cc.rgbResult);

return 1;
}

int CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
const WORD wNotifyCode= HIWORD(wParam);
const WORD wID= LOWORD(wParam);
HWND hwndCtl= (HWND)lParam;

const LPDRAWITEMSTRUCT lpdis= (LPDRAWITEMSTRUCT)lParam;

switch(uMsg)
{
case WM_INITDIALOG:
return FALSE;

case WM_COMMAND:
if(wID != IDC_BUTTON1)
break;

if(::CallCC(hDlg, &s_brush))
{
::InvalidateRect(hwndCtl, 0, TRUE);
}
break;

case WM_CTLCOLORBTN:
if(::GetDlgCtrlID((HWND)lParam) == IDC_BUTTON1)
{
HDC hDC = (HDC)wParam;
::SetBkMode(hDC, TRANSPARENT);
//テキスト色はブラシの色を反転させたものにする
::SetTextColor(hDC, ~s_brush.color & 0xffffff);
return (BOOL)s_brush.hbr;
}
break;

case WM_DRAWITEM:
if(lpdis->CtlID != IDC_BUTTON1)
break;

switch(lpdis->itemAction)
{
case ODA_SELECT:
::DrawEdge(lpdis->hDC, &lpdis->rcItem, BDR_SUNKENINNER, BF_RECT);
break;

case ODA_FOCUS:
::DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
break;

case ODA_DRAWENTIRE:
::FillRect(lpdis->hDC, &lpdis->rcItem, s_brush.hbr);
::DrawText(lpdis->hDC, "色彩選択", 8, &lpdis->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
}
return FALSE;
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
どっちにしろ手間がかかるのですね。
ボタンの色のみ変更は普通にあると思っていたのですが、
案外、ないものなんですね。

お礼日時:2008/11/16 18:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!