ut 或者 CDC:: DrawText 并指定 DT_EXPANDTABS 标志来完 成。TabbedTextOut 函数允许指定标签位的数组,下例指定每 20 设备单位展开 一个 标签: voidCSampleView:: OnDraw (CDC* pDC) { CTestDoc* pDoc=GetDocument (); ASSERT_VALID (pDoC); CStringstr; str.Format (_T ("Cathy\tNorman\tOliver")); intnTabStop=20; //tabs are every 20 pixels pDC->TabbedtextOut (10, 10, str, 1, &;nTabStop, 10); } 55、串太长时如何在其末尾显示一个省略号 调用 CDC:: DrawText 并指定 DT_END_ELLIPSIS 标志,这样就可以用小略号 取代 串末尾的字符使其适合于指定的边界矩形。如果要显示路径信息,指定 DT_END_ELLIPSIS 标志并省略号取代串中间的字符。
voidCSampleView:: OnDraw (CDC* pDC) { CTestDoc* pDoc=GetDocument (); ASSERT_VALID (pDoc); //Add ellpsis to end of string if it does not fit pDC->Drawtext (CString ("This is a long string"), CRect (10, 10, 80, 30), DT_LEFT | DT_END_ELLIPSIS); //Add ellpsis to middle of string if it does not fit pDC->DrawText (AfxgetApp () ->m_pszhelpfilePath, CRect (10, 40, 200, 60), DT_LEFT | DT_PATH_ELLIPSIS); } 56、如何快速地格式化一个 CString 对象 调用 CString:: Format,该函数和 printf 函数具有相同的参数,下例说明 了 如何使用 Format 函数: //Get size of window. CRectrcWindow; GetWindowRect (rcWindow); //Format message string. CStringstrMessage; strMessage.Format (_T ("Window Size (%d, %d)"), rcWindow.Width (), rcWindow.Height ()); //Display the message. MessageBox (strmessage); 57、为什么即使调用 EnableMenuItem 菜单项后,菜单项还处于禁止状态 需要将 CFrameWnd:: m_bAutomenuEnable 设置为 FALSE,如果该数据成员为 TRUE(缺省值),
工作框将自动地禁止没有 ON_UPDATE_COMMAND_UI 或者 ON_COMMAND 的菜单项。 //Disable MFC from automatically disabling menu items. m_bAuoMenuEnable=FALSE; //Now enable the menu item. CMenu* pMenu=GetMenu (); ASSERT_VALID (pMenu); pMenu->EnableMenuItem (ID_MENU_ITEM,MF_BYCOMMAND | MF_ENABLED);
58、如何给系统菜单添加一个菜单项 给系统菜单添加一个菜单项需要进行下述三个步骤: 首先, 使用 Resource Symbols 对话 (在 View 菜单中选择 Resource Symbols. ..可以显示该对话)定义菜单项 ID,该 ID 应大于 0x0F 而小于 0xF000; 其次,调用 CWnd::GetSystem
Menu 获取
系统菜单的指针并调用 CWnd:: Appendmenu 将菜单项添加到菜单中。下例给系统菜单添加两个新的 菜单项: intCMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct) { … //Make sure system menu item is in the right range. ASSERT (IDM_MYSYSITEM &;0xFFF0)==IDM_MYSYSITEM); ASSERT (IDM-MYSYSITEM<0xF000); //Get pointer to system menu. CMenu* pSysmenu=GetSystemmenu (FALSE); ASSERT_VALID (pSysMenu); //Add a separator and our menu item to system menu. CStringStrMenuItem (_T ("New menu item")); pSysMenu->Appendmenu (MF_SEPARATOR); pSysMenu->AppendMenu (MF_STRING, IDM_MYSYSITEM, strMenuitem); … } 现在,选择系统菜单项时用户应进行检测。使用 ClassWizard 处理 WM_SYSCOMMAND 消息并检测用户菜单的 nID 参数: voidCMainFrame:: OnSysCommand (UINT nID,LPARAMlParam) { //Determine if our system menu item was selected. if ( (nID&; 0xFFF0)==IDM_MYSYSITEM) { //TODO-process system menu item } else CMDIFrameWnd::OnSysCommand (nID, lParam); } 最后,一个
设计良好的 UI 应用
程序应当在系统菜单项加亮时在状态条显示 一
个帮助信息,这可以通过增加一个包含系统菜单基 ID 的串表的入口来实现。 59、如何确定顶层菜单所占据的菜单行数 这可以通过简单的减法和除