15551

BCGControlBarPro CBCGPGridCtrl单元格添加控件 CBCGPGridCtrl单元格添加控件,例如密码控件、滑块、进度条、按钮等,以下是相关控件的封装: 1、customcells.h //******************************************************************************* // COPYRIGHT NOTES // --------------- // This is a sample for BCGControlBar Library Professional Edition 阅读详情

BCG注册表清除:
第一次在CXXXApp::ExitInstance()  加入CleanState(),
运行一次
接着注释掉,再在OnInitInstance加入m_bSaveState=FALSE
 

估计在BCG控件要写注册表的时候,它自己的写入注册表函数会判断m_bSaveState

1.VC2008集成了BCGControlBar的相关功能,用wizard生成的话如果选与BCGControlBar有关的性能,如预定皮肤,则应用程序是从CWinAppEx派生,再加CBCGPWorkspace似乎不行。


2.BCG 为了方便程序员,在注册表中保存了窗口的大小、位置等信息,包括工具栏的相应信息。这样减少了程序员保存和恢复用户上次使用过的界面的重复劳动。但也会造成改变菜单之类出现无反应的现象,让人摸不着头脑。可以采用的一个方法是,删除 BCG 为你保存的注册表键:
HKEY_CURRENT_USER/Software/[your corporation]/[your application]/Workspace
里面 your corporation 是指在 app 类里面 SetRegistryKey 指定的路径;your application 就是你的应用程序名。
把这个删掉之后,还是用你最上面的代码,运行。OK!

更方便的是InitInstance里设m_bSaveState=FALSE;

如果已经有注册内容了再加一句CleanState();

程序成型后再加上。


3.应用皮肤的过程
(1)找一个BCG的例子,将菜单与皮肤相关的项复制粘贴到你的菜单下,ID值是连续的。

(2)CMainFrame的头文件中
#define CFrameWnd CBCGPFrameWnd//类定义前。这样可以省很多替换工作哦
 UINT m_nAppLook;//指示应用哪个皮肤
 CBCGPMenuBar  m_wndMenuBar;
//手动加入消息响应:
 afx_msg void OnAppLook(UINT id);
 afx_msg void OnUpdateAppLook(CCmdUI* pCmdUI);

(3)CMainFrame的Cpp文件
//消息映射增加
 ON_COMMAND_RANGE(ID_VIEW_APPLOOK_2000, ID_VIEW_APPLOOK_VS2008, OnAppLook) //这是范围的响应,所以ID要连续
 ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_2000, ID_VIEW_APPLOOK_VS2008, OnUpdateAppLook)
//初始化函数
 m_nAppLook = theApp.GetInt (_T("ApplicationLook"), ID_VIEW_APPLOOK_2003);//初始的样子
//OnCreate
 OnAppLook (m_nAppLook);

 if (!m_wndMenuBar.Create (this))
 {
  TRACE0("Failed to create menubar/n");
  return -1;      // fail to create
 }

 m_wndMenuBar.SetBarStyle(m_wndMenuBar.GetBarStyle() | CBRS_SIZE_DYNAMIC);

 m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
 EnableDocking(CBRS_ALIGN_ANY);
 EnableAutoHideBars(CBRS_ALIGN_ANY);
 DockControlBar(&m_wndMenuBar);                     //可浮动

//直接把以下两个函数拷贝上去就OK了。
void CMainFrame::OnAppLook(UINT id)
{
 CBCGPDockManager::SetDockMode (BCGP_DT_SMART);

 m_nAppLook = id;

 switch (m_nAppLook)
 {
 case ID_VIEW_APPLOOK_2000:
  // enable Office 2000 look:
  CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager));
  break;

 case ID_VIEW_APPLOOK_XP:
  // enable Office XP look:
  CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManagerXP));
  break;

 case ID_VIEW_APPLOOK_WIN_XP:
  // enable Windows XP look (in other OS Office XP look will be used):
  CBCGPWinXPVisualManager::m_b3DTabsXPTheme = TRUE;
  CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPWinXPVisualManager));
  break;

 case ID_VIEW_APPLOOK_2003:
  // enable Office 2003 look:
  CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2003));
  CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
  break;

 case ID_VIEW_APPLOOK_VS2005:
  // enable VS 2005 look:
  CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManagerVS2005));
  CBCGPVisualManager::GetInstance ();
  CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
  break;

 case ID_VIEW_APPLOOK_VS2008:
  // enable VS 2008 look:
  CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManagerVS2008));
  CBCGPVisualManager::GetInstance ();
  CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
  break;

 case ID_VIEW_APPLOOK_2007_1:
  // enable Office 2007 look:
  CBCGPVisualManager2007::SetStyle (CBCGPVisualManager2007::VS2007_LunaBlue);
  CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2007));
  CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
  break;

 case ID_VIEW_APPLOOK_2007_2:
  // enable Office 2007 look:
  CBCGPVisualManager2007::SetStyle (CBCGPVisualManager2007::VS2007_ObsidianBlack);
  CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2007));
  CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
  break;

 case ID_VIEW_APPLOOK_2007_3:
  // enable Office 2007 look:
  CBCGPVisualManager2007::SetStyle (CBCGPVisualManager2007::VS2007_Aqua);
  CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2007));
  CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
  break;

 case ID_VIEW_APPLOOK_2007_4:
  // enable Office 2007 look:
  CBCGPVisualManager2007::SetStyle (CBCGPVisualManager2007::VS2007_Silver);
  CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2007));
  CBCGPDockManager::SetDockMode (BCGP_DT_SMART);
  break;

 default:
  ASSERT (FALSE);
 }

 CBCGPDockManager* pDockManager = GetDockManager ();
 if (pDockManager != NULL)
 {
  ASSERT_VALID (pDockManager);
  pDockManager->AdjustBarFrames ();
 }

 RecalcLayout ();
 RedrawWindow (NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);

 theApp.WriteInt (_T("ApplicationLook"), m_nAppLook);
}


