孙鑫VC学习(第9课--修改应用程序外观(工具栏、状态栏))

来源:互联网 发布:知乎如何成为财务经理 编辑:程序博客网 时间:2024/06/06 02:03

新建一个工程,MFC单文档,名字为Test,单文档。

改变应用程序外观,应该在窗口创建之前修改。改变框架窗口的大小和外观,在BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中修改。

下面的程序是在窗口创建之前修改:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

      if( !CFrameWnd::PreCreateWindow(cs) )

             return FALSE;

      // TODO: Modify the Window class or styles here by modifying

      //  the CREATESTRUCT cs

      cs.cx=200;

      cs.cy=300;

      cs.style &=~ FWS_ADDTOTITLE;

      //cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER;//或者这样也可以。

      cs.lpszName="标题";//将文档标题改为自己的标题,因为系统的SDIstyle=WS_OVERLAPPEDWINDOW and FWS_ADDTOTITLE

 

      return TRUE;

}

下面的代码是在窗口创建之后修改:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加:
SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)&~WS_MAXIMIZEBOX );//
没有了最大化框。

修改窗口的图标,光标,背景。

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中添加:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

      if( !CFrameWnd::PreCreateWindow(cs) )

             return FALSE;

      // TODO: Modify the Window class or styles here by modifying

      //  the CREATESTRUCT cs

   WNDCLASS wdcls;

      wdcls.cbClsExtra=0;

      wdcls.cbWndExtra=0;

      wdcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);

      wdcls.hCursor=LoadCursor(NULL,IDC_HELP);

      wdcls.hIcon=LoadIcon(NULL,IDI_ERROR);

      wdcls.hInstance=AfxGetInstanceHandle( );

      wdcls.lpfnWndProc=::DefWindowProc;

      wdcls.lpszClassName="newclass";

      wdcls.lpszMenuName=NULL;//不会影响菜单的创建

      wdcls.style=CS_HREDRAW|CS_VREDRAW;

 

      RegisterClass(&wdcls);

 

      cs.lpszClass="newclass";

 

      return TRUE;

}

运行结果,仅ICON改变。背景和光标没有改变。(它们是VIEW类的,不是框架类的,要改变应该在VIEW类中);

下面代码:

BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs)

{

      // TODO: Modify the Window class or styles here by modifying

      //  the CREATESTRUCT cs

   cs.lpszClass="newclass";

      return CView::PreCreateWindow(cs);

}

在框架类中只能修改图标,下面是另一种方法:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

      if( !CFrameWnd::PreCreateWindow(cs) )

             return FALSE;

      // TODO: Modify the Window class or styles here by modifying

      cs.lpszClass=AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,0,0,

             ::LoadIcon(NULL, IDI_APPLICATION));

      return TRUE;

}

VIEW类中修改光标,背景色。

BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs)

{

      // TODO: Modify the Window class or styles here by modifying

      //  the CREATESTRUCT cs

   cs.lpszClass=AfxRegisterWndClass(

             CS_VREDRAW | CS_HREDRAW,

             ::LoadCursor(NULL, IDC_HELP),

             (HBRUSH) ::GetStockObject(BLACK_BRUSH),0);

      return CView::PreCreateWindow(cs);

}

 

在窗口创建之后,修改也可以用下面的方法:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加:

SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));

 

int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

      if (CView::OnCreate(lpCreateStruct) == -1)

             return -1;

      // TODO: Add your specialized creation code here

      SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));

      return 0;

}

 

下面完成一个不断变化的图标:

创建三个ICON

为框架类添加:

private:

      HICON m_hicon[3];

准备三幅图标:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

前添加:

extern CTestApp theApp;

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加:
   m_hicon[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

      m_hicon[1]=LoadIcon(AfxGetApp( )->m_hInstance,MAKEINTRESOURCE(IDI_ICON2));

      m_hicon[2]=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON3));

SetTimer(1,1000,NULL);

 

void CMainFrame::OnTimer(UINT nIDEvent)

{

      // TODO: Add your message handler code here and/or call default

      static int i=0;

      SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hicon[0]);

      SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hicon[++i%3]);

      CFrameWnd::OnTimer(nIDEvent);

}

 

下面是工具栏的编程:

为框架栏增加:

      CToolBar    m_newToolBar;

在资源中增加一个新的工具栏。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加下列代码:
if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP

             | 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);

      EnableDocking(CBRS_ALIGN_ANY);

      DockControlBar(&m_newToolBar);

 

添加一个显示新工具栏的菜单项。并加上标记。

void CMainFrame::OnNewToolbar()

{

      // TODO: Add your command handler code here

      if (m_newToolBar.IsVisible())

      {

             ShowControlBar( &m_newToolBar,FALSE,FALSE);// ShowControlBar可以显示一个控件在原先的位置上。

      }

      else

      {

             //m_newToolBar.ShowWindow(SW_SHOW);

             ShowControlBar( &m_newToolBar,TRUE,FALSE);

      }

}

或者:

void CMainFrame::OnNewToolbar()

