首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

小弟我以为这是一个wm_ctlcolorbtn的经典异常用法

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

热点排行