我想创建一个包含 256 个彩色按钮的数组,所有者为使用 Visual Studio 对话框设计工具创建的对话框绘制扩展样式。我在对话过程中向 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 个按钮。我打算使用不同的画笔为每个按钮着色,但对于调试用途,我替换了一个定义明确的画笔。我已经调试了代码并对每个按钮的 x/y 坐标和 hMenu createwindow 调用中提供的 ID 是正确的感到满意。我看到所有 256 个按钮都在 WM_CTLCOLORBTN 处理程序中着色。我包括了一项检查以确保 createwindow 调用不返回失败 (NULL)。通过在 createwindow 调用中交换 x/y 参数,我可以获得 4 行 16 个按钮或 4 列 16 个按钮。
如果我从 createwindow 调用中删除 BS_OWNERDRAW 位,则会绘制所有 256 个按钮。
就好像 BS_OWNERDRAW 有 64 个按钮的限制 :-(
任何帮助将不胜感激!
TIA,迈克