读书人

小弟我以为这是一个wm_ctlcolorbtn的经

发布时间: 2012-12-28 10:29:05 作者: rapoo

我以为这是一个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的参数你弄错了
[其他解释]
引用:
系统会帮你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;
}




[其他解释]

引用:
引用:系统会帮你SelectObject的,你返回刷子就是了

另外,GetStockObject的参数你弄错了

付完整代码,你可以尝试一下,依然不是红色的。rgb颜色是我从网上查询的。

顺便说一下,为什么我提selectobject,原因:帖子里用的是系统刷子,但是如用createbrushindirect的话,那么

……


最初我以为是自绘风格导致的, 于是去掉了自绘风格,结果还是这样。


[其他解释]
都说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

读书人网 >VC/MFC

热点推荐