void CMainFrame::OnUpdateAppLook(CCmdUI* pCmdUI)
{
 pCmdUI->SetRadio (m_nAppLook == pCmdUI->m_nID);
}

4.上下文菜单

(1)当然是新建一个需要的上下文菜单

(2)应用程序类的头文件下

 virtual void PreLoadState ();

Cpp文件

void C***App::PreLoadState ()
{

 GetContextMenuManager()->AddMenu (_T("My menu"), IDR_CONTEXT_MENU);//IDR_CONTEXT_MENU是菜单的ID

 // TODO: add another context menus here
}

(3)响应上下文菜单的视图类中增加对上下文菜单消息的响应

void C***View::OnContextMenu(CWnd* , CPoint point)
{
 theApp.ShowPopupMenu (IDR_CONTEXT_MENU, point, this);
 // TODO: 在此处添加消息处理程序代码
}

2.

BCG例子BCGPExplorer:

1.BCG的菜单、工具栏、动画图标和地址栏

这是BCG的主要特色,也比较繁琐。

(1)如果要支持自定义工具。

首先在String表定义入口ID:ID_TOOLS_ENTRY,与某菜单项关联。然后定义连续的ID,如ID_USER_TOOL1、ID_USER_TOOL2......。

在App下增加 EnableUserTools (ID_TOOLS_ENTRY, ID_USER_TOOL1, ID_USER_TOOL10);

(2)主要是修改CMainFrame

头文件声明

 CBCGPMenuBar  m_wndMenuBar;
 CBCGPStatusBar m_wndStatusBar;
 CBCGPToolBar  m_wndToolBar;
 CBCGPReBar   m_wndReBar;  //菜单、工具栏、地址栏的容器
 CBCGPAnimCtrl m_wndAnimate;//动画控件
 CComboBoxEx  m_wndAddress;//地址栏

增加响应自定义工具的消息函数OnViewCustomize

手动添加消息响应

 afx_msg LRESULT OnToolbarReset(WPARAM,LPARAM);
 afx_msg LRESULT OnToolbarContextMenu(WPARAM,LPARAM);

 虚函数virtual BOOL OnShowPopupMenu (CBCGPPopupMenu* pMenuPopup);

Cpp文件

 ON_REGISTERED_MESSAGE(BCGM_RESETTOOLBAR, OnToolbarReset)
 ON_REGISTERED_MESSAGE(BCGM_TOOLBARMENU, OnToolbarContextMenu)

OnCreate()函数

 CBCGPToolBar::EnableQuickCustomization ();

 CBCGPToolBar::SetSizes (CSize (28, 28), CSize (22, 22));//工具栏大小
 CBCGPToolBar::SetMenuSizes (CSize (22, 22), CSize (16, 16));//工具栏中下拉菜单项大小

//指定常用的工具,其它会自动收缩。每个下拉(pulldown)菜单条至少要有一项

 CList<UINT, UINT> lstBasicCommands;

 lstBasicCommands.AddTail (ID_VIEW_TOOLBARS);
 lstBasicCommands.AddTail (ID_APP_EXIT);
 lstBasicCommands.AddTail (ID_APP_ABOUT);
 lstBasicCommands.AddTail (ID_VIEW_TOOLBAR);
 lstBasicCommands.AddTail (ID_VIEW_CUSTOMIZE);
 lstBasicCommands.AddTail (ID_COMMAND_HISTORY);
 lstBasicCommands.AddTail (ID_VIEW_LARGEICON);
 lstBasicCommands.AddTail (ID_VIEW_SMALLICON);
 lstBasicCommands.AddTail (ID_VIEW_LIST);
 lstBasicCommands.AddTail (ID_VIEW_DETAILS);
 lstBasicCommands.AddTail (ID_EDIT_CUT);
 lstBasicCommands.AddTail (ID_EDIT_COPY);
 lstBasicCommands.AddTail (ID_EDIT_PASTE);

 CBCGPToolBar::SetBasicCommands (lstBasicCommands);

 if (!m_wndMenuBar.Create (this))//菜单的创建
 {
  TRACE0("Failed to create menubar/n");
  return -1;      // fail to create
 }

 m_wndMenuBar.SetBarStyle(m_wndMenuBar.GetBarStyle() | CBRS_SIZE_DYNAMIC);

 // Remove menubar gripper and borders:
 m_wndMenuBar.SetBarStyle (m_wndMenuBar.GetBarStyle() &
  ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));

//动画控件的创建,AFX_IDW_TOOLBAR为标准ID,IDB_ANIMATION是连续位图

 if (!m_wndAnimate.Create (_T(""), WS_CHILD | WS_VISIBLE, CRect(0, 0, 20, 20), this, AFX_IDW_TOOLBAR + 2) ||
  !m_wndAnimate.SetBitmap (IDB_ANIMATION, 20))
{
  TRACE0("Failed to create aimation/n");
  return -1;      // fail to create
 }

 m_wndAnimate.Play (500);

