做了个色差检测的项目,为了方便用户的操作,在窗口的最左面放了个DialogBar。这样用户就可以在这上面完成读图然后操作的事情了。界面框架做的差不多了,发现不太美观。然后就去网上找了下,把DialogBar用CButtonST这个类给美化了一下。做完后,感觉还是挺漂亮的。按钮上贴上美观的图片,还能给Dialog贴上个好看的的背景图片。看了几天发现这样还是有些单调,老师推荐用NewMenu 来美化主框架的界面(其实CButtonST里面也用到了NewMenu )。弄了半天,终于弄出我想要的office 2003的风格了,这下该差不多了。但是还是感觉那里怪怪的。。
主要是界面的风格不统一。有天晚上在CP上逛,突然发现了Prof-UIS,看了下里面的例子,正是我想要的(暗喜~~)。然后开始研究怎么来用这个东西。CSDN上面有篇文章写的很好(Prof-UIS学习心得)。开始自己弄的时候出现点问题,看了他的文章还是帮忙解决了问题。对主框架的设计刚才提到的那篇文章写的很详细了,就先说下那个ResizeableBar。不多说,直接上代码。。
class CMainFrame : public CFrameWnd { ... protected: // 控件条嵌入成员 CExtMenuControlBar m_wndMenuBar; CExtStatusControlBar m_wndStatusBar; CExtToolControlBar m_wndToolBar; CExtControlBar m_wndResizableBar; CBarInDlg m_wndrDlg; ... }
定义好了成员变量,下面就该显示ResizableBar了。开始的时候在菜单栏上新建一个菜单项,为了控制ResizableBar显示和消失。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() ON_COMMAND_EX(ID_VIEW_MENUBAR, OnBarCheck ) ON_UPDATE_COMMAND_UI(ID_VIEW_MENUBAR, OnUpdateControlBarMenu) ON_COMMAND_EX(ID_VIEW_RESIZABLE_BAR, OnBarCheck ) ON_UPDATE_COMMAND_UI(ID_VIEW_RESIZABLE_BAR, OnUpdateControlBarMenu) END_MESSAGE_MAP()
下面是显示ResizableBar的代码
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { ///////////////////////////////////////////////////////////////////////////////////// if( CFrameWnd::OnCreate(lpCreateStruct) == -1 ) { ASSERT( FALSE ); return -1; } CWinApp * pApp = ::AfxGetApp(); VERIFY( g_CmdManager->ProfileWndAdd( pApp->m_pszProfileName, GetSafeHwnd() ) ); VERIFY( g_CmdManager->UpdateFromMenu( pApp->m_pszProfileName, IDR_MAINFRAME ) ); //////////////////////////////////创建菜单栏工具栏状态栏/////////////////////////////// if( !m_wndMenuBar.Create( NULL, this, ID_VIEW_MENUBAR ) ) { TRACE0("Failed to create menubar/n"); return -1; // failed to create } if( !m_wndToolBar.Create( NULL, this, AFX_IDW_TOOLBAR ) || !m_wndToolBar.LoadToolBar( IDR_MAINFRAME ) ) { TRACE0("Failed to create toolbar/n"); return -1; // fail to create } 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 } if( !m_wndResizableBar.Create( _T("Resizable Bar"), this, ID_VIEW_RESIZABLE_BAR ) ) { TRACE0("Failed to create m_wndResizableBar/n"); return -1; // fail to create } if( !m_wndrDlg.Create( IDD_IN_BAR_DLG, &m_wndResizableBar ) ) { TRACE0("Failed to create m_wndInBarDlg/n"); return -1; // fail to create } ///////////////////////////停靠代码//////////////////////////////////////////////////// m_wndMenuBar.EnableDocking( CBRS_ALIGN_ANY ); m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY ); m_wndResizableBar.EnableDocking( CBRS_ALIGN_LEFT ); if( !CExtControlBar::FrameEnableDocking(this) ) { ASSERT( FALSE ); return -1; } DockControlBar( &m_wndMenuBar ); DockControlBar( &m_wndToolBar ); DockControlBar( &m_wndResizableBar,AFX_IDW_DOCKBAR_LEFT ); /////////////////////////////////////////////////////////////////////////////////////// return 0; }
至此,一个好看的ResizeableBar就出来了。但是这时你会发现,那个按钮还是以前的那个默认的按钮样式没有改变。翻了一下他的其它例子,被我发现了。。在自己刚才新建的Dialog类里面进行初始化。
#pragma once #include "extresizabledialog.h" #include "ExtBtnOnFlat.h" #include "extbutton.h" // CBarInDlg 对话框 class CBarInDlg : public CExtResizableDialog { DECLARE_DYNAMIC(CBarInDlg) public: CBarInDlg(CWnd* pParent = NULL); // 标准构造函数 virtual ~CBarInDlg(); // 对话框数据 enum { IDD = IDD_IN_BAR_DLG }; public: CExtButton m_button1; CExtButton m_button2; CExtButton m_button3; CExtButton m_button4; public: protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: virtual BOOL OnInitDialog(); }; // BarInDlg.cpp : 实现文件 // #include "stdafx.h" #include "SDIProfUIS.h" #include "BarInDlg.h" #include "./barindlg.h" IMPLEMENT_DYNAMIC(CBarInDlg, CExtResizableDialog) CBarInDlg::CBarInDlg(CWnd* pParent /*=NULL*/) : CExtResizableDialog(CBarInDlg::IDD, pParent) { } CBarInDlg::~CBarInDlg() { } void CBarInDlg::DoDataExchange(CDataExchange* pDX) { CExtResizableDialog::DoDataExchange(pDX); DDX_Control( pDX, IDC_BUTTON1, m_button1 ); DDX_Control( pDX, IDC_BUTTON2, m_button2 ); DDX_Control( pDX, IDC_BUTTON3, m_button3 ); DDX_Control( pDX, IDC_BUTTON4, m_button4 ); } BEGIN_MESSAGE_MAP(CBarInDlg, CExtResizableDialog) END_MESSAGE_MAP() BOOL CBarInDlg::OnInitDialog() { CExtResizableDialog::OnInitDialog(); return TRUE; // return TRUE unless you set the focus to a control }
这下OK了。效果图如下所示:
继续来讨论 Prof-UIS。这里讨论的主要是我做这色差检测用到的界面设计。我在这个需要显示一个相机采集的窗口,在这个窗口中加了个CDialogBar和一个VIEW。这时需要也把这个CDialogBar给弄成Office 2003的风格。开始那个ResizeableBar有个标题栏,我不想用他的那种方式在采集窗口里面显示。用的是FixedSizePanels这个例子里面的方法。下面的代码主要在那个窗口生成的类里面完成。
class CDialogWindow : public CFrameWnd { DECLARE_DYNCREATE(CDialogWindow) protected: public: CDialogWindow(); ... CExtPanelControlBar m_wndPanelDialog; CMyDialogBar m_wndmydlg; ... } BOOL CDialogWindow::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { ... //Create the DialogBar if( !m_wndPanelDialog.Create( _T("Panel With Dialog"), this, ID_VIEW_RESIZABLE_SHOW_BAR, WS_CHILD|WS_VISIBLE |CBRS_RIGHT|CBRS_GRIPPER|CBRS_TOOLTIPS |CBRS_FLYBY|CBRS_SIZE_DYNAMIC |CBRS_HIDE_INPLACE ) ) { TRACE0("Failed to create m_wndResizableBar/n"); return -1; // fail to create } if( !m_wndmydlg.Create( IDD_MYDIALOG, &m_wndPanelDialog ) ) { TRACE0("Failed to create m_wndInBarDlg/n"); return -1; // fail to create } m_wndPanelDialog.EnableDocking(CBRS_ALIGN_ANY); if( !CExtControlBar::FrameEnableDocking(this) ) { ASSERT( FALSE ); return -1; } DockControlBar( &m_wndPanelDialog ); //end DialogBar ... return CFrameWnd::OnCreateClient(lpcs, pContext); }
效果图如下所示:
收尾了。。我个人认为界面做出来还是比较漂亮的。可能我很喜欢Office 2003的风格吧。。(我的Maxthon也用的Office 2003风格)