转自: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);//设置可以被停靠
本文介绍如何使用MFC定制应用程序界面,包括更改标题栏图标、状态栏添加时间显示及进度条、显示鼠标移动坐标,以及如何增加启动画面和设置工具栏。
3128

被折叠的 条评论
为什么被折叠?