//检测颜色深度是256还是真彩色

 CClientDC dc (this);
 BOOL bIsHighColor = dc.GetDeviceCaps (BITSPIXEL) > 8;

 UINT uiToolbarHotID = bIsHighColor ? IDB_TOOLBAR256 : 0;  //IDB_TOOLBAR256真彩色图像(用作工具栏)
 UINT uiToolbarColdID = bIsHighColor ? IDB_TOOLBARCOLD256 : 0;
 UINT uiMenuID = bIsHighColor ? IDB_MENU256 : IDB_MENU16;

 if (!m_wndToolBar.CreateEx(this) ||
  !m_wndToolBar.LoadToolBar(IDR_MAINFRAME, uiToolbarColdID, uiMenuID, FALSE, 0, 0, uiToolbarHotID))//IDR_MAINFRAME是256色的预定义工具栏
 {
  TRACE0("Failed to create toolbar/n");
  return -1;      // fail to create
 }

 // Remove toolbar gripper and borders:
 m_wndToolBar.SetBarStyle (m_wndToolBar.GetBarStyle() &
  ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));

//创建地址栏

 if (!m_wndAddress.Create (CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, AFX_IDW_TOOLBAR + 1))
 {
  TRACE0("Failed to create combobox/n");
  return -1;      // fail to create
 }

 //将各项加入rebar面板
 DWORD dwStyle = RBBS_GRIPPERALWAYS | RBBS_FIXEDBMP | RBBS_BREAK;

 if (!m_wndReBar.Create(this) ||
  !m_wndReBar.AddBar (&m_wndMenuBar) ||
  !m_wndReBar.AddBar (&m_wndToolBar, NULL, NULL, dwStyle) ||
  !m_wndReBar.AddBar(&m_wndAnimate, NULL, NULL, RBBS_FIXEDSIZE | RBBS_FIXEDBMP) ||
  !m_wndReBar.AddBar(&m_wndAddress, _T("Address"), NULL, dwStyle))
 {
  TRACE0("Failed to create rebar/n");
  return -1;      // fail to create
 }

 m_wndMenuBar.AdjustLayout ();
 m_wndToolBar.AdjustLayout ();

 //--------------------------------------------------------------
 // Set up min/max sizes and ideal sizes for pieces of the rebar:
 //--------------------------------------------------------------
 REBARBANDINFO rbbi;

 CRect rectToolBar;
 m_wndToolBar.GetItemRect(0, &rectToolBar);

 rbbi.cbSize = sizeof(rbbi);
 rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_SIZE;
 rbbi.cxMinChild = rectToolBar.Width();
 rbbi.cyMinChild = rectToolBar.Height();
 rbbi.cx = rbbi.cxIdeal = rectToolBar.Width() * m_wndToolBar.GetCount ();
 m_wndReBar.GetReBarCtrl().SetBandInfo (1, &rbbi);
 rbbi.cxMinChild = 0;

 CRect rectAddress;
 m_wndAddress.GetEditCtrl()->GetWindowRect(&rectAddress);

 rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;
 rbbi.cyMinChild = rectAddress.Height() + 10;
 rbbi.cxIdeal = 200;
 m_wndReBar.GetReBarCtrl().SetBandInfo (3, &rbbi);//基于上面的AddBar所定的顺序

 // 菜单和工具栏允许增加自定义按钮
 m_wndMenuBar.EnableCustomizeButton (TRUE, (UINT)-1, _T(""));
 m_wndToolBar.EnableCustomizeButton (TRUE, (UINT)-1, _T(""));

 EnableDocking (CBRS_ALIGN_ANY);

 m_wndReBar.EnableDocking (CBRS_TOP);//可以浮动和停靠
 DockControlBar (&m_wndReBar);

 CString strMainToolbarTitle;
 strMainToolbarTitle.LoadString (IDS_MAIN_TOOLBAR);
 m_wndToolBar.SetWindowText (strMainToolbarTitle);

 // TODO: Remove this if you don't want tool tips
 m_wndMenuBar.SetBarStyle(m_wndMenuBar.GetBarStyle() |
  CBRS_TOOLTIPS | CBRS_FLYBY);
 m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
  CBRS_TOOLTIPS | CBRS_FLYBY);

void CMainFrame::OnViewCustomize()
{
 //------------------------------------
 // Create a customize toolbars dialog:
 //------------------------------------
 CBCGPToolbarCustomize* pDlgCust = new CBCGPToolbarCustomize (this,
  TRUE
  );

 pDlgCust->Create ();
}

LRESULT CMainFrame::OnToolbarContextMenu(WPARAM,LPARAM lp)
{
 CPoint point (BCG_GET_X_LPARAM(lp), BCG_GET_Y_LPARAM(lp));

 CMenu menu;
 VERIFY(menu.LoadMenu (IDR_POPUP_TOOLBAR));

 CMenu* pPopup = menu.GetSubMenu(0);
 ASSERT(pPopup != NULL);

 CBCGPPopupMenu* pPopupMenu = new CBCGPPopupMenu;
 pPopupMenu->Create (this, point.x, point.y, pPopup->Detach ());

 return 0;
}

//替换256色标准工具栏IDR_MAINFRAME为真彩色

afx_msg LRESULT CMainFrame::OnToolbarReset(WPARAM wp, LPARAM)
{
 UINT uiToolBarId = (UINT) wp;
 if (uiToolBarId != IDR_MAINFRAME)
 {
  return 0;
 }

 // Replace "Back" and "Forward" buttons by the menu buttons
 // with the history lists:

 CMenu menuHistory;
 menuHistory.LoadMenu (IDR_HISTORY_POPUP);

 CBCGPToolbarMenuButton btnBack (ID_GO_BACK, menuHistory,
     CImageHash::GetImageOfCommand (ID_GO_BACK), _T("Back"));//带菜单的按钮
 btnBack.m_bText = TRUE;
 m_wndToolBar.ReplaceButton (ID_GO_BACK, btnBack);

 m_wndToolBar.ReplaceButton (ID_GO_FORWARD,
  CBCGPToolbarMenuButton (ID_GO_FORWARD, menuHistory,
     CImageHash::GetImageOfCommand (ID_GO_FORWARD), _T("Forward")));

 // "Folders" button has a text label:
 m_wndToolBar.SetToolBarBtnText (m_wndToolBar.CommandToIndex (ID_VIEW_FOLDERS),
  _T("Folders"));

 // Replace "Views" button by the menu button:
 CMenu menuViews;
 menuViews.LoadMenu (IDR_VIEWS_POPUP);

 m_wndToolBar.ReplaceButton (ID_VIEW_VIEWS,
  CBCGPToolbarMenuButton ((UINT)-1, menuViews,
     CImageHash::GetImageOfCommand (ID_VIEW_VIEWS), _T("Views")));

 return 0;
}

