電子書籍の厳選無料作品が豊富!

初歩的な質問で申し訳ありません。
色々なHPを徘徊して調べているのですが、どうしてもうまくいきません。
コードはメッセージループに次のように記述しています。

---------------------------------------------------------
case WM_CTLCOLORBTN:
  // 白色のブラシハンドルを返す
  return (LRESULT)GetStockObject(WHITE_PEN);

case WM_CTLCOLORSTATIC:
  SetTextColor((HDC)wParam, RGB(255, 255, 255));
  // 黒色のブラシハンドルを返す
  return (LRESULT)GetStockObject(BLACK_PEN);
---------------------------------------------------------

これでボタンは白、スタティックは黒地に白文字で表示されると思ったのですが、
ボタンは色が何も変わらず、スタティックは文字の周りを囲むように黒くなり、
肝心の文字の地は白のままでした。

解決策を知っている方、どうか教えていただけませんか?
ちなみに、MFCは諸事情により使用できません。

A 回答 (2件)

ボタンはオーナードローしか知りません。


オーナードローなら、コントロールのスタイルでBS_OWNERDRAWを加えれば
描画のたびにWM_DRAWITEMが来るようになります。
そうでなく、指定した時だけなら、PostMessage(xx, xx, SBT_OWNERDRAW, xx);
でWM_DRAWITEMが来ます。
オーナードローすると最初に定義したボタンの文字が消えます。

LPDRAWITEMSTRUCT lpDI;
RECT rect;

case WM_DRAWITEM:
 lpDI = (LPDRAWITEMSTRUCT)lParam;
 CopyRect(&rect, &lpDI->rcItem);
 FillRect(lpDI->hDC, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));
 SetBkMode(lpDI->hDC, TRANSPARENT);//普通は灰色の文字の地に透過を指定
 TextOut(lpDI->hDC, rect.left, rect.top, "ボタンの文字", 12);
 return 0L;


スタティックは文字の地の指定を追加しました。

case WM_CTLCOLORSTATIC:
 SetTextColor((HDC)wParam, RGB(255, 255, 255));//テキスト自体の色。
 SetBkColor((HDC)wParam, RGB(0, 0, 0));//普通は白の文字の地に黒を指定。
 //↑は、代わりにSetBkMode((HDC)wParam, TRANSPARENT);で透過を指定してもいい。
 return (LRESULT)GetStockObject(BLACK_BRUSH);
    • good
    • 0

ブラシハンドルを返すのでしたら


 return (LRESULT)GetStockObject(WHITE_PEN);
 return (LRESULT)GetStockObject(BLACK_PEN);

 return (LRESULT)GetStockObject(WHITE_BRUSH);
 return (LRESULT)GetStockObject(BLACK_BRUSH);
にかえればいいと思います。
    • good
    • 0

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