【转】第九章 应用程序外观修改

阅读本文前,我们假设您已经:
         1,知道如何创建一个单文档的App Wizard
         2,知道C++ 类、函数重载等简单知识
         3,知道如何给View类或者Doc文档添加成员变量
         4,会用MFC的IDE调试工具最好,那么本文的程序您可以copy去调试 
         5,知道如何为某个框架类添加虚函数或消息处理函数
  
 

更改标题栏图标

事先已经添加IDI_ICON1IDI_ICON2IDI_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添加到CMainFrameindicator

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,自定义显示界面的话,可以依照这个类进行

 

    欢迎以任何形式转载本文,只要对您有用
    欢迎给我来信 webbery (at) sohu (dot) com (分别用@,.替换at,dot)

    韦伯主页: http://mail.ustc.edu.cn/~bywang(提供此笔记系列相关源程序下载)
    韦伯Blog: http://webbery.tianyablog.com
参考书目和网站: 
    (1)孙鑫VC++视频
    (2)1-6章主要参考: hbyufan的BLog
    (3)11-20章主要参考: songpeng的Blog

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值