BOOL CMainFrame::OnShowPopupMenu (CBCGPPopupMenu* pMenuPopup)
{
 //---------------------------------------------------------
 // 将占位的ID_VIEW_TOOLBARS菜单项替换为IDR_POPUP_TOOLBAR:
 //---------------------------------------------------------
    CFrameWnd::OnShowPopupMenu (pMenuPopup);

    if (pMenuPopup != NULL &&
  pMenuPopup->GetMenuBar ()->CommandToIndex (ID_VIEW_TOOLBARS) >= 0)
    {
  if (CBCGPToolBar::IsCustomizeMode ())
  {
   //----------------------------------------------------
   // Don't show toolbars list in the cuztomization mode!
   //----------------------------------------------------
   return FALSE;
  }

  pMenuPopup->RemoveAllItems ();

  CMenu menu;
  VERIFY(menu.LoadMenu (IDR_POPUP_TOOLBAR));

  CMenu* pPopup = menu.GetSubMenu(0);
  ASSERT(pPopup != NULL);

  pMenuPopup->GetMenuBar ()->ImportFromMenu (*pPopup, TRUE);
    }

 return TRUE;
}

3.

补充CBCGPToolBar的使用

CMainFrame::OnCreate下

(1) CBCGPToolBar::EnableQuickCustomization ();//按Alt键时可以拖动工具栏上的图标重新排列

(2) m_wndToolBar.EnableCustomizeButton (TRUE, ID_VIEW_CUSTOMIZE, _T("Customize..."));

//允许自定义工具栏,名字“Customize”,并与菜单项ID_VIEW_CUSTOMIZE关联。

 

void CMainFrame::OnViewCustomize()
{//在BCG标准的自定义工具栏中加入新的属性页
 CList <CRuntimeClass*, CRuntimeClass*> lstCustomPages;
 lstCustomPages.AddTail (RUNTIME_CLASS (CMyCustomizationPage));

//CMyCustomizationPage是一个自定义的属性页
 //------------------------------------
 // Create a customize toolbars dialog:
 //------------------------------------
 CBCGPToolbarCustomize* pDlgCust = new CBCGPToolbarCustomize (this,
  TRUE ,
  BCGCUSTOMIZE_MENU_SHADOWS | BCGCUSTOMIZE_TEXT_LABELS |
  BCGCUSTOMIZE_LOOK_2000 | BCGCUSTOMIZE_MENU_ANIMATIONS, // default parameters
  &lstCustomPages); // pointer to the list of runtime classes of the custom property pages

 pDlgCust->Create ();
}

(3)将占位菜单项ID_VIEW_TOOLBARS替换为菜单IDR_POPUP_TOOLBAR

virtual BOOL OnShowPopupMenu (CBCGPPopupMenu* pMenuPopup);

BOOL CMainFrame::OnShowPopupMenu (CBCGPPopupMenu* pMenuPopup)
{
 //---------------------------------------------------------
 // Replace ID_VIEW_TOOLBARS menu item to the toolbars list:
 //---------------------------------------------------------
    CFrameWnd::OnShowPopupMenu (pMenuPopup);

    if (pMenuPopup != NULL &&
  pMenuPopup->GetMenuBar ()->CommandToIndex (ID_VIEW_TOOLBARS) >= 0)
    {
  if (CBCGPToolBar::IsCustomizeMode ())
  {
   //----------------------------------------------------
   // Don't show toolbars list in the cuztomization mode!
   //----------------------------------------------------
   return FALSE;
  }

  pMenuPopup->RemoveAllItems ();

  CMenu menu;
  VERIFY(menu.LoadMenu (IDR_POPUP_TOOLBAR));

  CMenu* pPopup = menu.GetSubMenu(0);
  ASSERT(pPopup != NULL);

  pMenuPopup->GetMenuBar ()->ImportFromMenu (*pPopup, TRUE);
    }

 return TRUE;
}

 


IDR_POPUP_TOOLBAR菜单

4.

在对话框中使用菜单、工具栏等

DlgBars解析

 

(1)在对话框资源中进行占位,设置相应ID,产生相应变量

 CStatic m_wndMenuBarLocation;//菜单
 CStatic m_wndStatusBarLocation;//状态栏
 CStatic m_wndToolbarLocation;//工具栏
 CStatic m_wndOutlookBarLocation;//Outlook侧边栏
 CStatic m_wndCaptionLocation;//标题栏

 

(2)有关菜单的类

class CMyMenuBar : public CBCGPMenuBar

 

class CCmdFrame : public CBCGPFrameWnd

构造函数CCmdFrame(CBCGPDialog* pDlg);

BOOL CCmdFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
 ASSERT_VALID (m_pDlg);
 return m_pDlg->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);//转由对话框处理
}

class CMyFrameImpl : public CBCGPFrameImpl

//CBCGPFrameImpl实现工具栏的管理,包括从注册表读写状态,docking,键盘和鼠标消息等
{
 CMyFrameImpl() : CBCGPFrameImpl (NULL) {}

 friend class CCmdFrame;
};

void CCmdFrame::SetMenuBar (CBCGPMenuBar* pMenuBar)
{
 ((CMyFrameImpl&)m_Impl).m_pMenuBar = pMenuBar;//实际是把CMyMenuBar绑定到CMyFrameImpl
}

 

(3)对话框类

头文件

#define CDialog CBCGPDialog

定义:

 CBCGPOutlookBar  m_wndOutlookBar;
 CBCGPOutlookBarPane m_wndPane1;
 CBCGPOutlookBarPane m_wndPane2;

 CMyMenuBar   m_wndMenuBar;
 CBCGPCaptionBar  m_wndCaptionBar;
 CBCGPToolBar  m_wndToolBar;
 CBCGPStatusBar  m_wndStatusBar;

 CBitmap    m_bmpCaption;

 CCmdFrame*   m_pMenuFrame;

 

Cpp文件

OnInitDialog()

 // Create Outlook Bar:
 DWORD dwStyle = WS_CAPTION | WS_CHILD | WS_VISIBLE | CBRS_ALIGN_LEFT;
 DWORD dwBCGStyle = 0;
 m_wndOutlookBar.Create (_T("Shortcuts"), this, CRect (0, 0, 100, 100),
  AFX_IDW_TOOLBAR, dwStyle, dwBCGStyle);

 m_wndOutlookBar.EnableGripper (TRUE);

    m_wndOutlookBar.SetBarStyle (CBRS_ALIGN_LEFT | CBRS_TOOLTIPS | CBRS_FLYBY |
        CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

 m_wndOutlookBar.EnableSetCaptionTextToTabName (FALSE);

 m_wndPane1.Create (&m_wndOutlookBar, dwDefaultToolbarStyle, 1);
 m_wndPane1.SetWindowText (_T("Page 1"));
 m_wndOutlookBar.AddTab (&m_wndPane1);

 m_wndPane1.EnableTextLabels (TRUE);
 m_wndPane1.SetOwner (this);
 

 m_wndPane2.Create (&m_wndOutlookBar, dwDefaultToolbarStyle, 1);
 m_wndPane2.SetWindowText (_T("Page 2"));
 m_wndOutlookBar.AddTab (&m_wndPane2);

 m_wndPane2.EnableTextLabels (TRUE);
 m_wndPane2.SetOwner (this);

 // Add some shortcuts:
 m_wndPane1.AddButton (IDB_SHORTCUT1, "Shortcut 1", ID_SHORTCUT_1);
 m_wndPane1.AddButton (IDB_SHORTCUT2, "Shortcut 2", ID_SHORTCUT_2);


 m_wndPane2.AddButton (IDB_SHORTCUT3, "Shortcut 3", ID_SHORTCUT_3);
 m_wndPane2.AddButton (IDB_SHORTCUT4, "Shortcut 4", ID_SHORTCUT_4);

 CRect rectClient;
 GetClientRect (rectClient);

 // 在m_wndOutlookBarLocation所占位创建m_wndOutlookBar:
 CRect rectOutlookBar;
 m_wndOutlookBarLocation.GetWindowRect (&rectOutlookBar);
 ScreenToClient (&rectOutlookBar);

 m_wndOutlookBar.SetWindowPos (&wndTop, rectOutlookBar.left, rectOutlookBar.top,
      rectOutlookBar.Width (),
      rectClient.Height () - 2 * rectOutlookBar.top,
      SWP_NOACTIVATE);

 // Create menu bar:
 m_wndMenuBar.Create (this);

 CMenu menu;
 menu.LoadMenu (IDR_MAINFRAME);
 m_wndMenuBar.CreateFromMenu (menu.GetSafeHmenu (), TRUE, TRUE);

 m_wndMenuBar.SetBarStyle (
  m_wndMenuBar.GetBarStyle () &
   ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));

 // Set menu bar position and size:
 CRect rectMenuBar;
 m_wndMenuBarLocation.GetWindowRect (&rectMenuBar);
 ScreenToClient (&rectMenuBar);

 m_wndMenuBar.SetWindowPos (&wndTop, rectMenuBar.left, rectMenuBar.top,
      rectMenuBar.Width (),
      rectMenuBar.Height (),
      SWP_NOACTIVATE);

 m_pMenuFrame = new CCmdFrame (this);
 m_pMenuFrame->Create (NULL, _T(""));
 m_pMenuFrame->ShowWindow (SW_HIDE);
 m_pMenuFrame->SetMenuBar (&m_wndMenuBar);

 m_wndMenuBar.SetOwner (m_pMenuFrame);//设定m_wndMenuBar的Owner为m_pMenuFrame
 BCGCBProSetTopLevelFrame (m_pMenuFrame);

 // Create caption bar:
 m_wndCaptionBar.Create (WS_CHILD | WS_VISIBLE, this, (UINT)-1);
 m_wndCaptionBar.SetText (_T("Caption"), CBCGPCaptionBar::ALIGN_LEFT);
 m_wndCaptionBar.SetFlatBorder ();

 // Load caption image:
 m_bmpCaption.LoadBitmap (IDB_CAPTION);
 m_wndCaptionBar.SetBitmap ((HBITMAP) m_bmpCaption.GetSafeHandle (), RGB (255, 0, 255));

 m_wndCaptionBar.SetBarStyle (
  m_wndCaptionBar.GetBarStyle () &
   ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));

 // Set caption bar position and size:
 CRect rectCaptionBar;
 m_wndCaptionLocation.GetWindowRect (&rectCaptionBar);
 ScreenToClient (&rectCaptionBar);

 m_wndCaptionBar.SetWindowPos (&wndTop, rectCaptionBar.left, rectCaptionBar.top,
      rectCaptionBar.Width (),
      rectCaptionBar.Height (),
      SWP_NOACTIVATE);
 // Create toolbar:
 m_wndToolBar.Create (this);
 m_wndToolBar.LoadToolBar (IDR_MAINFRAME, 0, 0, TRUE );

 m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
  CBRS_TOOLTIPS | CBRS_FLYBY);
 
 m_wndToolBar.SetBarStyle (
  m_wndToolBar.GetBarStyle () &
   ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));

 CSize sizeToolBar = m_wndToolBar.CalcFixedLayout (FALSE, TRUE);

 // Set ToolBar position and size:
 CRect rectToolBar;
 m_wndToolbarLocation.GetWindowRect (&rectToolBar);
 ScreenToClient (&rectToolBar);

 m_wndToolBar.SetWindowPos (&wndTop, rectToolBar.left, rectToolBar.top,
  sizeToolBar.cx, sizeToolBar.cy, SWP_NOACTIVATE);

 m_wndToolBar.SetOwner (this);

 // 指示m_wndToolBar的消息全部由对话框处理
 m_wndToolBar.SetRouteCommandsViaFrame (FALSE);
 
 // Create status bar:
 m_wndStatusBar.Create(this);
 m_wndStatusBar.SetIndicators(indicators,
    sizeof(indicators)/sizeof(UINT));

 // Set status bar position and size:
 CRect rectStatusBar;
 m_wndStatusBarLocation.GetWindowRect (&rectStatusBar);
 ScreenToClient (&rectStatusBar);

 m_wndStatusBar.SetWindowPos (&wndTop, rectStatusBar.left, rectStatusBar.top,
  rectStatusBar.Width (), rectStatusBar.Height (), SWP_NOACTIVATE);

 m_wndStatusBar.SetWindowText ("Test");

 

