孙鑫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);//设置可以被停靠
阅读本文前,我们假设您已经:
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);//设置可以被停靠
相关文章推荐
- 孙鑫VC++视频学习笔记之4:文本编辑和字处理软件
- 孙鑫VC++视频学习笔记之13:文档与串行化
- Part2:Unity学习笔记十二 - Space Shooter(从视频最后一课向Done_Main.unity场景修改的过程)
- ASP.NET Core 2.0系列学习笔记-应用程序修改默认端口支持外网IP访问
- 孙鑫VC学习(第9课--修改应用程序外观(工具栏、状态栏))
- 孙鑫VC视频教程笔记之第九课“程序外观修改及工具栏状态栏编程”
- 孙鑫VC++视频学习笔记之14:网络编程
- 孙鑫-MFC笔记十--修改应用程序外观
- 孙鑫VC++视频学习笔记之6: 对话框编程(1)
- 孙鑫VC++视频学习笔记
- Part2:Unity学习笔记十五 - Space Shooter(从视频最后一课向Done_Main.unity场景修改的过程)
- Part2:Unity学习笔记十七 - Space Shooter(从视频最后一课向Done_Main.unity场景修改的过程)
- 学习笔记 --- LINUX应用调试之修改内核输出应用程序的段错误信息
- 《VC++深入详解》学习笔记[8]——第9章 定制应用程序外观
- Part2:Unity学习笔记十四 - Space Shooter(从视频最后一课向Done_Main.unity场景修改的过程)
- 孙鑫VC++视频学习笔记之1: Windows程序内部运行机制
- 孙鑫VC++视频学习笔记之10: 图形绘制与通用对话框
- 孙鑫VC++视频学习笔记(第六课 菜单的工作原理及编写控件)
- Part2:Unity学习笔记十六 - Space Shooter(从视频最后一课向Done_Main.unity场景修改的过程)
- 孙鑫VC++视频学习笔记之12:文件操作