if ( lpDIS -> itemState & ODS_DISABLED )
{
nState = DSS_DISABLED;
}
dc.DrawState( rect.TopLeft(), rect.Size(), DrawStateProc,
( LPARAM )lpDIS, nState, ( HBRUSH )NULL );
最后清除设备环境以完成D r a w I t e m ( )函数:
// cleanup
d c . S e t TextColor( fg );
dc.SetBkMode( nBkMode );
d c . D e t a c h ( ) ;
5) 为该新菜单类增加C D C : : D r a w S t a t e ( ) 回调函数
接下来创建C D C : : D r a w S t a t e ( )所需要的回调函数并再次为其封装设备环境句柄和矩形来启
动该函数:
BOOL CALLBACK DrawStateProc( HDC hdc, LPARAM lData, WPARAM wData,
int cx, int cy )
{
CDC dc;
L P D R AWITEMSTRUCT lpDIS = ( LPDRAWITEMSTRUCT )lData;
dc.Attach( hdc );
M E N U E N T RY *pEntry = ( MENUENTRY * )lpDIS -> itemData;
CRect rect( 0, 0, cx, cy );
如果在以上的I n i t M e n u ( ) 中发现了一个匹配的工具栏,这一步将在菜单项 C D C : : B i t B l t 函数
中绘制与之相关联的位图:
if ( pEntry -> inx != -1 )
{
CDC memDC;
memDC.CreateCompatibleDC( &dc );
memDC.SelectObject( pEntry -> pBitmap);
dc.BitBlt( rect.left, rect.top, BUTTON_WIDTH, BUTTO N _ H E I G H T,
&memDC, pEntry -> inx*BUTTON_WIDTH, 0, SRCCOPY );
m e m D C . D e l e t e D C ( ) ;
}
下一步查看该菜单项是否被设置为复选,如果是,则绘制一个特定的复选标记,该复选
标记是在图标编辑器(Icon Editor)中创建的位图。如果在最后一步没有绘制位图,该复选标记
将单独存在:
HICON hIcon;
if ( lpDIS -> itemState & ODS_CHECKED &&
( hIcon = AfxGetApp() -> LoadIcon( IDI_CHECK_ICON ) ) )
{
dc.DrawIcon( rect.left, rect.top, hIcon );
}
下面用D r a w Te x t ( ) >为该菜单项绘制文本字符串,此时使用 D r a w Te x t ( ) 函数使“&”之后的
字符产生下划线表示该字符标识的按键作为快捷键。 D r a w Te x t ( )还将对齐文本并扩展标签:
rect.left += BUTTON_WIDTH + 2;
第 5 章第菜单、控件条和状态栏第第89
评论8
最新资源