Visual Studio のダイアログ デザイン ツールで作成されたダイアログ ボックスに、所有者が拡張スタイルを描画する 256 色のボタンの配列を作成したいと考えています。これを行うために、ダイアログ プロシージャの WM_INITDIALOG メッセージ ハンドラにループを追加しました。
for (i=0; i<=255; i++)
{
int xp, yp;
HWND status;
xp = rect_pos.left+16*(i%16);
yp = rect_pos.top+16*(i>>4);
status = CreateWindow (
TEXT("button"),
"\0",
WS_CHILD|WS_VISIBLE|BS_OWNERDRAW|BS_PUSHBUTTON,
xp,
yp,
15,
15,
hDlg,
(HMENU) 5000+i, // id used to report events
hInst,
NULL
);
if (status == NULL)
xp =7;
}
WM_CTLCOLORBTN メッセージのメッセージ ハンドラーを追加しました。
case WM_CTLCOLORBTN:
{
int zz;
zz = GetWindowLong ((HWND) lParam, GWL_ID); // window identifier
zz -= 5000;
if ((zz >= 0) && (zz <= 255))
{
HBRUSH BS;
SetTextColor ((HDC) wParam, Collector.Color);
SetBkColor ((HDC) wParam, Collector.Color);
return ((LRESULT) Collector.Brush);
}
break;
}
多かれ少なかれ機能しますが、最初の 64 個のボタンしか表示されません。各ボタンに色を付けるために別のブラシを使用するつもりですが、デバッグ用に、明確に定義された 1 つのブラシに置き換えました。私はコードをデバッグし、各ボタンの x/y 座標が適切であり、hMenu createwindow 呼び出しで提供された ID が適切であることを確認しました。WM_CTLCOLORBTN ハンドラで 256 個のボタンすべてが色付けされるのを見ました。createwindow 呼び出しが失敗 (NULL) を返さないことを確認するためのチェックを含めました。createwindow 呼び出しで x/y パラメーターを交換することで、16 ボタンの 4 行または 16 ボタンの 4 列のいずれかを取得できます。
createwindow 呼び出しから BS_OWNERDRAW ビットを削除すると、256 個のボタンすべてが描画されます。
BS_OWNERDRAW では 64 個のボタンに制限があるかのようです :-(
どんな助けでも大歓迎です!
ティア、マイク