{

      // TODO: Add your command handler code here

      CRect rect; //rect是用来存贮工具栏浮动时的位置的

      CFrameWnd* pParentFrame = m_newToolBar.GetDockingFrame();

      if(m_newToolBar.IsFloating())

      {

             pParentFrame->GetWindowRect(&rect);//获取工具栏位置,并存贮在rect

      }

      if(m_newToolBar.IsWindowVisible())

      {

             m_newToolBar.ShowWindow(SW_HIDE);

      }

      else

      {

             m_newToolBar.ShowWindow(SW_SHOW);

      }

      RecalcLayout();

      DockControlBar(&m_newToolBar);

      if(!rect.IsRectEmpty())

      {

             FloatControlBar(&m_newToolBar,CPoint(rect.left,rect.top));//使工具栏浮动到

      }

}

//上面对比一下,就可以知道ShowControlBar的使用方便了。

 

void CMainFrame::OnUpdateNewToolbar(CCmdUI* pCmdUI)

{

      // TODO: Add your command update UI handler code here

      if (m_newToolBar.IsVisible())

      {

             pCmdUI->SetCheck(1);

      }

      else

      {

             pCmdUI->SetCheck(0);

      }

}

 

下面是状态栏的编程:

在框架中:

static UINT indicators[] =

{

      ID_SEPARATOR,           // status line indicator

      ID_INDICATOR_CAPS,

      ID_INDICATOR_NUM,

      ID_INDICATOR_SCRL,

      ID_TIME,//show time

      ID_PROCESS//show process

};

在资源视图中的STRING中加入对ID_TIMEID_PROCESS的说明;

创建一个定时器,来显示时间。

void CMainFrame::OnTimer(UINT nIDEvent)

{

      // TODO: Add your message handler code here and/or call default

      CString str;

      CTime t = CTime::GetCurrentTime();

      str=t.Format("%H:%M:%S");

      m_wndStatusBar.SetPaneText( 4, str);

      CFrameWnd::OnTimer(nIDEvent);

}

 

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加:

CString str;

      CTime t = CTime::GetCurrentTime();

      str=t.Format("%H:%M:%S");

      CClientDC dc(this);

      CSize size=dc.GetTextExtent(str) ;

      m_wndStatusBar.SetPaneInfo( 4, ID_TIME, SBPS_NORMAL, size.cx );

   m_wndStatusBar.SetPaneText( 4, str);

 

下面创建一个进度栏:

为框架类增加:CProgressCtrl myCtrl;

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

      CRect rect;

   m_wndStatusBar.GetItemRect( 5, &rect );

      myCtrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, rect, &m_wndStatusBar, 1);

      //这样得到的rect是得不到的。因为在这时窗口在创建,是得不到窗口的区域大小的。

      myCtrl.SetPos(50);

   myCtrl.SetRange( 0, 100 );

 

为此代码修改如下:

在头文件中:#define UM_PROCRESS WM_USER+1202

afx_msg void OnProgress();

在。CPP中添加:
ON_MESSAGE(UM_PROCRESS,OnProgress)

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加:

PostMessage(UM_PROCRESS);

 

void CMainFrame::OnProgress()

{

      CRect rect;

   m_wndStatusBar.GetItemRect( 5, &rect );

      myCtrl.Create(WS_CHILD|WS_VISIBLE/*|PBS_SMOOTH*/, rect, &m_wndStatusBar, 1);

      //这样得到的rect是得不到的。因为在这时窗口在创建,是得不到窗口的区域大小的。

      myCtrl.SetPos(50);

   myCtrl.SetRange( 0, 100 );

}

上面的代码,当窗口变化的时候,进度栏会变化。下面是改进的代码:

PostMessage(UM_PROCRESS);这句代码不要了。

OnProgress()消息删除。

void CMainFrame::OnPaint()

{

      CPaintDC dc(this); // device context for painting

 

      CRect rect;

      m_wndStatusBar.GetItemRect( 5, &rect );

      if (!myCtrl.m_hWnd)

      {

             myCtrl.Create(WS_CHILD|WS_VISIBLE/*|PBS_SMOOTH*/, rect, &m_wndStatusBar, 1);

             myCtrl.SetPos(50);

       myCtrl.SetRange( 0, 100 );

      }

      else

      {

             myCtrl.MoveWindow(rect);

      }

}

让进度栏动起来:

OnTimer中添加:

myCtrl.SetStep(10);

myCtrl.StepIt();

下面将鼠标的坐标点在状态栏的第一个PANE显示出来。

在框架中包含#include "MainFrm.h"

将框架中的状态栏的成员变成公有的。

void CTestView::OnMouseMove(UINT nFlags, CPoint point)

{

      // TODO: Add your message handler code here and/or call default

      CString str;

      str.Format("x=%d,y=%d",point.x,point.y);

      ((CMainFrame*)GetParent())->m_wndStatusBar.SetPaneText(0,str);

//((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);

      // ((CMainFrame*)GetParent())->SetMessageText(str);

// ((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);

//((CMainFrame*)GetParent())->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);

CView::OnMouseMove(nFlags, point);

}

 

CStatusBar::Create

BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR );

 

下面创建一个窗口起动画面。

利用VC添加的走动画面的类CSplashWnd

可以在这个类中做相应的修改。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击