//消息处理

void CDlgBarsDlg::OnEditPaste()
{
 MessageBox ("OnEditPaste");
}

//状态更新

void CDlgBarsDlg::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
 pCmdUI->SetCheck ();
}

 

LRESULT CDlgBarsDlg::OnKickIdle(WPARAM, LPARAM)
{
 m_wndToolBar.OnUpdateCmdUI ((CFrameWnd*) this, TRUE);
    return 0;
}

5.

工具提示控件

DlgToolTips

 


1.创建类class CCustomToolTipCtrl : public CBCGPToolTipCtrl

 virtual CSize GetIconSize ()
 {
  return CSize (32, 32);
 }


void CCustomToolTipCtrl::OnShow(NMHDR* pNMHDR, LRESULT* pResult)
{
 m_nCurrID = CWnd::FromHandle ((HWND)pNMHDR->idFrom)->GetDlgCtrlID ();

 switch (m_nCurrID)
 {
 case IDOK:
  m_strDesrciption = _T("OK Button description...");//基本描述
  break;

 case IDCANCEL:
  m_strDesrciption = _T("Cancel Button description...");
  break;

 default:
  m_strDesrciption.Empty ();
 }

 CBCGPToolTipCtrl::OnShow (pNMHDR, pResult);
}

 

BOOL CCustomToolTipCtrl::OnDrawIcon (CDC* pDC, CRect rectImage)
{
 UINT uiBmpResID = 0;

 switch (m_nCurrID)
 {
 case IDOK:
  uiBmpResID = IDB_OK;
  break;

 case IDCANCEL:
  uiBmpResID = IDB_CANCEL;
  break;
 }

 if (uiBmpResID == 0)
 {
  return FALSE;
 }

 CBCGPToolBarImages image;
 image.Load (uiBmpResID);
 image.SetSingleImage ();
 image.DrawEx (pDC, rectImage, 0);

 return TRUE;
}

2.对话框

OnInitDialog()

 CMenu* pSysMenu = GetSystemMenu(FALSE);//在系统菜单里增加一个新项
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }


 
 // Create the ToolTip control.
 m_ToolTip.Create(this);
 m_ToolTip.Activate(TRUE);

 CBCGPToolTipParams params;
 params.m_bVislManagerTheme = TRUE;

 m_ToolTip.SetParams (&params);

 // TODO: Use one of the following forms to add controls:
 m_ToolTip.AddTool (GetDlgItem(IDOK), _T("This is OK button!"));//另外的描述
 m_ToolTip.AddTool (GetDlgItem(IDCANCEL), _T("This is Cancel button!"));

 

 

BOOL CDlgToolTipsDlg::PreTranslateMessage(MSG* pMsg)
{
    switch (pMsg->message)
 {
 case WM_KEYDOWN:
 case WM_SYSKEYDOWN:
 case WM_LBUTTONDOWN:
 case WM_RBUTTONDOWN:
 case WM_MBUTTONDOWN:
 case WM_LBUTTONUP:
 case WM_RBUTTONUP:
 case WM_MBUTTONUP:
 case WM_MOUSEMOVE:
  m_ToolTip.RelayEvent(pMsg);
  break;
 }
 
 return CBCGPDialog::PreTranslateMessage(pMsg);
}

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/tengxiaoming/archive/2010/08/19/5822589.aspx

Android移动应用开发大作业 这个作业是我花了三天左右时间熬夜写出来了,到最后一天晚上脑子都木木的,属性名都懒得改了,但是页数还过得去了,好像是十一二页来着。 选题几乎没有花很多时间,因为知道要写一个总结文档我就用短学期写的一个电子阅读笔记的资料了(可以省力x),主要又是期末大作业又是搞比赛啥的,没啥多余的精力去选题然后写文档(借口借口就是因为懒)。 而且好巧,短学期也是上05老师的课写的电子阅读笔记,这次拿来写大作业,老可持续发展了。 代码上传到github:https://github.com/skeptical5/HaveRea 阅读详情

相关推荐

Flink 写入 Doris

apache Flink 写入 Apache Doris

