工具栏编程
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类
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类