我以为这是一个wm_ctlcolorbtn的经典错误用法case WM_CREATE: pcs(LPCREATESTRUCT)lParam//默认创建butt
我以为这是一个wm_ctlcolorbtn的经典错误用法
case WM_CREATE:
pcs=(LPCREATESTRUCT)lParam; //默认创建button
hButton=CreateWindow(_T("button"),_T("按钮"),WS_CHILD|WS_VISIBLE,10\
,100,150,150,hWnd,(HMENU)IDC_BUTTON1, pcs->hInstance ,NULL);
ShowWindow(hButton,SW_SHOW);
return 0;
break;
case WM_CTLCOLORBTN:
return (LRESULT)GetStockObject(RGB(0,0,255));
break;
wparma-----dc, lparam------hwnd
windows程序设计,
他说,你想使用刷子,那么请selectobject(dc,刷子);
很明显我们的代码并没有选中到dc中!
于是修改为:
case WM_CTLCOLORBTN:
hBtnOldBrush=(HBRUSH)SelectObject((HDC)wParam,GetStockObject(RGB(255,255,255)));
return (LRESULT)GetStockObject(RGB(255,0,0));
break;
此时已经将系统刷子选中到了按钮的dc中了, 系统依然没有把按钮的除了文字之外的背景色变成红色!
依然不能凑效!
[最优解释]
case WM_CTLCOLORBTN:
//hBtnOldBrush=(HBRUSH)SelectObject((HDC)wParam,GetStockObject(RGB(255,0,0)));
return (LRESULT)GetStockObject(BLACK_BRUSH);
break;
case WM_ERASEBKGND:
{
//button的区域:10,100,150,150
RECT rect={10,50,150,300};
FillRect((HDC)wParam,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
return 1;
}
break;
好嘛,大神,
我用黑刷子行不,
按钮也的背景色也没背刷上啊。
另外:我发现一个有意思的问题:
wm_erasebkgnd只能刷 窗口的客户区。
客户区上的按钮,是不能刷的。
[其他解释]系统会帮你SelectObject的,你返回刷子就是了
另外,GetStockObject的参数你弄错了
[其他解释]付完整代码,你可以尝试一下,依然不是红色的。rgb颜色是我从网上查询的。
顺便说一下,为什么我提selectobject,原因:帖子里用的是系统刷子,但是如用createbrushindirect的话,那么
如果不手工选中,似乎要泄露了
无法保存老刷子的句柄
这又是另一个问题了
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static HWND hButton=NULL;
static HBRUSH bBtnBrush=NULL;
static HBRUSH hBtnOldBrush=NULL;
LPCREATESTRUCT pcs=NULL;
switch (message)
{
case WM_CREATE:
pcs=(LPCREATESTRUCT)lParam; //默认创建button
hButton=CreateWindow(_T("button"),_T("按钮"),WS_CHILD
[其他解释]WS_VISIBLE,10\
,100,150,150,hWnd,(HMENU)IDC_BUTTON1, pcs->hInstance ,NULL);
ShowWindow(hButton,SW_SHOW);
return 0;
break;
case WM_CTLCOLORBTN:
//hBtnOldBrush=(HBRUSH)SelectObject((HDC)wParam,GetStockObject(RGB(255,0,0)));
return (LRESULT)GetStockObject(RGB(255,0,0));
break;
/*case WM_DRAWITEM:
if(((LPDRAWITEMSTRUCT)lParam)->CtlID==IDC_BUTTON1)
{
if(!SetWindowText(((LPDRAWITEMSTRUCT)lParam)->hwndItem,_T("xsx")))
{
int nRErr=2;
}
}
return 0;
break;*/
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
[其他解释]
最初我以为是自绘风格导致的, 于是去掉了自绘风格,结果还是这样。
[其他解释]都说GetStockObject的参数你弄错了,不是颜色值来的
BLACK_BRUSH
DKGRAY_BRUSH
DC_BRUSH
GRAY_BRUSH
HOLLOW_BRUSH
LTGRAY_BRUSH
NULL_BRUSH
BLACK_PEN
[其他解释]你要红色的刷子,需要自己创建的
[其他解释]HBRUSH hBrush=CreateSolidBrush(RGB(255,0,0))
[其他解释]我试了下,没问题啊
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
static HWND hButton=NULL;
static HBRUSH bBtnBrush=NULL;
static HBRUSH hBtnOldBrush=NULL;
LPCREATESTRUCT pcs=NULL;
switch (message)
{
case WM_CREATE:
pcs=(LPCREATESTRUCT)lParam; //默认创建button
hButton=CreateWindow(_T("button"),_T("按钮"),WS_CHILD