vc++经典技巧总结(7)

2019-03-15 17:13

添加如下两个函数 隐藏:

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


vc++经典技巧总结(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《电动力学》知识点归纳及典型试题分析

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: