MFC SDI单文档 状态栏 进度条 启动画面编程技巧 ...

 

 

 

状态栏的编程离不开  CStatusBar类     CProgressCtrl  进 度条相关的控件      下面我们介绍状态栏 编程技巧  以及在状态栏添加进度条   应用程序的启动界面

   状态栏的添加步骤     SDI 单文档中      下面是MFC给的 状态栏的创建步骤
 
   Construct the CStatusBar object.
   构造一个 CStatusBar对象

   Call the Create (or CreateEx) function to create the status-bar window and attach it to the CStatusBar object.
   调用CreateEx函数创建一个状态栏 

   Call SetIndicators to associate a string ID with each indicator
   
   调用SetIndicators 为每个指示器附加一个 字符串资源ID    static  UINT indicators[]={
                                                                                  ........                                            

 

                                                                                       };

     1.       下面是在框架类的处理 添加我们自己的状态栏指示器   我们可以定义自己的指示器数组 
               
             static UINT indicator[] =
          {
 ID_SEPARATOR,           // status line indicator  最长的那个格索引为 0
 ID_INDICATOR_CAPS,    //每个代表一个字符串资源
 ID_INDICATOR_NUM,
 ID_INDICATOR_SCRL,    
         ......             //这里增加字符串资源 会反映到状态栏
        };
 

     OnCreate(LPCREATESTRUCTION lp)函数中  有如下代码
            
               if (!m_wndStatusBar.Create(this) ||                 //创建
  !m_wndStatusBar.SetIndicators(indicator,           //设置指示器的个数
    sizeof(indicator)/sizeof(UINT)))
 {
  TRACE0("Failed to create status bar\n");
  return -1;      // fail to create
 }

 
 
  2.给状态栏 指定ID号的指示器 增加时间  这时候用到 CTime类 获得系统时间    下面是代码 CStatusBar  m_statusBar;   在相应WM_PAINT消息相应函数 OnPaint

       SetTimer(1000,1000,NULL);  

 

    捕获WM_TIMER消息    在OnTimer函数中 添加如下代码
                      

                   
                                   CTime  time=CTime::GetCurrentTime();// 经过静态方法返回一个CTime对象

                                   CString str=time.Format("%H:%M:%S"); //格式化时间 到str 

       CClientDC dc(this);  //创建一个 框架类的dc
       CSize size=dc.GetTextExtent(str);  //获得字符串中在屏幕上显示的尺寸
       int index =m_wndStatusBar.CommandToIndex(IDS_TIMER);  //通过ID获取索引
       m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,size.cx);  //设置指示器的宽度  

                                   m_wndStatusBar.SetPaneText(index,str); //设置指定索引指示器的文本

 

                      
 
 3.在状态栏的 IDS_PROGRESS上添加一个 进度条     CProgressCtrl  类       在框架类增加变量  CProgressCtrl  m_progress;  

 在OnPaint函数  添加代码响应  WM_PAINT消息 

    
        CRect rect;    //创建CRect对象
  m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect); //获得一个指定索引的指示器的矩形区域

 
  if(!m_progress.m_hWnd)   //判断句柄是否为空
  {
 m_progress.Create(PBS_SMOOTH|WS_CHILD|WS_VISIBLE,rect,&m_wndStatusBar,123);     //如果句柄为空那么创建进度条

  }
  else
  {
   m_progress.MoveWindow(&rect);  //否则移动到当前区域

  }
 m_progress.SetPos(50);  //设置进度条初始位置  50 

 在 OnTimer函数中加上    m_stausBar.StepIt();//进度条按指定步长 一秒 前进一次

 

4.在最长的指示器上显示 视图的X  Y坐标    我们需要相应视图的  WM_MOUSEMOVE事件  并且调用 框架类的函数执行  

#include "MainFrm.h"
void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{

   CString str="";
   str.Format("x=%d,y=%d",point.x,point.y);
     //   (((CMainFrame*)GetParent())->m_wndStatusBar).SetWindowText(str);   //直接通过状态栏指针设置索引为0指示器
    //      (((CMainFrame*)GetParent())->m_wndStatusBar).SetPaneText(0,str);  //设置按钮文本 索引为0

    //    ((CMainFrame*)GetParent())->SetMessageText(str);//框架类的函数 直接设置 索引为0的状态栏指示器文本
 
    // ((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);  //通过框架类函数获得 状态栏指针 然后调用SetWindowText设置文本

  

  GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);    //CWnd类的函数获得一个子孙窗体的指针 我们可以传递状态栏ID获得
 CView::OnMouseMove(nFlags, point);
}

 

5.增加启动画面   我们可以利用向导增加之后 我们自行设置 启动画面的 style

project->add to project  ->comments  controls    添加->  vc++  components  -> splash screen   就完成了启动画面的添加  

对于启动时间  画面 我们可以自行在生成的类中设置
            

                          

 

 

            

 

 

 

 

 

 

 

 

 

时间: 2024-08-01 13:09:37

MFC SDI单文档 状态栏 进度条 启动画面编程技巧 ...的相关文章

