按钮自绘的有关问题
按钮自绘的问题
程序运行后正常,但当我单击按钮时就会报错
提示 什么内存不可读
请问怎么回事啊?
DrawItem函数如下
void CCircleButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
CDC btnDC;
btnDC.Attach( lpDrawItemStruct-> hDC );
UINT state = lpDrawItemStruct-> itemState;
CBitmap btnBmp;
if( !btnBmp.LoadBitmap( m_bmpID ) )
{
return ;
}
CSize bmpSize;
// bmpSize = btnBmp.GetBitmapDimension( );
BITMAPINFO bmpInfo;
btnBmp.GetObject( sizeof( bmpInfo ) , ( void* )&bmpInfo );
bmpSize.cy = bmpInfo.bmiHeader.biHeight;
bmpSize.cx = bmpInfo.bmiHeader.biWidth;
CRect btnRect;
GetClientRect( btnRect );
MapWindowPoints( GetParent( ) , btnRect );
MoveWindow( btnRect.left , btnRect.top ,
bmpSize.cx , bmpSize.cy );
hRgn = CreateEllipticRgn( 0 , 0 , bmpSize.cx , bmpSize.cy );
SetWindowRgn( hRgn ,TRUE );
btnDC.SetBkMode( TRANSPARENT );
CBrush* pOldBrush , bmpBrush;
CPen* pOldPen;
bmpBrush.CreatePatternBrush( &btnBmp );
pOldBrush = btnDC.SelectObject( &bmpBrush );
if((state&ODS_SELECTED) || state&ODS_FOCUS)
{
btnDC.Ellipse( 0 , 0 , bmpSize.cx , bmpSize.cy );
}
else
{
CPen pen( PS_NULL , 1 ,RGB(0,0,0) );
pOldPen = btnDC.SelectObject( &pen );
btnDC.Ellipse( -1 , -1 , bmpSize.cx + 2 , bmpSize.cy + 2 );
}
CString txtStr;
GetWindowText( txtStr );
btnDC.SetTextColor( m_txtColor );
btnDC.DrawText( txtStr , CRect( 0 , 0 , bmpSize.cx , bmpSize.cy ) , DT_CENTER | DT_VCENTER | DT_SINGLELINE );
btnDC.SelectObject( pOldPen );
btnDC.SelectObject( pOldBrush );
------解决方案--------------------
有些东西用完之后要及时Delete掉,否则就会出现楼主的情况
------解决方案--------------------
设个断点,看哪里出错`
------解决方案--------------------
SetWindowRgn( hRgn ,TRUE );这是设置按钮区域的操作,通常放在PreSubClassWindow中操作,而且得到位图的信息也不需这么麻烦定义一个BITMAP bminfo;而后btnBmp.GetBitmap(&bminfo)就可以了吧。
程序运行后正常,但当我单击按钮时就会报错
提示 什么内存不可读
请问怎么回事啊?
DrawItem函数如下
void CCircleButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
CDC btnDC;
btnDC.Attach( lpDrawItemStruct-> hDC );
UINT state = lpDrawItemStruct-> itemState;
CBitmap btnBmp;
if( !btnBmp.LoadBitmap( m_bmpID ) )
{
return ;
}
CSize bmpSize;
// bmpSize = btnBmp.GetBitmapDimension( );
BITMAPINFO bmpInfo;
btnBmp.GetObject( sizeof( bmpInfo ) , ( void* )&bmpInfo );
bmpSize.cy = bmpInfo.bmiHeader.biHeight;
bmpSize.cx = bmpInfo.bmiHeader.biWidth;
CRect btnRect;
GetClientRect( btnRect );
MapWindowPoints( GetParent( ) , btnRect );
MoveWindow( btnRect.left , btnRect.top ,
bmpSize.cx , bmpSize.cy );
hRgn = CreateEllipticRgn( 0 , 0 , bmpSize.cx , bmpSize.cy );
SetWindowRgn( hRgn ,TRUE );
btnDC.SetBkMode( TRANSPARENT );
CBrush* pOldBrush , bmpBrush;
CPen* pOldPen;
bmpBrush.CreatePatternBrush( &btnBmp );
pOldBrush = btnDC.SelectObject( &bmpBrush );
if((state&ODS_SELECTED) || state&ODS_FOCUS)
{
btnDC.Ellipse( 0 , 0 , bmpSize.cx , bmpSize.cy );
}
else
{
CPen pen( PS_NULL , 1 ,RGB(0,0,0) );
pOldPen = btnDC.SelectObject( &pen );
btnDC.Ellipse( -1 , -1 , bmpSize.cx + 2 , bmpSize.cy + 2 );
}
CString txtStr;
GetWindowText( txtStr );
btnDC.SetTextColor( m_txtColor );
btnDC.DrawText( txtStr , CRect( 0 , 0 , bmpSize.cx , bmpSize.cy ) , DT_CENTER | DT_VCENTER | DT_SINGLELINE );
btnDC.SelectObject( pOldPen );
btnDC.SelectObject( pOldBrush );
------解决方案--------------------
有些东西用完之后要及时Delete掉,否则就会出现楼主的情况
------解决方案--------------------
设个断点,看哪里出错`
------解决方案--------------------
SetWindowRgn( hRgn ,TRUE );这是设置按钮区域的操作,通常放在PreSubClassWindow中操作,而且得到位图的信息也不需这么麻烦定义一个BITMAP bminfo;而后btnBmp.GetBitmap(&bminfo)就可以了吧。