weixin_39750695的博客 4605

工具栏小结

BCG注册表清理:第一次在CXXXApp::ExitInstance()  加入CleanState(),运行一次接着注释掉,再在OnInitInstance加入m_bSaveState=FALSE张跃 0:11:44估计在BCG控件要写注册表的时候,它自己的写入注册表函数会判断m_bSaveState 1.VC2008集成了BCGControlBar的相关功能,用wizard生成的话如果选与BCGControlBar有关的性能,如预定皮肤,则应用程序是从CWinAppEx派生,再加CBCGPWorkspa

tengxiaoming的专栏 6012

MFC之CBCGPMenuBar、CBCGPToolBar 去掉自定义按钮Customize...

在MFC中会经常的使用菜单栏与工具栏,这给我们带来了很大的方便,但同时也导致了一些因素是我们很难控制的,就比如菜单栏、工具栏的Customize... 在做语言翻译这块时, 虽然可以把Customize...给翻译出来,但是也有一些是控制不了的,就比如: 虽然可以通过很麻烦的重载给搞出来,但是因为不需要这自定义功能所以就把它屏蔽了,改怎么...

Ilson_的博客 1052

MFC Ribbon框架禁止默认的弹出式菜单ContextMenu

使用MFC Ribbon的框架,在OutLookBar上点击鼠标右键,往往弹出一个系统默认的菜单,如下图:我尝试了多种方法都不能将其禁止。 经过跟踪调试,当按下鼠标右键时,首先响应的Windows消息是WM_CONTEXTMENU,而不是WM_RBUTTONDOWN。 可以在创建OutlookBar的地方设置断点,单步跟踪进入MFC代码。 这样的目的是,VisualStudio帮我们

吕振华的专栏 2798

BCGControlBar 中文教程

