孙鑫VC++视频学习笔记之9: 应用程序外观修改

本文介绍如何使用MFC定制应用程序界面,包括更改标题栏图标、状态栏添加时间显示及进度条、显示鼠标移动坐标,以及如何增加启动画面和设置工具栏。

转自:http://webbery.tianyablog.com

  阅读本文前,我们假设您已经:
   1,知道如何创建一个单文档的App Wizard
   2,知道C++ 类、函数重载等简单知识
   3,知道如何给View类或者Doc文档添加成员变量
   4,会用MFC的IDE调试工具最好,那么本文的程序您可以copy去调试
   5,知道如何为某个框架类添加虚函数或消息处理函数
  
   
  
  更改标题栏图标
  
  事先已经添加IDI_ICON1、IDI_ICON2、IDI_ICON3资源。注意要实现代码,须把变量定义成全局或者用其他方式
  
  HICON m_hI1=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
  HICON m_hI2=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));
  HICON m_hI3=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));
  
  SetClassLong(m_hWnd,GCL_HICON,(LONG)m_h1);
  
  一、在状态栏上添加时间显示
  
  1,在String_Table中添加IDS_NEW
  
  2,IDS_NEW添加到CMainFrame的indicator中
  
  3,CMainFrame::OnCreate()中return 之前
  
   CTime t=CTime::GetCurrentTIme();
   CString str=t.Format("%H:%M:%S");
   m_wndStatusBar.SetPaneText(1,str);
  
  //int index=m_wndStatusBar.CommandToIndex(IDS_NEW);
  
  //m_wndStatusBar.SetPaneText(index,str);
  
  //调整显示宽度
  
  CClinetDC dc(this);
  CSize sz=dc.GetTextExtent(str);
  m_wndStatusBar.SetPaneInfo(index,IDS_NEW,SBPS_NORMAL,sz.cx);
  
  4,为适时更新设置定时器。在CMainFrame::OnTimer()中复制下面代码如下:
  
   CTime t=CTime::GetCurrentTIme();
   CString str=t.Format("%H:%M:%S");
  
  //调整显示宽度
  
  CClinetDC dc(this);
  CSize sz=dc.GetTextExtent(str);
  m_wndStatusBar.SetPaneInfo(1,IDS_NEW,SBPS_NORMAL,sz.cx);
  m_wndStatusBar.SetPaneText(1,str);
  
  5,在CMainFrame::()启动计时器
  
  SetTimer
  
  二、进度栏
  
  一)创建一个进度栏
  
  1,在MainFrame.h中添加CProgressCtrl对象
  
  CProgressCtrl m_progress;
  
  2,在CMainFrame::OnCreate()中返回前创建之
  
  m_progress.Create(WS_CHILD | WS_VISIBLE,CRect(100,100,200,120),this,123);
  
  3,设置位置
  
  m_progress.SetPos(50);
  
  4,垂直进度栏
  
  m_progress.Create(WS_CHILD | PBS_VERTICAL,CRect(100,100,120,200),this,123);
  
  5,进度栏放入状态栏窗格
  
   CRect r;
  
   m_wndStatusBar.GetItemRect(2,&r);
  
  //创建时大小和父窗口都改变
  
   m_progress.Create(WS_CHILD | WS_VISIBLE |PBS_SMOOTH,r,&m_wndStatusBar,123);
  
   以上即为实现代码,但是放在OnCreate函数中不能实现:因为OnCreate()返回前状态栏的位置还没有确定,所以无法获得各个子窗格位置,只能用自定义消息办法响应。
  
  1)定义消息
  
  在MainFrame.h前面添加
  
  #define UM_PROGREE WM_USER
  
  2)消息响应函数原形的声明宏
  
  在MainFrame.h中添加 afx_msg void OnProgress();//可以添加两个参数
  
  3)消息映射
  
  在MainFrame.cpp中//}}AFX_MSG_MAP之后添加映射
  
  ON_MESSAGE(UM_PROGRESS,OnProgress)
  
  4)实现消息响应函数
  
  void CMAinFrame::OnProgress()
  
  {
  
  CRect r;
   m_wndStatusBar.GetItemRect(2,&r);
   m_progress.Create(WS_CHILD | WS_VISIBLE,r,&m_wndStatusBar,123);//创建时大小和父窗口都改变
   m_progress.SetPos(50);
  }
  
  5)在OnCreate()中发送消息
  
  PostMessage(UM_PROGRESS);//注意不要用SendMessage();
  
  此时的进度栏在状态栏上的位置时固定的,不会随状态栏位置变化而变化
  
  6)使进度栏与状态栏位置相关联
  
  把OnCreate()中的PostMessage()删除使之失效.
  
  首先添加OnPaint()消息函数
  
  窗口改变重绘会发送WM_PAINT消息,所以只要在OnPaint函数中处理即可.以下代码添加到OnPaint()中
  
   CRect r;
  
   m_wndStatusBar.GetItemRect(2,&r);
  
   if(!m_progress.m_hWnd)m_progress.Create(WS_CHILD | WS_VISIBLE,r,&m_wndStatusBar,123);//创建时大小和父窗口都改变
  
  else m_progress.MoveWindow(r);//或者SetWindowPos()函数
  
   m_progress.SetPos(50);
  
  
  
  二)将移动坐标适时显示到状态栏上
  
  1,添加OmMouseMove()函数
  
  2,将状态栏变量访问权限改变,备用
  
  在MainFrame.h中
  
  m_wndStatusBar变量改为公用
  
  3,在view.cpp中包含MainFrame.h
  
  4,在OnMouseMove()中添加
  
  CString s;
  
  s.Format("x=%d,y=%d",point.x,point.y);
  
  //将以下情况之一添加添加此处即可实现
  
  1)((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
  2)((CMainFrame*)GetParent())->SetMessageText(str);
  3)((CMainFrame*)GetParent())->GetMessageBar()->SetMessageText(str);//状态栏可以不公有
  4)GetDescenddantWindow()根据ID号搜索子孙窗口,直到找到指针
  
  主框架状态栏ID号为AFX_IDW_STATUS_BAR
  GetParent()->GetDescenddantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);
  
  三、给软件增加启动画面
  
  1,菜单Project=>Add to Project=>Component and Control,对话框中选择Visual C++ Components,选择Splash screen选择插入,选OK并关闭
  
  2,系统自动增加CSplashWnd类; 在CMainFrame::OnCreate()中添加了CSplashWnd::SHowSplashScreen(this);
  
  3,在CSplashWnd::OnCreate()中有SetTimer(1,750,NULL);设置750ms的启动画面显示间隔
  
  4,自定义显示界面的话,可以依照这个类进行

 

四、设置工具栏

设置ON_COMMAND函数

void CMainFrame::OnMyBar()
{
    if(!m_newbar.IsWindowVisible())
    {
        m_newbar.ShowWindow(SW_SHOW);

    }
    else   
    {
        m_newbar.ShowWindow(SW_HIDE);

    }
    RecalcLayout();
    DockControlBar(&m_newbar);//重设可以被停靠
    // TODO: 在此添加命令处理程序代码
}

设置ON_UPDATE_COMMAND_UI函数

void CMainFrame::OnUpdateMyBar(CCmdUI *pCmdUI)
{
    if(m_newbar.IsWindowVisible())
    {
        GetMenu()->GetSubMenu(2)->CheckMenuItem(ID_32775,MF_CHECKED   );
    }
    else
        GetMenu()->GetSubMenu(2)->CheckMenuItem(ID_32775,MF_UNCHECKED   );
    // TODO: 在此添加命令更新用户界面处理程序代码
}

 

在 CMainFrame 的OnCreate函数中 设置

    m_newbar.EnableDocking(CBRS_ALIGN_ANY);//设置可以停靠
    DockControlBar(&m_newbar);//设置可以被停靠

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值