外观设计

工具栏编程
   1、删除按钮:按住鼠标左键,将按钮拖出工具栏,拖出少许即是增加竖线
   2、CToolBar类
      void EnableDocking( DWORD dwStyle );让工具栏可以停靠
      CFrameWnd::EnableDocking
      Call this function to enable dockable control bars in a frame window. By default, control bars
      will be docked to a side of the frame window in the following order: top, bottom, left, right.
      CFrameWnd::DockControlBar:让工具栏停靠在主窗口上
      A、创建一个工具栏资源
      B、在头文件中构造一个工具栏对象,在OnCreate消息中创建
       if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT
  | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  !m_newToolBar.LoadToolBar(IDR_TOOLBAR1))
{
  TRACE0("Failed to create toolbar\n");
  return -1;      // fail to create
}
        m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);
        DockControlBar(&m_newToolBar);
      C、隐藏工具栏
         1、CFrameWnd::RecalcLayout:重新调整工具栏停靠位置
            void CMainFrame::OnNewtool()
            {
               if(m_newToolBar.IsWindowVisible())
       {
        m_newToolBar.ShowWindow(SW_HIDE);
       }
        else
       {
        m_newToolBar.ShowWindow(SW_SHOW);
       }
      RecalcLayout();
      DockControlBar(&m_newToolBar);
            }
        2、CFrameWnd::ShowControlBar
           CFrameWnd::ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),TRUE);
        void CMainFrame::OnUpdateNewtool(CCmdUI* pCmdUI)
        {
             pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());
        }
4、状态栏编程
   1、CStatusBar  m_wndStatusBar;
   2、OnCreate消息
      if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,
           sizeof(indicators)/sizeof(UINT)))
{
  TRACE0("Failed to create status bar\n");
  return -1;      // fail to create
}
      指示器的定义:
      static UINT indicators[] =
      {
ID_SEPARATOR,           // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
      };
    3、字符串表中新增IDS_PROGRESS与IDS_TIMER,在指示器数组后增加IDS_PROGRESS与IDS_TIMER
       显示系统时间:
       static CTime PASCAL GetCurrentTime();
       CTime time=CTime::GetCurrentTime();OnCreate消息
       CString str=time.Format("%H:%M:%S");
       显示在状态栏:
       CStatusBar::SetPaneText
       m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(IDS_TIMER),str,TRUE);
       改变窗格宽度:
       CStatusBar::SetPaneInfo
       CClientDC dc(this);
       CSize sz=dc.GetTextExtent(str);
       m_wndStatusBar.SetPaneInfo(m_wndStatusBar.CommandToIndex(IDS_TIMER),IDS_TIMER,SBPS_NORMAL,
                                   sz.cx);
       即时更新时间:
       在Timer消息响应中增加
        CTime time=CTime::GetCurrentTime();
CString str=time.Format("%H:%M:%S");
    CClientDC dc(this);
        CSize sz=dc.GetTextExtent(str);
m_wndStatusBar.SetPaneInfo(m_wndStatusBar.CommandToIndex(IDS_TIMER),IDS_TIMER,SBPS_NORMAL,sz.cx);
m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(IDS_TIMER),str,TRUE);
5、进度栏
   CProgressCtrl::CProgressCtrl、CProgressCtrl::Create
   1、添加类成员变量
      CProgressCtrl m_proctrl;
   2、在窗体创建完成后,返回之前创建,OnCreate消息
      m_proctrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,CRect(100,100,200,120),this,123);
   3、设置进度位置:CProgressCtrl::SetPos
   4、垂直进度栏:
      m_proctrl.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,CRect(100,100,120,200),this,123);
   5、进度栏放入状态栏:必须在OnCreate执行完成之后再进行获取状态栏矩形区域大小工作
      获取状态栏矩形区域大小:CStatusBar::GetItemRect
      m_wndStatusBar.GetItemRect(1,&rect);
      要让OnCreate完成后获取状态栏矩形区域,我们必须通过自定义消息来完成,为了避免与Windows定义了
      的消息重复,我们查看WM_USER发现只要大于WM_USER即可
      #define UM_PROGRESS WM_USER+1
      afx_msg void OnProgress();消息响应函数声明
      ON_MESSAGE(UM_PROGRESS,OnProgress)消息映射,位于CMainFrame类的构造函数中
      处理消息响应函数:
      void CMainFrame::OnProgress()
      {
        CRect rect;
m_wndStatusBar.GetItemRect(1,&rect);
   //  m_proctrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,CRect(100,100,200,120),this,123);
m_proctrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,123);
m_proctrl.SetPos(50);*/
      }
      在OnCreate消息中发送UM_PROGRESS消息,发送消息不能用SendMessage函数,而用PostMessage函数
      PostMessage是将消息发送到消息队列中,然后按消息顺序取出,非SendMessage立即返回。在OnCreate
      里添加PostMessage(UM_PROGRESS);
      状态栏发生变化,进度栏位置跟着变化:当窗口发生重绘的时候,必须重新获取矩形区域,在响应WM_PAINT
      消息时重新获取矩形区域,并且判断进度栏是否创建,没有创建则创建之,否则移动进度栏即可。
      void CMainFrame::OnPaint()
     {
CPaintDC dc(this); // device context for painting
CRect rect;
m_wndStatusBar.GetItemRect(1,&rect);
if(!m_proctrl.m_hWnd)
{
    m_proctrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,123);
}
else
{
  m_proctrl.MoveWindow(rect);
}
m_proctrl.SetPos(50);
      }
       实践证明必须注释前面的PostMessage(UM_PROGRESS)或者加入判断
      让进度栏动起来:CProgressCtrl::StepIt、CProgressCtrl::SetStep:设置步长
6、将鼠标坐标放入状态栏
   在View类增加OnMouseMove消息,在代码中包含头文件"MainFrm.h"
   void CStyleView::OnMouseMove(UINT nFlags, CPoint point)
   {
        CString str;
str.Format("x=%d,y=%d",point.x,point.y);
((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
((CMainFrame*)GetParent())->SetMessageText(str);
        ((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);
        GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);
CView::OnMouseMove(nFlags, point);
    }
   或者利用函数CFrameWnd::SetMessageText或者CFrameWnd::GetMessageBar或者CWnd::GetDescendantWindow
   临时窗口对象与永久窗口对象
7、启动画面:
   "工程"--"增加到工程"--"组件和控件"--"C++组件"--"Splash screen"
   增加了位图资源,CSplashWnd类
  

你可能感兴趣的:(外观设计)