{ // 把鼠 标事件连接到特定 的视图 : GetMouseManager()->AddView (iIdTestView, _T("Test view"), IDR_VIEW); // 初始化上下文菜单: GetContextMenuManager()->AddMenu (_T("Test menu"), idMenu); }

STM32F429+LAN8720实战:5分钟搞定LWIP裸机网络通讯(附完整代码)

本文详细介绍了如何在STM32F429微控制器上,结合LAN8720 PHY芯片,在裸机环境下快速部署和配置LWIP协议栈以实现网络通讯。内容涵盖硬件RMII接口连接、STM32CubeMX关键配置、代码移植与定制,以及常见问题排查方法,帮助工程师在资源受限的嵌入式系统中高效实现稳定的以太网功能。

2y3u4i5o6p的博客 963

【飞机】数据驱动的多传感器飞机健康监测系统【含Matlab源码 15551期】

数据驱动的多传感器飞机健康监测系统 完整代码,包运行;可提供讲解和运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 338

linux 驱动 - pinctrl子系统

分析总结 pinctrl 子系统框架结构,平台 mtk6771 内核版本 kernel-4.4 , 本文所有的分析均基于此版本。

sty01z的博客 1557

【飞机】基于matlab数据驱动的多传感器飞机健康监测系统【含Matlab源码 15551期】

数据驱动的多传感器飞机健康监测系统 完整代码,包运行;可提供讲解和运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 403

Unity事件总线第一篇:为什么你的游戏需要一个事件总线?

本文探讨了游戏开发中常见的跨模块调用导致代码强耦合的问题。通过一个攻击按钮触发角色攻击、怪物掉血和血条更新的案例,分析了直接调用方式带来的维护困难、扩展性差和模块重用性低等弊端。文章提出使用事件总线(Event Bus)作为解决方案,通过发布-订阅模式实现模块解耦。重构后的代码中,各模块只需与事件总线交互,彼此不再直接依赖。这种设计使得新增功能(如音效)无需修改现有代码,大大提高了系统的可维护性和扩展性,同时增强了模块的重用性,完美体现了开闭原则。

qq_46348216的博客 1298

我看MFC的过去、现在和未来

首先说句题外话,虽然我现在的“主业”是Qt,但自己扪心自问,对MFC的熟悉程度要超过Qt。正是由于有了对MFC的熟悉,才能在使用Qt时,比较清醒的认清两者的优劣之处,在此暂且不提。 这个话题也可以说是由来已久,众说纷纭,今时我也谈谈自己的感悟。 一、对MFC的总体看法 首先看看云风在其《游戏之旅-我的编程感悟》一书中对MFC的看法: “我所见到的程序员中,很多把C+

qter_wd007的专栏 6116

linux文件描述符与重定向,Linux --- 文件描述符和重定向

1.预备知识标准输入(stdin)、标准输出(stdout)和标准错误(stderr)是编写脚本的时候经常使用的,因为输出的信息可能是上述的一种。文件描述符 是与打开的某个文件或者数据流相关联的整数。文件描述符0,1,2是系统预留的。0 - stdin(标准输入)1 - stdout(标准输出)2 - stderr(标准错误)2.实例echo This is a sample. > temp...

weixin_34227128的博客 261

量化交易新手必看:如何用vnpy+Tushare轻松获取A股历史数据(附完整代码)

本文为量化交易新手提供了使用vnpy和Tushare构建A股历史数据获取系统的完整指南。通过详细的代码示例,手把手教你搭建环境、封装数据获取引擎,并实现日线等数据的格式转换与本地存储,为策略回测与分析奠定坚实的数据基础。

weixin_29098117的博客 378

如何在word里插入PDF文件/图片

WORD 2016版,Photoshop 2018 CC 首先是如何插入PDF文件 找到菜单栏的插入然后点击对象 然后点击由文件创建选项卡再点击浏览找到自己的pdf 但是这种方法只能显示第一页 双击可以打开pdf原件 然后怎么让word里显示所有的PDF呢 需要把PDF转成JPG或者PNG,还是以图片的形式插入 用Photoshop打开pdf 然后按Shirft键点击最后一个 全选下面的缩略图 然后文件菜单栏点击导出,再点击导出为 然后就保存成功啦!(就是需要一个个保存,适合页数少的pdf

拔牙不打麻药 1万+

ubuntu通过qemu安装银河麒麟V10_Arm_v8 (kylin_v10_飞腾/鲲鹏版)

一、windows下安装vmware虚拟机 二、ubuntu下载地址 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/20.04/ubuntu-20.04.3-live-server-amd64.iso 三、vmware中新建虚拟机,并使用ubuntu-20.04.3-live-server-amd64.iso作为启用盘 。。。在虚拟机中安装ubuntu(略) 四、配置ssh(如果ssh登录不上时配置) 修改openssh的配置 vi /etc/s

u010533742的博客 8705

YOLOv11低光照检测性能优化:基于Retinexformer主干网络的深度改进实践

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!@[TOC]在自动驾驶、安防监控、遥感探测等关键领域,目标检测系统必须保证24小时全天候的可靠工作。然而,现有最先进的目标检测模型,包括YOLOv11,其训练数据大多源于光照良好的场景。当环境光照条件急剧下降时,图像会出现严重的噪声、低对比度、颜色失真和细节丢失,直接导致模型性能断崖式下跌。常规的解决方案如图像直方图均衡化或简单的伽马校正,往往收效甚微,甚至可能放大噪声,进一步干扰检测。

m0_71589036的博客 190

对ZeroMQ速度的质疑

都说ZeroMQ的速度很快,到底有多快?官方说的每秒百万笔交易速度,真有这么NB?这两天用ZeroMQ实现了一个交易中间件,可惜速度只有5000笔每秒的速度,为啥差距这么大呢?问题到底在哪里呢? 1. 支持的所有模式中,PUB/SUB性能最好,在CPU:E8400,内存1G的机器上可以轻松跑到每秒接近百万笔交易的传输速度。(PUB/SUB 底层使用UDP协议) 2. 所有模

membphis的专栏 4094

从 QQ 聊天到 AI Agent:AstrBot + NapCat 接入 DeepSeek

<think>我们根据要求,根据提供的内容生成≤150字的文章摘要。内容是关于在Windows上使用Docker部署AstrBot+NaPCat,配置DeepSeek,实现QQ AI机器人。摘要需简洁概括主要步骤和结论。注意字数。</think>在Windows 11上通过Docker一键部署AstrBot与NapCat,实现QQ机器人。NapCat扫码登录QQ,AstrBot接入并配置DeepSeek API,完成AI对话。后续可扩展人格、插件及MCP工具,并通过cpolar提供公网管理入口,打造可扩展的

天道酬勤 1万+

Linux --- 文件描述符和重定向

1.预备知识 标准输入(stdin)、标准输出(stdout)和标准错误(stderr)是编写脚本的时候经常使用的,因为输出的信息可能是上述的一种。 文件描述符 是与打开的某个文件或者数据流相关联的整数。文件描述符0,1,2是系统预留的。 0 - stdin(标准输入)1 - stdout(标准输出)2 - stderr(标准错误) 2.实例 echo This is a

yapian8的专栏 1166

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

如何完全卸载腾讯视频和腾讯会议

搜索控制面板 选择卸载程序 选择卸载 选择卸载 并勾选设置 还是在卸载程序里找到软件,右键卸载 选择解除安装 然后打开ccleaner 选择清理注册表 记得先备份 然后就清理完成啦。 分享今日喜悦:数字图像处理满绩啦!开心!!!高老师真的好好哦,我再也不嫌老师给分低了15551 ...

拔牙不打麻药 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

如何把SQL SERVER 2008 R2 卸载干净

是这样的,老师布置要我们用eclipse连接数据库,但是连接好之后就疯狂报错 然后老师建议去SQL server里查询一下 但是! 这个时候出来的是0条受影响! 然后我把0开始的都删了,出来了三十几条结果,里面都么有和listening相关的,端口啥的我都检查过了都正常,就是不知道为什么呜呜呜。然后实在没办法只能来重装了。 开工! 先进入控制面板,点击卸载程序 选择SQL SERVER 2...

拔牙不打麻药 3839

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Flutter线程模型

事件循环在UI框架里面应该算是一个常见的东西,例如安卓主线程里面就有个Looper一直在MessageQueue里面读取事件。Flutter里面也有类似的东西。 实际上Flutter的事件循环应该是Dart语言层面就支持的东西。Dart是单线程模型的编程语言,它的一个线程对应一个Isolate,而一个Isolate就会带有一个事件循环。值得注意的是虽然你可以启动多个Isolate来实现多线程,但是正如它的名字"隔离",Isolate之间是内存隔离的,

xiaokangss的博客 250

数据库大作业小结

(看弟弟写了我也想写,我就是弟弟的跟屁虫 其实刚开始有点担心,感觉学的不是很扎实就心慌慌的,但是上手就还好,慢慢做也做的出来,功能比较基础。 老师在我们汇报的时候也提了很多问题,比如把文本框显示改成用有表头的表格显示这样更加清晰,再比如我们的商城也要加一个购物的过程去展示一下,但是这个没有写;其他都还好。 其实我走的弯路比较少,很多都是弟弟告诉我怎么去实现这个细节这样,然后这个细节也是她走过的弯路(表扬弟弟!) 不知道是不是因为我们是第一组,还是因为我们这个例子比较少,老师也没有怎么为难我们,(也可能是平

拔牙不打麻药 995
上一篇: 消息
下一篇: duoview
uda1985
博客等级 码龄17年 39粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值