﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-frenet</title><link>http://www.cppblog.com/frenet/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 17 Apr 2026 00:42:15 GMT</lastBuildDate><pubDate>Fri, 17 Apr 2026 00:42:15 GMT</pubDate><ttl>60</ttl><item><title>外观设计</title><link>http://www.cppblog.com/frenet/archive/2012/02/18/165880.html</link><dc:creator>frenet</dc:creator><author>frenet</author><pubDate>Fri, 17 Feb 2012 22:10:00 GMT</pubDate><guid>http://www.cppblog.com/frenet/archive/2012/02/18/165880.html</guid><wfw:comment>http://www.cppblog.com/frenet/comments/165880.html</wfw:comment><comments>http://www.cppblog.com/frenet/archive/2012/02/18/165880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/frenet/comments/commentRss/165880.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/frenet/services/trackbacks/165880.html</trackback:ping><description><![CDATA[<div>工具栏编程<br />&nbsp;&nbsp; 1、删除按钮：按住鼠标左键，将按钮拖出工具栏，拖出少许即是增加竖线<br />&nbsp;&nbsp; 2、CToolBar类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void EnableDocking( DWORD dwStyle );让工具栏可以停靠<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFrameWnd::EnableDocking<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Call this function to enable dockable control bars in a frame window. By default, control bars<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; will be docked to a side of the frame window in the following order: top, bottom, left, right.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFrameWnd::DockControlBar:让工具栏停靠在主窗口上<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A、创建一个工具栏资源<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B、在头文件中构造一个工具栏对象,在OnCreate消息中创建<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT<br />&nbsp; | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||<br />&nbsp; !m_newToolBar.LoadToolBar(IDR_TOOLBAR1))<br />{<br />&nbsp; TRACE0("Failed to create toolbar\n");<br />&nbsp; return -1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // fail to create<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DockControlBar(&amp;m_newToolBar);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C、隐藏工具栏<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、CFrameWnd::RecalcLayout:重新调整工具栏停靠位置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CMainFrame::OnNewtool()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_newToolBar.IsWindowVisible())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_newToolBar.ShowWindow(SW_HIDE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_newToolBar.ShowWindow(SW_SHOW);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RecalcLayout();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DockControlBar(&amp;m_newToolBar);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、CFrameWnd::ShowControlBar<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFrameWnd::ShowControlBar(&amp;m_newToolBar,!m_newToolBar.IsWindowVisible(),TRUE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CMainFrame::OnUpdateNewtool(CCmdUI* pCmdUI)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pCmdUI-&gt;SetCheck(m_newToolBar.IsWindowVisible());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />4、状态栏编程<br />&nbsp;&nbsp; 1、CStatusBar&nbsp; m_wndStatusBar;<br />&nbsp;&nbsp; 2、OnCreate消息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(indicators)/sizeof(UINT)))<br />{<br />&nbsp; TRACE0("Failed to create status bar\n");<br />&nbsp; return -1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // fail to create<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指示器的定义:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static UINT indicators[] =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />ID_SEPARATOR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // status line indicator<br />ID_INDICATOR_CAPS,<br />ID_INDICATOR_NUM,<br />ID_INDICATOR_SCRL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />&nbsp;&nbsp;&nbsp; 3、字符串表中新增IDS_PROGRESS与IDS_TIMER，在指示器数组后增加IDS_PROGRESS与IDS_TIMER<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示系统时间:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static CTime PASCAL GetCurrentTime();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CTime time=CTime::GetCurrentTime();OnCreate消息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString str=time.Format("%H:%M:%S");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示在状态栏:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CStatusBar::SetPaneText<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(IDS_TIMER),str,TRUE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 改变窗格宽度:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CStatusBar::SetPaneInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CClientDC dc(this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CSize sz=dc.GetTextExtent(str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_wndStatusBar.SetPaneInfo(m_wndStatusBar.CommandToIndex(IDS_TIMER),IDS_TIMER,SBPS_NORMAL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sz.cx);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 即时更新时间:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Timer消息响应中增加<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CTime time=CTime::GetCurrentTime();<br />CString str=time.Format("%H:%M:%S");<br />&nbsp;&nbsp;&nbsp; CClientDC dc(this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CSize sz=dc.GetTextExtent(str);<br />m_wndStatusBar.SetPaneInfo(m_wndStatusBar.CommandToIndex(IDS_TIMER),IDS_TIMER,SBPS_NORMAL,sz.cx);<br />m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(IDS_TIMER),str,TRUE);<br />5、进度栏<br />&nbsp;&nbsp; CProgressCtrl::CProgressCtrl、CProgressCtrl::Create<br />&nbsp;&nbsp; 1、添加类成员变量<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CProgressCtrl m_proctrl;<br />&nbsp;&nbsp; 2、在窗体创建完成后，返回之前创建，OnCreate消息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_proctrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,CRect(100,100,200,120),this,123);<br />&nbsp;&nbsp; 3、设置进度位置:CProgressCtrl::SetPos<br />&nbsp;&nbsp; 4、垂直进度栏:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_proctrl.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,CRect(100,100,120,200),this,123);<br />&nbsp;&nbsp; 5、进度栏放入状态栏:必须在OnCreate执行完成之后再进行获取状态栏矩形区域大小工作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取状态栏矩形区域大小:CStatusBar::GetItemRect<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_wndStatusBar.GetItemRect(1,&amp;rect);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要让OnCreate完成后获取状态栏矩形区域，我们必须通过自定义消息来完成，为了避免与Windows定义了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的消息重复，我们查看WM_USER发现只要大于WM_USER即可<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define UM_PROGRESS WM_USER+1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; afx_msg void OnProgress();消息响应函数声明<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON_MESSAGE(UM_PROGRESS,OnProgress)消息映射，位于CMainFrame类的构造函数中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 处理消息响应函数:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CMainFrame::OnProgress()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRect rect;<br />m_wndStatusBar.GetItemRect(1,&amp;rect);<br />&nbsp;&nbsp; //&nbsp; m_proctrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,CRect(100,100,200,120),this,123);<br />m_proctrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&amp;m_wndStatusBar,123);<br />m_proctrl.SetPos(50);*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在OnCreate消息中发送UM_PROGRESS消息，发送消息不能用SendMessage函数，而用PostMessage函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMessage是将消息发送到消息队列中，然后按消息顺序取出，非SendMessage立即返回。在OnCreate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 里添加PostMessage(UM_PROGRESS);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 状态栏发生变化，进度栏位置跟着变化:当窗口发生重绘的时候，必须重新获取矩形区域，在响应WM_PAINT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 消息时重新获取矩形区域，并且判断进度栏是否创建，没有创建则创建之，否则移动进度栏即可。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CMainFrame::OnPaint()<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />CPaintDC dc(this); // device context for painting<br />CRect rect;<br />m_wndStatusBar.GetItemRect(1,&amp;rect);<br />if(!m_proctrl.m_hWnd)<br />{<br />&nbsp;&nbsp;&nbsp; m_proctrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&amp;m_wndStatusBar,123);<br />}<br />else<br />{<br />&nbsp; m_proctrl.MoveWindow(rect);<br />}<br />m_proctrl.SetPos(50);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实践证明必须注释前面的PostMessage(UM_PROGRESS)或者加入判断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 让进度栏动起来:CProgressCtrl::StepIt、CProgressCtrl::SetStep:设置步长<br />6、将鼠标坐标放入状态栏<br />&nbsp;&nbsp; 在View类增加OnMouseMove消息，在代码中包含头文件"MainFrm.h"<br />&nbsp;&nbsp; void CStyleView::OnMouseMove(UINT nFlags, CPoint point)<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString str;<br />str.Format("x=%d,y=%d",point.x,point.y);<br />((CMainFrame*)GetParent())-&gt;m_wndStatusBar.SetWindowText(str);<br />((CMainFrame*)GetParent())-&gt;SetMessageText(str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((CMainFrame*)GetParent())-&gt;GetMessageBar()-&gt;SetWindowText(str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetParent()-&gt;GetDescendantWindow(AFX_IDW_STATUS_BAR)-&gt;SetWindowText(str);<br />CView::OnMouseMove(nFlags, point);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; 或者利用函数CFrameWnd::SetMessageText或者CFrameWnd::GetMessageBar或者CWnd::GetDescendantWindow<br />&nbsp;&nbsp; 临时窗口对象与永久窗口对象<br />7、启动画面:<br />&nbsp;&nbsp; "工程"--"增加到工程"--"组件和控件"--"C++组件"--"Splash screen"<br />&nbsp;&nbsp; 增加了位图资源,CSplashWnd类<br />&nbsp;&nbsp;</div><img src ="http://www.cppblog.com/frenet/aggbug/165880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/frenet/" target="_blank">frenet</a> 2012-02-18 06:10 <a href="http://www.cppblog.com/frenet/archive/2012/02/18/165880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>