MFC SDI单文档应用程序贴图

   //我们在进行贴图的时候需要将背景擦除  贴图之后我们返回TRUE告诉操作系统已经擦出了背景  如果调用基类的OnEraseBKknd那么 //我们的贴图会被再次擦除就看不到贴图了  //在对向指定设备拷贝位图之前 我们先要在内存中准备位图 我们创建一个和目的DC兼容的兼容DC 并且将位图选择到 兼容DC然后进行拷贝 //返回TRUE我们不擦背景直接贴 那么不会出现闪烁 /*BOOL CBitBltView::OnEraseBkgnd(CDC* pDC) {     CDC dcCompa

MFC下 SDI 单文档 对话框 工具栏编程总结 新手值得一看,

  创建工具栏 分2种情况   对话框的工具栏  和 SDI 单文档工具栏编程      用到的函数        RecalcLayout     当窗体布局发生改变的时候  调用这个函数会调用 RePositionBar重新摆放工具条      ShowControlBar   显示隐藏 工具栏的函数     CControlBar是CToolBar的基类      IsWindowVisible  CWnd的函数返回BOOL  检测从CWnd派生的 窗体是否可见      CCmdUI  

vs2013-创建mfc程序 单文档 不修改任何代码 直接生成 触发断点……

问题描述 创建mfc程序 单文档 不修改任何代码 直接生成 触发断点-- 创建mfc程序 单文档 不修改任何代码 直接生成 触发断点-- 提示 诸如 0x77A53B93 (ntdll.dll)处(位于 Trying first.exe 中)引发的异常: 0xC0000374: 堆已损坏. (参数: 0x77A6DDD8).0x77A53B93 (ntdll.dll) (Trying first.exe 中)处有未经处理的异常: 0xC0000374: 堆已损坏. (参数: 0x77A6DDD8

SDI单文档视图, 采用基于CFormView的视图, 如何在程序初始化和运行中手动设置mainFrame和View的大小?

问题描述 SDI单文档视图,采用基于CFormView的视图,如何在程序初始化和运行中手动设置mainFrame和View的大小?我在BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){if(!CFrameWnd::PreCreateWindow(cs))returnFALSE;//TODO:在此处通过修改//CREATESTRUCTcs来修改窗口类或样式cs.cx=1280;cs.cy=1024;returnTRUE;}不起作用,显示的大小和对话框

cximage sdi 单文档-CXimage Demo 改为单文档应用程序后,文档类里面的线程,发送消息视类收不到?

问题描述 CXimage Demo 改为单文档应用程序后,文档类里面的线程,发送消息视类收不到? 最近下载了一个CxImage 的Demo源程序,但Demo是基于多文档的,我想把它改成单文档,就先实验了一个功能--向左旋转,但在线程里面发的消息视类没有收到,有没有人知道原因? 我是一个新手,请高手帮忙

sdi-SDI单文档视图分割问题

问题描述 SDI单文档视图分割问题 按照网上的例程,进行单文档视图分割,新建了一个类CLeftView类,继承自CTreeView,当在CMainFrame的OnCreatClient中添加如下代码(m_wndSplitter 是CMainFrame中的CSplitterWnd 类型的变量): if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE; if (!m_wndSplitter.CreateView(0, 0, RUNTIME

mfc-VS2010建立了MFC单文档工程,想在窗口添加滑动条slider

问题描述 VS2010建立了MFC单文档工程,想在窗口添加滑动条slider 我用的VS2010,建立了MFC单文档工程,想要添加slider调节一些值.我封装了对话框类,但在视图类用CMyDialog dlg;dlg.DoMoDal()调用还是不显示,求大神们指导 解决方案 CMyDialog 对话框的OnInitDialog中是否创建slider控件,这个控件是否添加到对话框资源 解决方案二: 解决方案三: 换用对话框工程,没问题了 解决方案四: codeproject上搜索CScrollH

MFC单文档,浮动工具条和浮动菜单消失问题

问题描述 用VS2010创建一个标准的经典的单文档程序,默认的工具条和菜单是可以浮动的,就是可以停靠在任何位置.问题来了:当工具条菜单条不停靠在窗口边上,而是浮动到桌面其他位置时,这时当主窗口失去焦点(比如:在桌面其他位置点击鼠标),工具条和菜单条就消失了,不显示了.这个效果是不希望出现的,我想,任何时候,浮动的工具条和菜单条都应该显示才对,有无高手解决此问题? 解决方案

c++-关于MFC含有多个对话框的单文档程序 文件操作

问题描述 关于MFC含有多个对话框的单文档程序 文件操作 最近在做MFC的课程设计,有关单文档的.涉及到txt文件的操作 有什么好的办法可以方便对文件的操作 我之前做C语言的课程设计的时候是将txt文件里的东西全都读到一个全局变量的结构体数组里,程序对数组操作完之后把原来的文件删掉再重新把数组里的内容写进去. 虽然根据这种办法可以用类对象数组来处理,但是由于MFC涉及到多个对话框,感觉这种办法不太好. 还麻烦各位大神指教 解决方案 在doc类里面去做文件操作,单文档多视图的意思是,一个doc类对