是SDI工程在CMainFrame的Create中把菜单设置成了自画-------------------------------------------------------------------------------
我自画菜单,但是,却只画了每个子菜单下的第一个分隔符,其它的都没有画,为什么?
-------------------------------------------------------------------------------这是我更改菜单为自画菜单样式的函数(自定义自画菜单类):
void CAutoMenu::SetAutoDrawStyle( CMenu *pMenu )
{
int i, j;
j = pMenu->GetMenuItemCount();
for ( i = 0; i < j; i++ )
{
CMenu *pSubMenu = pMenu->GetSubMenu( i );
if ( pSubMenu != NULL )
{
SetAutoDrawStyle( pSubMenu );
}
else
{
MENUITEMINFO mii;
mii.fMask = MIIM_TYPE;
pMenu->GetMenuItemInfo( i, &mii, true ); //最后一个参数是false也一样
pMenu->ModifyMenu( i, mii.fType | MFT_OWNERDRAW | MFT_STRING );
}
}
}这是自画菜单的测试函数:
void CAutoMenu::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
if ( !m_bSetAlready )
return; LPDRAWITEMSTRUCT pit = lpDrawItemStruct;
CString strText; m_pMenu->GetMenuString( pit->itemID, strText, MF_BYCOMMAND );
::FillRect( pit->hDC, &pit->rcItem, CBrush(RGB(200, 150, 150)) );
static int iCount;
//strText.Format( "%d", iCount );
::TextOut( pit->hDC, pit->rcItem.left, pit->rcItem.top, strText.GetBuffer(strText.GetLength()),
strText.GetLength() );
iCount ++;
}在CMainFrame中:
(其中的m_AutoMenu为CMainFrame中声明的CAutoMenu类型的变量)
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
...
CMenu *pMenu = GetMenu();
m_AutoMenu.SetMenu( pMenu );
... return 0;
}void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
CFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
m_AutoMenu.DrawItem( lpDrawItemStruct );
}void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO: Add your message handler code here and/or call default
CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
m_AutoMenu.MeasureItem( lpMeasureItemStruct );
}
我自画菜单,但是,却只画了每个子菜单下的第一个分隔符,其它的都没有画,为什么?
-------------------------------------------------------------------------------这是我更改菜单为自画菜单样式的函数(自定义自画菜单类):
void CAutoMenu::SetAutoDrawStyle( CMenu *pMenu )
{
int i, j;
j = pMenu->GetMenuItemCount();
for ( i = 0; i < j; i++ )
{
CMenu *pSubMenu = pMenu->GetSubMenu( i );
if ( pSubMenu != NULL )
{
SetAutoDrawStyle( pSubMenu );
}
else
{
MENUITEMINFO mii;
mii.fMask = MIIM_TYPE;
pMenu->GetMenuItemInfo( i, &mii, true ); //最后一个参数是false也一样
pMenu->ModifyMenu( i, mii.fType | MFT_OWNERDRAW | MFT_STRING );
}
}
}这是自画菜单的测试函数:
void CAutoMenu::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
if ( !m_bSetAlready )
return; LPDRAWITEMSTRUCT pit = lpDrawItemStruct;
CString strText; m_pMenu->GetMenuString( pit->itemID, strText, MF_BYCOMMAND );
::FillRect( pit->hDC, &pit->rcItem, CBrush(RGB(200, 150, 150)) );
static int iCount;
//strText.Format( "%d", iCount );
::TextOut( pit->hDC, pit->rcItem.left, pit->rcItem.top, strText.GetBuffer(strText.GetLength()),
strText.GetLength() );
iCount ++;
}在CMainFrame中:
(其中的m_AutoMenu为CMainFrame中声明的CAutoMenu类型的变量)
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
...
CMenu *pMenu = GetMenu();
m_AutoMenu.SetMenu( pMenu );
... return 0;
}void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
CFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
m_AutoMenu.DrawItem( lpDrawItemStruct );
}void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO: Add your message handler code here and/or call default
CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
m_AutoMenu.MeasureItem( lpMeasureItemStruct );
}
CAutoMenu::SetAutoDrawStyle,即void CAutoMenu::SetMenu( CMenu *pMenu )
{
if ( m_bSetAlready )
return;
m_bSetAlready = true;
m_pMenu = pMenu;
SetAutoDrawStyle( pMenu );
}在设置自画样式的函数里把 mii.fMask = MIIM_TYPE; 一行注释掉也一样
MENUITEMINFO mii;
mii.fMask = MIIM_TYPE;// | MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU;
pMenu->GetMenuItemInfo( i, &mii, true );
pMenu->ModifyMenu( i, mii.fType | MF_BYPOSITION | MFT_OWNERDRAW | MFT_STRING );
之后,都有了自画,但是却变成了一个很窄的小竖条,怎么办呀?
( i, mii.fType | MF_BYPOSITION | MFT_OWNERDRAW | MFT_STRING );
pMenu->GetSubMenu(0)->TrackPopupMenu
(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x,
point.y, this);我回答了你的问题,你回答我一个:
“老板说mis部不是赚钱的部门...”是什么意思?
上次我看到你的名字就纳闷了一大会儿:
mis : miss ? mission ?....
还以为你要动态创建浮动菜单呢 //修改菜单风格为自绘
pMenu->ModifyMenu(i,MF_BYPOSITION|MF_OWNERDRAW,lpItem->uID,(LPCTSTR)lpItem);
一句中,lpItem是从何而来?
一般是拥有计算机网络的工厂会有“老板说mis部不是赚钱的部门...”
这一句话一直都让我郁闷。我上个工作是台湾的一个很大的电脑主板维修厂里的mis部(当程序员),后来一个特高级主管说,其它的部门都是会赚钱,就你们mis部门不但不会赚钱,反而还要花钱!超郁闷呀,如果用这种理念来经营一个企业,我想,这个企业迟早会完蛋的,最起码它永远都不会变成一个可以让人害怕的对手企业,不会成为世界性的大企业,因为那种眼光,是如此之短浅,是如此之落后,是让人如此之不屑
......................
[email protected]
送他一个风筝,然后把线剪断,让他和其它风筝一起比赛试试。偶开始还以为是miss呢,一个公司里面的miss不赚钱也没有什么,漂亮就好^o^
我用别人的MenuEx,我新建一个工程就可以,但我要在我现在已经ok的工程中添加就不行,都是和新建的工程的添加步骤一模一样的,但就是不行,哎,晕了已经
我晚上回来看,现在去dating , 嘿嘿 ^o^
不行,这程序不能外泄(不好意思)这是原来的程序,我是修改的,只能编译成release,不能debug,这一点一直都郁闷,调试非常不方便我不管它了,等客户要求时再说吧,但是我自己还是应该把这个弄会的,说不定以后会有用的 :)
---------------------
老兄,是什么意思?还没有见过这个词 ( * - * )
用他们的类来做,一直不行,后来才发现一个问题:
用他们的类,CMainFrame的父类必需是CMDIWnd(好象没有记错吧),但我的却不是这算什么问题嘛