添加如下两个函数 隐藏:
void CMainFrame::OnHide() {
if(m_wndToolBar.IsWindowVisible())
m_wndToolBar.ModifyStyle(WS_VISIBLE,0); SendMessage(WM_SIZE); } 显示:
void CMainFrame::OnShow() {
if(!m_wndToolBar.IsWindowVisible())
m_wndToolBar.ModifyStyle(0,WS_VISIBLE); SendMessage(WM_SIZE); }
23. 如何动态获取工具条指针并给工具条加标题?
[问题提出]
工具条也是窗口,是窗口就有标题,如何给工具条加标题? [程序实现]
不想动态改变工具条的标题就在CMainFrame::OnCreate()中: int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { ......
m_wndToolBar.SetWindowText(_T(\return 0; }
若想动态改变工具条的标题,如下:
声明一个菜单,并响应事件,如响应:OnMyToolBar()函数 void CMainFrame::OnMyToolBar() {
// TODO: Add your command handler code here
CToolBar *pToolBar = (CToolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
pToolBar->SetWindowText (_T(\}
不要在TooBar悬浮时做OnMyToolBar()会出错的. 顺便提一下如何获得状态条的指针:
CStatusBar * pStatusBar =(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
24. 在状态条中显示鼠标的设备坐标与逻辑坐标
显示器的设备坐标系的原点在客户区的左上角,x轴向右增长,y轴向下增长。我们要设置的逻辑坐标系的原点则在客户区的中心,x轴向右增长,y轴向上增长,如一个笛卡尔坐标系一般。
为CChildView添加一个成员函数
void OnPrepareDC(CDC * pDC, CPrintInfo * pInfo = NULL);
void OnPrepareDC(CDC * pDC, CPrintInfo * pInfo){ CRect rect;
// 设置映射模式为LOMETRIC (0.1mm),右上为增长方向 pDC->SetMapMode (MM_LOMETRIC);
// 将坐标原点定在客户区的中心 GetClientRect(rect);
pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2); }
为CChildView响应鼠标移动消息,并在状态条中显示鼠标的坐标值。m_ptMouse数据成员是原打算做十字交叉线用的,在此使用没有实际意义。
void CChildView::OnMouseMove(UINT nFlags, CPoint point){ CClientDC dc(this); CString str;
OnPrepareDC(&dc);
//要访问类CMainFrame,需要将mainfrm.h文件引入
CMainFrame * pFrame = (CMainFrame *) AfxGetApp()->m_pMainWnd;
//要访问CMainFrame的数据成员m_wndStatusBar,需要手工修改mainfrm.h,public这个数据成员
CStatusBar * pStatus = (CStatusBar *) &pFrame->m_wndStatusBar;
m_ptMouse = point;
str.Format (\设备坐标 X=%i pixel, Y=%i pixel\ pStatus->SetPaneText(1, str);
dc.DPtoLP(&m_ptMouse);
str.Format (\逻辑坐标 X=%i * 0.1mm, Y=%i * 0.1mm\ pStatus->SetPaneText(2, str); }
25. 如何用VC++ 动态修改应用程序菜单
[问题提出]
本文将介绍一些使用CMenu的方法,如查找指定菜单,在指定选项前添加菜单项.....
[解决方法]
使用CWnd::GetMenu( )访问主菜单,GetMenu( )返回指向CMenu对象的指针,它有一些成员函数,允许我们修改一个菜单。 1) 如何实现找到一个菜单项: 步骤如下: {
//动态修改菜单: // Get the Main Menu
CMenu* pMainMenu = AfxGetMainWnd()->GetMenu(); CMenu* pSubMenu = NULL; int i;
for (i=0; i<(int)pMainMenu->GetMenuItemCount(); i++)
{
pSubMenu = pMainMenu->GetSubMenu(i);
if (pSubMenu && pSubMenu->GetMenuItemID(0) == ID_FILE_NEW) break; }
CString s;
s.Format(\菜单项的位数. AfxMessageBox(s); ASSERT(pSubMenu); }
2) 动态编辑菜单:
步骤如下(可以用上例的pSubMenu,要加的菜单你自己定义.):
1) 添加一个称为Wzd2,命令ID为IDC_NAME_NEW1的菜单命令到该菜单中,可以用:
pSubMenu->AppendMenu(0,IDC_NAME_NEW1,\
2) 在New1前插入New2,可以用:
pSubMenu->InsertMenu(IDC_NAME_NEW1,MF_BYCOMMAND,IDC_NAME_NEW2, \
3) 把New1改变成New3,可以用:
pSubMenu->ModifyMenu(IDC_NAME_NEW1,MF_BYCOMMAND,IDC_NAME_NEW3, \
4) 删除该菜单中第二项,可以用:
pSubMenu->RemoveMenu(1,MF_BYPOSITION);
26. VC++中的3D按钮的编程
运行AppWizard生成一个基于对话框的test工程,在对话框中加入一个CButton控件。在CButton控件的General属性页将控件的ID改为IDC_3DTEXTBTN,Caption改为“谁与争疯”,在控件Styles属性页选中OwnerDraw,其余设置保持默认。
用classwizard创建一个新类:C3dTextButton,基类为CButton。为C3dTextButton类添加一个protected的函数void Draw(CDC* pDC, const CRect& rect, UINT state)。如下
所示编写代码:
void C3dTextButton::Draw(CDC *pDC, const CRect &rect, UINT state) {
CString text; GetWindowText(text); int l=text.GetLength(); CRect rectClient=rect;
//获得控件的字体 CFont* pFont=GetFont();
//确定所选字体有效高度和宽度 LOGFONT logfont;
pFont->GetObject(sizeof(LOGFONT),&logfont); if(logfont.lfHeight==0)logfont.lfHeight=20; logfont.lfWidth=0;//宽度设为0,宽度值由高度确定 logfont.lfWeight=1000;
logfont.lfEscapement=logfont.lfOrientation=0;
CFont tryfont; VERIFY(tryfont.CreateFontIndirect(&logfont)); CFont* pFontOld=pDC->SelectObject(&tryfont);
//根据控件大小,调整字体的高度,使文本与控件协调 CSize textSizeClient=pDC->GetTextExtent(text,l);
if(rectClient.Width()*textSizeClient.cy>rectClient.Height()*textSizeClient.cx) {
logfont.lfHeight=::MulDiv(logfont.lfHeight,rectClient.Height(),textSizeClient.cy); } else{
logfont.lfHeight = ::MulDiv(logfont.lfHeight,rectClient.Width(),textSizeClient.cx); }
//创建并选择协调后的字体
CFont font; font.CreateFontIndirect(&logfont); pDC->SelectObject(&font);
textSizeClient=pDC->GetTextExtent(text,l); //确定文本与控件边界的距离minx,miny