您的位置:首页 > 编程语言 > C语言/C++

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

2009-12-26 01:25 441 查看
转自: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);//设置可以被停靠
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