CToolBar的使用总结(转2)

CToolBar上加载位图 0. resource.h #define IDR_BC_SEARCH                   32804          //工具栏上的按钮 #define IDR_BC_ADD_NOTE                 32805 #define IDR_BC_TEST_CNN                 32806 1. 声明两个成员变量 CToolBar 阅读详情

4、工具条的停靠位置

(1)标准工具条的停靠位置

工具条类CToolBar是控制条类CControlBar 的派生类,其显示的初始停靠位置是通过调用继承的函数CControlBar::EnableDocking(DWORD dwStyle)来确定的,其参数dwStyle用来指定停靠具体位置,与本文有关的风格如下,其余请参阅VC5的联机帮助:

CBRS_ALIGN_TOP 工具条停靠在客户区域顶部

CBRS_ALIGN_BOTTOM 工具条停靠在客户区域底部

CBRS_ALIGN_LEFT 工具条停靠在客户区域左边

CBRS_ALIGN_RIGHT 工具条停靠在客户区域右边

CBRS_ALIGN_ANY 工具条停靠在客户区域任何位置

利用应用程序向导AppWizard 生成的应用程序,其默认的停靠位置为CBRS_ALIGN_ANY,即允许停靠在客户区域的任何边,正常显示时为靠近客户区域的顶部:EnableDocking(CBRS_ALIGN_ANY) ,详见上述的工具栏建立函数ONCREATE()。

应用程序的单文档和多文档的窗口框架类均为CFrameWnd 的派生类,其指定工具条的停靠位置均是通过调用继承的函数 CFrameWnd::EnableDocking(DWORD dwDockStyle)来实现的,其可选的参数除上述五种之外,还增加了CBRS_FLOAT_MULTI参数,这个参数主要是为设计浮动工具条而增加 的,其用来确定一个框架窗口中允许存在多个浮动工具栏。同样利用应用程序向导AppWizard 生成的应用程序,其默认的停靠位置也是CBRS_ALIGN_ANY,即允许停靠在框架窗口的任何边,正常显示时为靠近框架窗口的顶部,即为 EnableDocking(CBRS_ALIGN_ANY),详见上述的工具条建立函数ONCREATE()。

(2)浮动工具条的停靠位置

当一个框架窗口中存在多个浮动工具条时,需要利用函数void DockControlBar(CControlBar *pBar,UINT nDockBarID=0,LPCRECT lpRect= NULL)来确定要控制停靠位置的工具条,它也是CFrameWnd类的成员函数,其中参数pBar用来指向被控制停靠位置的工具条对象,参数 nDockBarID用来确定工具条停靠在框架窗口的哪条边上,取值为:

AFX_IDW_DOCKBAR_TOP 工具条停靠在框架窗口的顶部

AFX_IDW_DOCKBAR_BOTTOM 工具条停靠在框架窗口的底部

AFX_IDW_DOCKBAR_LEFT 工具条停靠在框架窗口的左边

AFX_IDW_DOCKBAR_RIGHT 工具条停靠在框架窗口的右边

如果参数nDockBarID取值为0,则工具条可以停靠在框架窗口中的任何一个可停靠的边上,其默认位置为顶部。

(3)工具条的连接停靠方法

在很多应用程序中都存在将多个工具条同时停靠在某窗口的某一条边上的同一工具条窗口中的情况,利用上述工具条控制函数DockControlBar的lpRect参数,通过控制工具条的停靠矩形区域来实现这个功能,如笔者实现的函数如下:

①在主程序实现文件MainFrm.h中增加函数定义

public:

void DockControlBarLeftOf(CToolBar* Bar,CToolBar* LeftOf);

②在主程序实现文件MainFrm.cpp中增加如下函数

void CMainFrame::DockControlBarLeftOf(

CToolBar* Bar,CToolBar* LeftOf)

{ //设置工具条停靠在同一边窗口中

CRect rect;

DWORD dw;

UINT n;

RecalcLayout();//重新显示

LeftOf->GetWindowRect(&rect);

rect.OffsetRect(1,0);//设置偏移值以停靠在同一窗口中

dw=LeftOf->GetBarStyle();

n=0;

n=(dw&CBRS_ALIGN_TOP)?AFX_IDW_DOCKBAR_TOP:n;

n=(dw&CBRS_ALIGN_BOTTOM&&n==0)?AFX_IDW_DOCKBAR_BOTTOM:n;

n=(dw&CBRS_ALIGN_LEFT&&n==0)?AFX_IDW_DOCKBAR_LEFT:n;

n=(dw&CBRS_ALIGN_RIGHT&&n==0)?AFX_IDW_DOCKBAR_RIGHT:n;

DockControlBar(Bar,n,&rect);

}

在这个函数中应注意对RecalcLayout()函数和OffsetRect()函数的调用,前一个函数用来重新显示被调整的客户区和工具条,后一个函数用来重新确定矩形区域,这相当于用鼠标将第二个工具条拖动到前一个工具条上。

③修改应用程序建立函数OnCreate()函数中的相应DockControlBar()函数为DoctControlBarOf()函数,并正确设置工具条指针,见工具条的建立技巧中的有关函数。

(4)定制工具条的顶部停靠控制

另一种工具条的停靠位置是定制工具条的停靠位置,如具有通用控制功能工具条的停靠位置,这主要实现左侧定制工具条与顶部工具条之间的位置关系。其实现方法如下:

①打开菜单资源增加顶部位置控制菜单项IDD_DLGBARTOP;

②在实现文件MainFrm.h中增加成员控制变量m_bDialogTop;

BOOL m_bDialogTop;

并在构造函数中为其设置初始值;

③利用类向导函数为菜单项设置响应函数;

④在实现文件MainFrm.cpp中完善消息映射函数。

void CMainFrame::OnButtonDlgbartop()

{ //定制工具条顶部位置控制函数

if (m_bDialogTop) m_wndDlgBar.SetWindowPos(

&m_wndStatusBar,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);

//其它工具条停靠在最顶部,该工具条停靠其下

else m_wndDlgBar.SetWindowPos(&wndTop,0,0,0,0,

SWP_NOSIZE|SWP_NOMOVE);//停靠在最顶部

RecalcLayout(); //重新显示窗口

m_bDialogTop=!m_bDialogTop;//改变变量标志

}

void CMainFrame::OnUpdateButtonDlgbartop(CCmdUI* pCmdUI)

{ //设置菜单项检查状态

pCmdUI->SetCheck(m_bDialogTop);

}

5、工具条按钮的排序方法

利用应用程序向导AppWizard 生成的应用程序工具条,其按钮均为单行水平排列的,这在实际程序开发时既不美观又不实用,很多大型应用程序等界面中的工具条都采用多行多列的排序方式,要在自己的应用程序中实现这种排列方式,应按下述方法在派生类中控制:

(1)在TestToolBar.h中增加函数定义和成员变量控制

class CTestToolBar : public CToolBar

{......//其它代码

public:

CTestToolBar(); //在构造函数后增加下一行

void SetColumns(UINT nColumns);//增加列控制

......//其它代码

protected: //增加成员变量

UINT m_nColumns; //工具条列按钮数

......//其它代码

}

(2)在TestToolBar.cpp中增加变量初始化和函数

CTestToolBar::CTestToolBar()

{ //在构造函数中初始化变量

m_nColumns=0; //工具条按钮列数

......//其它代码

}

void CTestToolBar::SetColumns(UINT nColumns)

{ //设置按钮排列格式

m_nColumns=nColumns;//列数

int nCount=GetToolBarCtrl().GetButtonCount();//按钮数

for(int i=0;i<nCount;i++){

UINT nStyle=GetButtonStyle(i);//按钮风格

BOOL bWrap=(((i+1)%nColumns)==0);

if(bWrap) nStyle|=TBBS_WRAPPED;//设置换行

else nStyle&=~TBBS_WRAPPED;//不换行

SetButtonStyle(i,nStyle);//设置风格

}

Invalidate();//窗口更新

GetParentFrame()->RecalcLayout();//工具栏状态更新

}

(3)在应用程序建立函数OnCreate()中为相应的工具条增加列控制功能,并注意对保存和恢复工具条状态函数的列控制参数处理,请参阅工具条建立技巧和状态保存与恢复中的有关函数,重新编译并执行应用程序就可以看到多行多列的工具条。

6、工具条的消息映射技巧

如果工具条上的按钮都存在对应的菜单命令,那么可以直接利用类向导ClassWizard 进行命令消息的映射,否则必须通过手工的方法来进行命令按钮的消息映射。由于同一工具栏的命令按钮都存在相类似的功能,所以只要注意将同一工具条中的命令 按钮ID值设置成连续值,就可以利用范围命令处理机制统一对所有按钮命令进行管理,即所有命令按钮的消息可以在同一命令消息处理函数和更新命令消息处理函 数中进行管理,这样不但结构紧凑而且维护特别方便。鉴于类向导ClassWizard 不支持范围命令处理功能,所以其消息映射机制必须通过手工方式来完成。按钮命令消息既可以在框架窗口中映射,也可以在文档和视图中完成映射,由于文档对象 通常用来管理程序中的数据部分,并且在多文档应用程序(MDI) 中,一个文档可能有多个视图与之关联,因此把工具栏中的命令按钮消息映射在文档中比较合适些。其实现步骤如下:

(1)在文档实现文件CToolDoc.h中增加函数定义和数据成员:

class CCTOOLDoc : public CDocument

{......//其它代码

protected:

UINT iPosition; //命令按钮消息位置

......//其它代码

protected:

//{{AFX_MSG(CCTOOLDoc)

afx_msg void OnTool(UINT nID);//命令消息映射

afx_msg void OnUpdateTool(CCmdUI* pCmdUI);//更新消息映射

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

......//其它代码

}

(2)在文档实现文件CToolDoc.cpp中进行消息映射

BEGIN_MESSAGE_MAP(CCTOOLDoc,CDocument)

//{{AFX_MSG_MAP(CCTOOLDoc)

ON_COMMAND_RANGE(ID_BUTTON_LINE,

ID_BUTTON_SORT,OnTool);

ON_UPDATE_COMMAND_UI_RANGE(ID_BUTTON_LINE,

ID_BUTTON_SORT,OnUpdateTool);

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

函数中的参数ID_BUTTONLINE和ID_BUTTONSORT分别为工具栏中第一个按钮和最后一个按钮的消息,如果要增加或减少了按钮数,则必须使其ID值保持连续,并且需要修改函数中的最后一个消息值。对应函数的代码如下:

void CtoolDoc::OnTool(UINT nID)

{ //按钮消息处理函数

iPosition=nID-ID_BUTTON_LINE;

switch(iPosition){

case 1:

......//调用按钮一的处理功能

case 2:

......//调用按钮二的处理功能

......

case n:

......//调用按钮N的处理功能

break;

}

}

void CToolDoc::OnUpdateTool(CCmdUI* pCmdUI)

{ //更新按钮函数

pCmdUI->SetCheck(iPosition==(pCmdUI->m_nID

-ID_BUTTON_LINE));

}

由于命令按钮比较多,其处理功能代码部分这里省略。

7、驾驭工具条按钮的状态显示更新

(1)互斥按钮的状态更新

很多应用程序中都存在相互排斥的工具条按钮,如开始和停止按钮,初始状态时停止按钮被禁止,当应用程序进行数据通讯、查找和打印等功能时,停止按钮有效而开始按钮禁止,当命令结束或按停止按钮后,开始按钮有效而停止按钮被禁止。这就是工具条中按钮的显示状态更新问题。

与菜单栏一样,工具条的构造、析构过程及其窗口的创建都是由应用程序的主框架窗口来管理的。当用户点击 菜单条的菜单项时,Windows 就会向应用程序发送WM_INITMENUPOPUP消息,以便应用程序在菜单显示之前对菜单项进行添加或修改,当利用MFC 类库编程时只要针对某一具体的菜单项进行消息映射,加入相应的消息处理函数,MFC类库就会发送更新消息UPDATE_COMMAND_UI,使菜单在弹 出时消息处理函数能够对菜单项进行禁止、变灰和其它处理。工具条的消息处理过程与菜单栏完全相同,它也存在工具条显示更新消息 UPDATE_COMMAND_UI ,只不是由于工具条总是处于显示状态,所以对其消息处理函数的调用是在应用程序的空闲状态时进行处理的,这点与菜单栏有所不同,当应用程序命令按钮所要执 行的功能占用大量的处理器资源时,如进行通讯处理或大量数据计算时,应用程序的主框架窗口就无暇进入空闲状态,于是工具条中的命令按钮函数就不能被及时调 用,按钮的显示状态就不能被及时更新,这就为工具条按钮的显示状态及时更新带来一定的困难。

基于文档的应用程序一般情况下都是在文档视中对工具条按钮进行处理,所以要实现按钮显示状态的及时更新,必须在命令按钮响应函数中利用CToolBarCtrl类的成员函数EnableButton()函数对按钮的显示状态进行必要的处理,其步骤如下:

①首先利用类向导ClassWizard 对CCTOOLView类进行开始按钮和停止按钮的COMMAND命令消息映射,增加对应消息的处理函数;

②在实现文件CTOOLView.h中增加成员变量:

public:

BOOL m_bContiune;//开始按钮标志

BOOL m_bSet;//结束按钮标志

③在实现文件CTOOLView.cpp中增加代码完善按钮状态更新:

......//其它代码

void DrawRectText(RECT &rc,CDC &dc);

......//其它代码

void CCTOOLView::OnButtonStart()

{ //完善开始按钮函数功能

CToolBar *pToolBar=(CToolBar *)//取得工具栏对象指针

(GetParentFrame()->GetControlBar(IDR_DOCKTOOLBAR));

//取得工具条控制指针

CToolBarCtrl *pToolBarCtrl=&(pToolBar->GetToolBarCtrl());

//控制工具条按钮状态

pToolBarCtrl->EnableButton(ID_BUTTON_START,FALSE);

pToolBarCtrl->EnableButton(ID_BUTTON_STOP,TRUE);

CClientDC dc(this);//取得设备文本

MSG msg;//定义消息

RECT rc;

GetClientRect(&rc);//以下画网格并显示

m_bContinue=TRUE;

m_bSet=FALSE;

for(int ii=0;ii<2;ii++){

if(m_bContinue==TRUE){

ii=0;//状态改变退出

DrawRectText(rc,dc);

GetMessage(&msg,NULL,0,0);//检查消息

TranslateMessage(&msg);//解释消息

DispatchMessage(&msg);//分配消息

}

}

ReleaseDC(&dc);

m_bSet=TRUE;

}

void DrawRectText(RECT &rc,CDC &dc)

{ //显示文本函数

int i,j,k,nDist=10;

CPen pen,*pOldPen;

pen.CreatePen(PS_SOLID,1,RGB(180,0,0));

pOldPen=dc.SelectObject(&pen);//绘制背景网格

j=rc.right/nDist+1;

k=rc.bottom/nDist+1;

for(i=0;i<j+k;i++){

dc.MoveTo(i*nDist,0);

dc.LineTo(0,i*nDist);

if(i<j){

dc.MoveTo(i*nDist,0);

dc.LineTo(rc.right,(j-i)*nDist);

} else {

dc.MoveTo(0,(i-j)*nDist);

dc.LineTo(rc.right,i*nDist);

}

}

dc.SelectObject(pOldPen);

DeleteObject(&pen);

CFont font,*pOldFont;

font.CreateFont(50,50,0,0,1000,//创建字体

1,1,0,ANSI_CHARSET,

OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,

DEFAULT_QUALITY,DEFAULT_PITCH,NULL);

pOldFont=dc.SelectObject(&font);

dc.TextOut(10,10,"BUTTON");

dc.SelectObject(pOldFont);

DeleteObject(&font);

}

void CCTOOLView::OnButtonStop()

{ //完善停止按钮函数

m_bContinue=FALSE;

CToolBar *pToolBar=(CToolBar *)//取得工具栏对象指针

(GetParentFrame()->GetControlBar(IDR_DOCKTOOLBAR));

//取得工具条控制指针

CToolBarCtrl *pToolBarCtrl=&(pToolBar->GetToolBarCtrl());

//控制工具条按钮状态

pToolBarCtrl->EnableButton(ID_BUTTON_START,TRUE);

pToolBarCtrl->EnableButton(ID_BUTTON_STOP,FALSE);

for(int jj=0;jj<2;jj++){

if(m_bSet==FALSE){

jj=0;

GetMessage(&msg1,NULL,0,0);//检查消息

TranslateMessage(&msg1);//解释消息

DispatchMessage(&msg1);//分配消息

}

}

}

在开始按钮函数中,当在屏幕上不断显示信息的同时必须利用消息处理函数检查消息队列,并解释和分配相应 的消息,否则其它按钮就无法检查到应用程序的鼠标等消息,无法实现显示状态更新;在更新按钮显示状态前,必须先取得工具栏对象和相应的控制指针,然后才能 实现对按钮状态的控制,并且要实现按钮状态的更新,其设置按钮的更新功能函数必须最后执行结束才能有效,即在停止按钮函数中必须判断标志并检测消息队列。

④在平面工具条派生类中的鼠标按下函数中增加代码,以实现鼠标按下开始和停止按钮后,保证按钮的正常按下和显示状态:

void CTestToolBar::OnLButtonDown(UINT nFlags, CPoint point)

{ //完善鼠标按下函数

......//其它代码

if(m_nIndex==ToolBarCtrl.CommandToIndex(ID_BUTTON_STOP)){

ToolBarCtrl.SetState(ID_BUTTON_STOP,ToolBarCtrl.GetState(

ID_BUTTON_STOP)&(~TBSTATE_ENABLED&~TBSTATE_PRESSED));

ToolBarCtrl.SetState(ID_BUTTON_START,ToolBarCtrl.

GetState(ID_BUTTON_START)|TBSTATE_ENABLED);

ToolBarCtrl.Invalidate();

AfxGetApp()->OnIdle(-1);

m_nIndex=0xffff;

}

if(m_nIndex==ToolBarCtrl.CommandToIndex(ID_BUTTON_START)){

ToolBarCtrl.SetState(ID_BUTTON_START,ToolBarCtrl.GetState(

ID_BUTTON_START)&(~TBSTATE_ENABLED & ~TBSTATE_PRESSED));

ToolBarCtrl.SetState(ID_BUTTON_STOP,ToolBarCtrl.GetState(

ID_BUTTON_STOP)&TBSTATE_ENABLED);

ToolBarCtrl.Invalidate();

AfxGetApp()->OnIdle(-1);

m_nIndex=0xffff;

}

}

(2)按钮按下状态的切换更新

另一种按钮状态的更新情况是按钮按下状态的切换更新,这在绘图工具条和屏幕字体效果工具条中最常见。其实现步骤如下:

①首先在MainFrm.cpp中手工增加消息范围映射函数

ON_COMMAND_RANGE(ID_EDIT_TOGGLE,ID_EDIT_UNINDENT,OnButton)

ON_UPDATE_COMMAND_UI_RANGE(ID_EDIT_TOGGLE,

ID_EDIT_UNINDENT,OnUpdateButton)

②然后在MainFrm.h中消息映射的最后增加成员函数定义和记录按下按钮序号的成员控制变量

int m_bIndex;//按下按钮序号

afx_msg void OnButton(UINT nID);

afx_msg void OnUpdateButton(CCmdUI* pCmdUI);

③最后分别增加实现消息函数的功能代码

void CMainFrame::OnUpdateButton(CCmdUI* pCmdUI)

{ //按钮按下检查状态设置函数

pCmdUI->SetCheck((UINT)(ID_EDIT_TOGGLE+

m_bIndex) == pCmdUI->m_nID);

}

void CMainFrame::OnButton(UINT nID)

{ //记录按下按钮的序号

m_bIndex=(int)(nID-ID_EDIT_TOGGLE);

}

如果涉及到其它控制的变化,可在这两个函数中分别增加。

(3)按钮的部分显示更新

最后一种更新工具条按钮显示状态的情况是部分按钮显示,这需要利用SetButtons()和SetButtonInfo()函数有效处理。步骤如下:

①首先在菜单栏中增加控制菜单项;

②在应用程序实现文件CTool.h中增加如下消息定义和函数定义

......//其它代码

#define WM_IDLEACTIVATE WM_USER+1

......//其它代码

class CCtrlbarsApp : public CWinApp

{

public:

......//其它代码

virtual BOOL OnIdle(LONG lCount);

......//其它代码

};

③在应用程序实现文件CTool. cpp中增加如下代码和副本函数功能,这个函数在工具条按钮的各种显示状态更新中都非常有用,是一个非常重要的程序设计技巧。

在初始化函数CCTOOLApp::InitInstance()最后增加代码:

m_pMainWnd = pMainFrame;

完善相应的功能函数:

BOOL CCTOOLApp::OnIdle(LONG lCount)

{ //保持应用程序一个副本函数

if(lCount == 0){

ASSERT(m_pMainWnd != NULL);

for(HWND hWnd=::GetWindow(m_pMainWnd->m_hWnd,

GW_HWNDFIRST);hWnd!=NULL;hWnd=::GetNextWindow(

hWnd,GW_HWNDNEXT)){//获取主程序子窗口

if(::GetParent(hWnd)==m_pMainWnd->m_hWnd){

if(GetActiveWindow()==hWnd&&(::GetCapture()==NULL))

m_pMainWnd->SetActiveWindow();//保持应用程序活动窗口

SendMessage(hWnd,WM_IDLEUPDATECMDUI,(WPARAM)TRUE,0L);

}//保持窗口的一个有效副本

}

}

return CWinApp::OnIdle(lCount);

}

④最后在菜单项处理函数中进行工具条按钮的重组处理,并在需要处理应用程序窗口副本的任何函数中增加副本处理函数。

void CMainFrame::OnViewShort()

{

m_wndMainToolBar.SetButtons(NULL,7);//共计7个

m_wndMainToolBar.SetButtonInfo(0,ID_BUTTON_LINE,TBBS_BUTTON,1);

m_wndMainToolBar.SetButtonInfo(1,ID_BUTTON_CURSE,TBBS_BUTTON,5);

......

m_wndMainToolBar.SetButtonInfo(6,ID_BUTTON_TEST,TBBS_BUTTON,7);

m_wndToolBar.Invalidate();//更新工具条

AfxGetApp()->OnIdle(-1);//窗口副本处理函数

}

8、工具条中的通用控制使用

在工具条中通常不都是按钮,如存在输入框、下拉组合框和检查盒按钮等。这就需要利用VC中提供的特殊类型的工具条类控制或通过派生新类的方法来实现。

(1)在派生的新类中实现控制

如果利用派生新类的方法,很容易就可以实现文本输入框等通用控制功能。其实现步骤如下:

①利用类向导ClassWizard 建立新类CEDITBAR并生成实现文件;

②利用资源编辑器建立工具条的位图文件;

③在新类实现文件EDITBAR.h中增加如下函数定义和成员变量:

class CEDITBAR : public CToolBar

{

public:

CEDITBAR();

CSearchBox m_SearchBox;//文本查找控制

BOOL Init(CWnd* pParentWnd,BOOL bToolTips);

BOOL SetColor(BOOL bColor);

BOOL SetHorizontal();

BOOL SetVertical();

......//其它代码

BOOL m_bVertical;

//virtual CSize CalcFixedLayout(BOOL bStretch,BOOL bHorz);

virtual CSize CalcDynamicLayout(int nLength,DWORD dwMode);

......//其它代码

}

④在新类实现文件EDITBAR.cpp中增加如下函数:

......//其它代码

#define COMBOBOX_INDEX 5 //定义组合框参数

#define COMBOBOX_WIDTH 150

#define COMBOBOX_HEIGHT 150

#define COMBOBOX_BITMAP 4

static UINT BASED_CODE EditButtons[] =

{ //要求与工具栏位图顺序对应

ID_EDIT_TOGGLE,

ID_EDIT_NEXT,

ID_EDIT_PREV,

ID_EDIT_CLEARALL,

ID_SEPARATOR,

ID_EDIT_FINDEDIT,

ID_SEPARATOR,

ID_EDIT_FINDINFILES,

ID_SEPARATOR,

ID_EDIT_INDENT,

ID_EDIT_UNINDENT,

ID_SEPARATOR,

ID_WINDOW_NEW,

ID_WINDOW_SPLIT,

ID_WINDOW_CASCADE,

ID_WINDOW_HORZ,

ID_WINDOW_VERT,

};

......//其它代码

BOOL CEDITBAR::Init(CWnd* pParentWnd,BOOL bToolTips)

{ //初始化输入框函数

m_bVertical=FALSE;

DWORD dwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_SIZE_DYNAMIC;

if(bToolTips)dwStyle|=(CBRS_TOOLTIPS|CBRS_FLYBY);

if(!Create(pParentWnd,dwStyle,IDB_CEDIT)) return FALSE;

if(!LoadBitmap(IDB_CEDIT)) return FALSE;

if(!SetButtons(EditButtons,sizeof(EditButtons)

/sizeof(UINT)))return FALSE;

CRect rect(-COMBOBOX_WIDTH,-COMBOBOX_HEIGHT,0,0);

// 非常重要:其一是可以从控制接收信息,如动态提示等

if(!m_SearchBox.Create(WS_CHILD|CBS_DROPDOWN|//建立文本查找

CBS_AUTOHSCROLL|WS_VSCROLL|CBS_HASSTRINGS,rect,this,

IDC_EDITBAR_SEARCHBOX)) return FALSE;

HFONT hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT);

if(hFont==NULL)hFont=(HFONT)GetStockObject(ANSI_VAR_FONT);

m_SearchBox.SendMessage(WM_SETFONT,(WPARAM)hFont);

if(!SetHorizontal())return FALSE;

return TRUE;

}

BOOL CEDITBAR::SetHorizontal()

{ //设置按钮水平排列函数

m_bVertical=FALSE;

SetBarStyle(GetBarStyle()|CBRS_ALIGN_TOP);

SetButtonInfo(COMBOBOX_INDEX,IDC_EDITBAR_SEARCHBOX,

TBBS_SEPARATOR, COMBOBOX_WIDTH);

if(m_SearchBox.m_hWnd!=NULL){

CRect rect;

GetItemRect(COMBOBOX_INDEX,rect);

m_SearchBox.SetWindowPos(NULL,rect.left,

rect.top,0,0,SWP_NOZORDER|SWP_NOACTIVATE|

SWP_NOSIZE|SWP_NOCOPYBITS);

m_SearchBox.ShowWindow(SW_SHOW);

}

return TRUE;

}

BOOL CEDITBAR::SetVertical()

{ //设置按钮垂直排列函数

m_bVertical=TRUE;

SetButtonInfo(COMBOBOX_INDEX,ID_EDIT_FIND,

TBBS_BUTTON, COMBOBOX_BITMAP);

if(m_SearchBox.m_hWnd != NULL)

m_SearchBox.ShowWindow(SW_HIDE);

return TRUE;

}

CSize CEDITBAR::CalcDynamicLayout(int nLength, DWORD dwMode)

{ //设置固定大小工具条函数

if (dwMode&LM_COMMIT) {

if (dwMode&LM_VERTDOCK)

if(!m_bVertical) SetVertical();

else if(m_bVertical) SetHorizontal();

return CToolBar::CalcDynamicLayout(nLength,dwMode);

} else {

BOOL bOld=m_bVertical;

BOOL bSwitch=(dwMode & LM_HORZ)?bOld:!bOld;

if (bSwitch){

if (bOld) SetHorizontal();

else SetVertical();}

CSize sizeResult=CToolBar::CalcDynamicLayout(nLength,dwMode);

if (bSwitch){

if (bOld) SetHorizontal();

else SetVertical();}

return sizeResult;

}

}

/*

CSize CEDITBAR::CalcFixedLayout(BOOL bStretch,BOOL bHorz)

{ //设置可变大小工具条函数

if(!bHorz&&(m_dwStyle&CBRS_SIZE_DYNAMIC)&&

!(m_dwStyle&CBRS_FLOATING)){

CSize size;

size=CControlBar::CalcFixedLayout(bStretch,bHorz);

CRect rect;

rect.SetRectEmpty();

CalcInsideRect(rect, bHorz);

size.cx=m_sizeVert.cx+(m_rectInsideVert.Width()-rect.Width());

size.cy=m_sizeVert.cy+(m_rectInsideVert.Height()-rect.Height());

return size;

} else {

if(m_bVertical) SetHorizontal();

return CToolBar::CalcFixedLayout(bStretch,bHorz);

}

}

*/

⑤利用类向导ClassWizard建立新类CSearchBox并生成实现文件,同时为新类增加解释消息,即在新类实现文件SearchBox.h中增加如下函数定义:

virtual BOOL PreTranslateMessage(MSG* pMsg);

⑥在其实现文件SearchBox.cpp文件中完善相应函数

BOOL CSearchBox::PreTranslateMessage(MSG* pMsg)

{ //消息解释函数

if((pMsg->message!=WM_KEYDOWN)||(pMsg->wParam!=VK_RETURN))

return CComboBox::PreTranslateMessage(pMsg);

// 在下拉列表中增加最后15次输入的数据

if((pMsg->lParam&0x40000000)==0){//不重复

CString strText;

GetWindowText(strText);

InsertString(0,strText);

SetCurSel(0);

if(GetCount()>15)

DeleteString(GetCount()-1);

}

return TRUE;

}

⑦在主程序实现文件MainFrm.h中增加工具条定义

#include "EDITBAR.H"

CEDITBAR m_wndEditBar;//带输入框工具条

⑧在主程序实现文件MainFrm.cpp中增加代码:

//在建立函数OnCreate中增加

if (!m_wndEditBar.Init(this,m_bToolTips)){

TRACE0("带编输入工具条建立失败/n");

return -1;}

......

DockControlBarLeftOf(&m_wndEditBar,

&m_wndTestToolBar);//连接工具条

此外,还可以为工具条增加按钮检查状态等控制功能,详见工具条按钮的显示状态更新。

(2)利用工具条风格类实现控制

利用工具条风格类同样可以实现下拉列表等控制功能,其具体步骤如下:

①为工具栏建立位图按钮并定义按钮对应的消息,同前;

②在实现文件MainFrm.h中增加工具栏控制和函数定义;

CStyleBar m_wndStyleBar;

BOOL CreateStyleBar()

③在实现文件MainFrm.cpp中增加控制代码

在建立函数OnCreate中增加建立函数

if (!CreateStyleBar()) return -1;

增加建立相应工具条函数的代码

BOOL CMainFrame::CreateStyleBar()

{ //建立具有下拉列表控制的工具条函数

const int nDropHeight = 100;

if(!m_wndStyleBar.Create(this,WS_CHILD|WS_VISIBLE|

CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY,IDW_STYLES)||

!m_wndStyleBar.LoadBitmap(IDB_STYLES)||!m_wndStyleBar.

SetButtons(styles,sizeof(styles)/sizeof(UINT))){

TRACE0("特殊风格工具条建立失败/n");

return FALSE;

}

// 建立组合框

m_wndStyleBar.SetButtonInfo(0,IDW_COMBO,TBBS_SEPARATOR,100);

// 设置组合框与按钮间距离

m_wndStyleBar.SetButtonInfo(1,ID_SEPARATOR,TBBS_SEPARATOR,12);

CRect rect;

m_wndStyleBar.GetItemRect(0,&rect);

rect.top=3;

rect.bottom=rect.top+nDropHeight;

if (!m_wndStyleBar.m_comboBox.Create(//建立组合框

CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP,

rect, &m_wndStyleBar, IDW_COMBO)){

TRACE0("组合框建立失败/n");

return FALSE;

}

CString szStyle;//填充组合框

if (szStyle.LoadString(IDS_LEFT))

m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);

......//同类的其它代码

LOGFONT logFont;//为组合框建立字体

memset(&logFont,0,sizeof(logFont));

if(!::GetSystemMetrics(SM_DBCSENABLED)){

logFont.lfHeight=-12;

logFont.lfWeight=FW_BOLD;

logFont.lfPitchAndFamily=VARIABLE_PITCH|FF_SWISS;

CString strDefaultFont;

strDefaultFont.LoadString(IDS_DEFAULT_FONT);

lstrcpy(logFont.lfFaceName, strDefaultFont);

if(!m_wndStyleBar.m_font.CreateFontIndirect(&logFont))

TRACE0("组合框建立字体失败/n");

else m_wndStyleBar.m_comboBox.SetFont(&m_wndStyleBar.m_font);

} else {

m_wndStyleBar.m_font.Attach(::GetStockObject(SYSTEM_FONT));

m_wndStyleBar.m_comboBox.SetFont(&m_wndStyleBar.m_font);

}

return TRUE;

}

同样,也可以为这个特殊风格的工具条增加其它控制功能。

(3)利用对话框类建立多功能工具条

利用对话框工具条类可以建立功能更加强大的工具条,在对话框中实现的功能都可以增加到工具条中去。工具步骤如下:

①利用对话框资源增加一个对话框IDD_DLGTOOLBAR,并设计好对话框中的所有功能及功能对应的ID标识;

②在实现文件MainFrm.h中增加对话框工具条类控制和成员变量

CDialogBar m_wndDlgBar; //对话框工具条控制

BOOL m_bDialogTop;//顶部标志

③在实现文件MainFrm.cpp中增加控制代码

在建立函数OnCreate函数的状态条建立函数后增加:

UINT nID, nStyle;

int cxWidth;

m_wndStatusBar.GetPaneInfo(0,nID,nStyle,cxWidth);

m_wndStatusBar.SetPaneInfo(0,nID,SBPS_STRETCH|SBPS_NORMAL,cxWidth);

if(!m_wndDlgBar.Create(this,IDD_TOOLBARCTRL,

CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY,IDD_TOOLBARCTRL)){

TRACE0("对话框工具条建立失败/n");

return -1;

}

一定要注意EnableDocking(CBRS_ALIGN_ANY)函数在所有建立函数的前面,并且对话框工具条在状态条建立函数的后面。

④为对话框资源中的所有控制消息手工增加映射,并完善相应的映射函数,可以是工具条的显示与隐藏等功能。示例函数如下:

BOOL CMainFrame::OnDocktool(UINT nID)

{ //控制工具条的显示与隐藏函数

BOOL bVisible = ((m_wndDockToolBar.GetStyle() & WS_VISIBLE) != 0);

ShowControlBar(&m_wndDockToolBar, !bVisible, FALSE);

RecalcLayout();

return TRUE;

}

void CMainFrame::OnUpdateDocktool(CCmdUI* pCmdUI)

{ //工具条检查状态更新

BOOL bVisible = ((m_wndDockToolBar.GetStyle() & WS_VISIBLE) != 0);

pCmdUI->SetCheck(bVisible);

}

⑤在菜单中增加顶部控制菜单项,建立消息函数后按照工具条的停靠位置中的方法为其完善相应的顶部控制功能函数。

9、工具条的显示和隐藏

(1)单一工具条的显示与隐藏

在大型应用程序中可能存在很多工具条,而用户实际使用时可能只需要其中的一部分,这就需要控制工具条的显示隐藏。对于单个工具条,其菜单项的一般控制方法为:

首先打开菜单编辑器,在查看菜单栏中增加工具条对应的子菜单项,如为TestToolBar 工具条增加的子菜单项的“测试”的ID为ID_BOTTON_TEST,其Caption 为“测试工具条”,依次增加其它工具条的控制子菜单项。利用类向导ClassWizard 为主框架窗口类CMainFrame增加各子菜单项的ONCOMMAND和ON_UPDATE_COMMAND_UI 消息映射功能函数,并完善对应的功能函数:

void CMainFrame::OnButtonTest()

{ //菜单命令消息函数

BOOL bVisible=((m_wndTestToolBar.GetStyle()&

WS_VISIBLE)!=0);//取得工具条状态

ShowControlBar(&m_wndTestToolBar,!bVisible,FALSE);

RecalcLayout();//更新工具条

}

void CMainFrame::OnUpdateButtonTest(CCmdUI* pCmdUI)

{ //菜单更新函数

BOOL bVisible=((m_wndTestToolBar.GetStyle()&

WS_VISIBLE)!=0);//取得工具条状态

pCmdUI->SetCheck(bVisible);//设置检查标志

}

(2)特殊工具条的显示与隐藏

当存在利用CStyleBar 类等建立的具有特殊控制功能的工具条时,工具条的显示与消隐必须利用下面的函数:

BOOL CMainFrame::OnEdittool(UINT nID)

{ //具有下拉组合框功能工具条显示与消隐函数

CWnd* pBar;//工具条窗口指针

if ((pBar=GetDlgItem(nID))==NULL)//取得鼠标点击项

return FALSE;//控制工具条窗口风格

pBar->ShowWindow((pBar->GetStyle()&WS_VISIBLE)==0);

RecalcLayout();//重新显示窗口

return TRUE;

}

void CMainFrame::OnUpdateEdittool(CCmdUI* pCmdUI)

{ //具有下拉组合框功能工具条状态更新

CWnd* pBar;//工具条窗口指针

if((pBar=GetDlgItem(pCmdUI->m_nID))==NULL){

pCmdUI->ContinueRouting();//继续判断

return;

} //设置检查状态

pCmdUI->SetCheck((pBar->GetStyle()&WS_VISIBLE)!=0);

}

(3)多工具条的显示与隐藏

如果存在很多工具条,使用菜单控制的方法并不方便,最好采用对话框设置的方法,如笔者在程序中通过对话框来控制工具条的显示与消隐、按钮排列数和动态提示功能的取舍。其步骤如下:

①首先打开资源列表中的对话框资源,利用"Insert->Resource-> Dialog"插入对话框IDD_TOOLBAR,在对话框中建立四个工具条复选框按钮、四个排列数值的单选按钮和两个动态提示功能的单选按钮(请有关图 形),并为各按钮设置ID标识和按钮名称,注意选中每组按钮中首按钮的Group属性;

②通过双击增加的对话框标题栏为对话框建立新类CToolDlg和两个实现文件ToolDlg.h和ToolDlg.cpp;

③打开对话框实现文件ToolDlg.h,增加如下成员控制变量:

class CToolDlg : public CDialog

{ ......//其它代码

//{{AFX_DATA(CToolDlg)

enum { IDD = IDD_TOOLBAR };

BOOL m_bMainTool;//各工具条控制变量

BOOL m_bTestTool;

BOOL m_bDockTool;

BOOL m_bDockNext;

int m_nToolTips;//动态提示控制变量

int m_nColumns; //按钮排列数控制变量

......//其它代码

}

④在实现文件ToolDlg.cpp中增加如下控制代码:

CToolDlg::CToolDlg(CWnd* pParent /*=NULL*/)

: CDialog(CToolDlg::IDD, pParent)

{ //完善成员变量初始化

//{{AFX_DATA_INIT(CToolDlg)

m_bMainTool = FALSE;

m_bTestTool = FALSE;

m_bDockTool = FALSE;

m_bDockNext = FALSE;

m_nToolTips = -1;

m_nColumns = -1;

//}}AFX_DATA_INIT

}

void CToolDlg::DoDataExchange(CDataExchange* pDX)

{ //完善对话框按钮状态初始化

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CToolDlg)

DDX_Check(pDX,IDC_MAINTOOL,m_bMainTool);

DDX_Check(pDX,IDC_TESTTOOL,m_bTestTool);

DDX_Check(pDX,IDC_DOCKTOOL,m_bDockTool);

DDX_Check(pDX,IDC_DOCKNEXT,m_bDockNext);

DDX_Radio(pDX,IDC_SHOW,m_nToolTips);

DDX_Radio(pDX,IDC_TWO,m_nColumns);

//}}AFX_DATA_MAP

}

⑤在主程序实现文件MainFrm.cpp 中增加ToolDlg.h 包含文件,并完善相应菜单选项功能。如笔者程序中为完善“测试”选项的功能,其控制代码如下:

void CMainFrame::OnButtonTest()

{ //完善相应菜单选项

CToolDlg ToolDlg;//调出对话框

UINT nColumns = m_wndDockToolBar.GetColumns();

nColumns -= 2;//取得按钮排列数

//取得工具栏的可视风格

ToolDlg.m_bMainTool=((m_wndMainToolBar.

GetStyle()&WS_VISIBLE)!=0);

ToolDlg.m_bTestTool=((m_wndTestToolBar.

GetStyle()&WS_VISIBLE)!=0);

ToolDlg.m_bDockTool=((m_wndDockToolBar.

GetStyle()&WS_VISIBLE)!=0);

ToolDlg.m_bDockNext=((m_wndDockNextBar.

GetStyle()&WS_VISIBLE)!=0);

ToolDlg.m_nColumns=nColumns;

ToolDlg.m_nToolTips=(m_bToolTips)?0:1;

if (IDOK==ToolDlg.DoModal())

{ //控制工具条的显示与消隐

ShowControlBar(&m_wndMainToolBar,

ToolDlg.m_bMainTool,FALSE);

......//其它工具条控制代码,基本相同

m_bToolTips=(ToolDlg.m_nToolTips==0);

if (m_bToolTips){//控制动态提示功能

m_wndMainToolBar.SetBarStyle(m_wndMainToolBar.

GetBarStyle()|CBRS_TOOLTIPS|CBRS_FLYBY);

......//其它工具条控制代码,基本相同

} else {

m_wndMainToolBar.SetBarStyle(m_wndMainToolBar.

GetBarStyle()&(CBRS_TOOLTIPS|CBRS_FLYBY));

......//其它工具条控制代码,基本相同

}

nColumns=ToolDlg.m_nColumns+2;//控制工具条按钮列数

m_wndDockToolBar.SetColumns(nColumns);

m_wndDockNextBar.SetColumns(nColumns);

m_wndMainToolBar.Invalidate();//控制各工具条显示更新

......//其它工具条控制代码,基本相同

}

}

10、工具条的属性控制

WIN95/98中的鼠标右键弹出属性表功能具有很强的功能特色,很多应用程序中都对各种功能进行了属 性控制设置,给应用程序中的工具条增加属性控制功能更具有现实意义。在工具条的属性表中可以设置工具栏的消隐与显示、工具条按钮的排序和其它各种控制功 能,这要根据应用程序的需要来确定。这里以控制工具条的显示与消隐为例,详细阐述其实现的具体步骤:

(1)首先打开资源列表中的菜单资源,利用"Insert->Resource-> Menu"增加菜单资源IDR_TOOLBAR,在菜单中建立四个工具条菜单选项,并为各菜单选项设置ID标识和菜单项名,注意将各菜单选项标识符设置为 与工具条名称完全相同的控制符,如本例程序中主控工具条ID为IDR_wndMainToolBar,那么控制主控工具条的菜单选项ID标识符也必须是 IDR_wndMainToolBar,这样设置后可以使用MFC 类库中的提供的功能来控制工具条的显示与消隐、菜单项检查状态与非检查状态。

(2)然后利用类向导ClassWizard 为应用程序主框架窗口增加解释消息PreTranslateMessage处理函数;

(3)在应用程序实现文件MainFrm.cpp中完善解释消息函数:

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)

{ if (pMsg->message==WM_RBUTTONDOWN){

CWnd* pWnd=CWnd::FromHandlePermanent(pMsg->hwnd);

CControlBar* pBar=DYNAMIC_DOWNCAST(CControlBar,pWnd);//取得控制条句柄

if (pBar!=NULL){

CMenu Menu;//建立弹出式菜单

CPoint pt; //鼠标指针位置

pt.x = LOWORD(pMsg->lParam);

pt.y = HIWORD(pMsg->lParam);

pBar->ClientToScreen(&pt);//转换成屏幕坐标

if (Menu.LoadMenu(IDR_TOOLBAR)){//调入菜单资源

CMenu* pSubMenu = Menu.GetSubMenu(0);//取得选项

if (pSubMenu!=NULL){//跟踪菜单以取得输入

pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|

TPM_RIGHTBUTTON,pt.x,pt.y,this);

}

}

}

}

return CFrameWnd::PreTranslateMessage(pMsg);

}

(4)在消息映射函数后增加

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

//{{AFX_MSG_MAP(CMainFrame)

......//其它消息映射函数

//}}AFX_MSG_MAP

// 增加扩展命令消息和更新消息映射,利用现成MFC函数更新菜单

ON_UPDATE_COMMAND_UI(IDR_MAINTOOLBAR,OnUpdateControlBarMenu)

ON_COMMAND_EX(IDR_MAINTOOLBAR,OnBarCheck)

......//其它工具条映射函数基本相同,只有标识不同

END_MESSAGE_MAP()

(5)重要的程序设计技巧步骤

上述步骤1和步骤4是实现工具条属性菜单有效控制的最关键步骤,如果不在步骤1中将菜单ID设置成工具 条的ID,或者不在步骤4中设置相应的消息映射,都不可能实现工具条菜单与工具条状态的有效控制。工具条菜单中的其它属性功能可模仿实现。笔者实现的工具 条控制演练示例程序结果如下:

工具条演练示例结果

VC MFC工具栏(CToolBar)控件 一个不具有这个状态的按钮是不接收用户输入的,并且变灰。上面的TBBUTON结构里有一个成员idCommand,这个成员跟菜单项的ID值一样,用于标识工具栏按钮项,也就是说idCommand是工具栏项ID号,就是最前面设置工具栏资源时,选择一个按钮,然后按回车,弹出一个对话框,里面有一个ID项,跟这个是一样的。这个函数的第二个参数dwStyle是按钮控件的样式,也就是在可视化添加按钮控件时,右击按钮控件,选择属性,之后会弹出一个对话框,这个对话框有一个样式的选项,该参数即对应这个样式。//激活信息提示功能。 阅读详情

相关推荐

对话栏(CDialogBar)

对话栏(CDialogBar) 对话栏是工具栏和非模态对话框相结合的产物。MFC为对话栏提供了CDialogBar类,该类派生于CControlBar类。对话栏与对话框类似,包含标准的Windows控件,并且可以通过创建对话模板来表示对话栏。 一:对话栏主要方法 二:对话栏的应用实例 (l)创建一个基于单文档的应用程序。 打开VS2019——>新建——>项目 把项目设置为使用【多字符集】 (2):添加资源——>新建一个IDD_DIALOGBAR (3):在DialogBar中添加控

txyhr63的博客 1126

工具栏停靠问题//EnableDocking(CBRS_ALIGN_ANY);不是很多余吗?

工具栏停靠问题//EnableDocking(CBRS_ALIGN_ANY);不是很多余吗? m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); [最优解释] m_wndToolBar.EnableDocking(CBRS_ALI

qq_32203693的博客 3437

CDialogBar类应用

帮助大家熟悉MFC类的使用!

工具栏设计

工具栏设计<br />计算机编程2010-02-01 11:25:06阅读156评论0字号:大中小<br />http://book.youkuaiyun.com/bookfiles/521/10052117702.shtml<br />6.2  工具栏设计<br />工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标来表示。当单击某个按钮时,会产生一个相应的消息,对这个消息的处理就是按钮的功能实现。将菜单中常用的功能放置在工具栏中,这样可以方便用户操作,省去了在级联菜单中一层层查找菜单项的麻烦。<br />6

scollins的专栏 3939

Xilnx大学计划/XUP ZYNQ ZU开发板

TUL PYNQ™-ZU板,基于Xilinx Zynq UltraScale+ MPSoC,是为Xilinx大学项目设计的,以支持Xilinx PYNQ (Python Productivi-ty for Zynq)开源框架和嵌入式系统开发。

weixin_57025922的博客 946

电机驱动技术中关于磁阻转矩生成的理解

正交在物理学和数学中指的是两个方向或两个向量之间的夹角为90°(直角)。在图中,当气隙磁场的轴线与转子轴线的夹角为90°时,我们称它们为正交。转子磁极的方向。通常由转子的磁极中心指向另一极的连线表示。转子轴线用图示中的d 轴表示。通过对定子、转子、气隙磁场、磁力线的理解,我们可以清晰地分析不同角度下电磁转矩的方向。这种分析不仅有助于电机的理论学习,还能为实际设计提供重要参考。掌握这些基础知识后,可以更好地理解电机工作原理及优化其性能。

weixin_48327795的博客 2074

CToolBar使用

CToolBar控件是MFC提供的一个类,实现了一般窗口应用中的工具条。通常用于SDI或者MDI程序中,对话框程序中通常不使用工具条。一、代码中的工具条工具条是一个CToolBar类对象,通常作为成员对象嵌入程序的CMainFrame类中,也就是说嵌入主框架窗口中。因此,MFC生

xinjiXJZ的专栏 2387

复信号的调制与解调(基带)

Digital modulation methods can be considered as digital-to-analog conversion and the corresponding demodulation or detection as analog-to-digital conversion. 数字调制可以看成是数字到模拟的变换,同样,数字解调也可以看作是模拟向数字的转换。

JonTargaryen的博客 1万+

CToolBar的使用介绍

转载地址:http://blog.youkuaiyun.com/daijunhua/article/details/2393611                                                                     CToolBar控件是MFC提供的一个类,实现了一般窗口应用中的工具条。通常用于SDI或者MDI程序中,对话框程序中通常不使用

yyxaf的专栏 1090

如何在 UniApp 中接入讯飞语音听写功能 文末附vue3+vue2完整代码

在开发过程中,我遇到了讯飞接口返回空数据的问题。通过仔细检查传送的每一帧数据,我发现问题出在第一帧的配置信息以及 Base64 数据的切片。确保每一帧的数据正确且符合接口要求,问题就能够得到解决。希望这个过程能帮助你在项目中顺利对接讯飞语音识别。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 995

具身智能:原理、算法与系统 第18章 模仿学习与人类示范

与基于试错机制的强化学习不同,模仿学习假设存在能够提供高质量轨迹示范的专家策略,学习者的目标是在不直接访问专家内部决策机制的情况下,复现或泛化专家的行为模式。此外,选项 GAIL(Option-GAIL)将分层强化学习与对抗模仿结合,学习选项(Options)级别的策略,能够捕捉专家示范中的多模态行为与高层意图。X-Sim 框架提出从真实到模拟再到真实的迁移路径:首先从人类视频中重建物理仿真环境,在仿真中训练状态级策略,随后通过策略蒸馏获得基于视觉的策略,最后通过在线领域自适应对齐真实与仿真观测。

VectorShift的博客 125

CToolBar的使用总结(转)

(一)工具条控制的主要功能 所谓工具条就是具有位图和分隔符组成的一组命令按钮,位图按钮部分可以是下推按钮、检查盒按钮、无线按 钮等。工具条对象类派生于主窗口架框类CframeWnd或CMDIFrameWnd,其类控制CToolBar::GetToolBarCtrl是 MFC类库中封装的一个成员函数,允许使用类库中提供的一般控制和附加功能,CtoolBar类控制成员控制提供了Windows一般控

code09的专栏 1万+

【论文复现】——基于改进FPFH特征提取的点云模板匹配方法

基于改进FPFH特征提取的点云模板匹配方法 [J]. 应用激光, 2024, 44 (04): 196-204.

点云侠的博客 611

CToolBarCtrl和CToolBar区别

CStatusBar 和CStatusBarCtrl以及CToolBar和CToolBarCtrl均是继承自CWnd类。 CToolBar和CStatusBar都是在control bars 类中的封装,而CStatusBarCtrl和CToolBarCtrl都是在contro

fantasy4086的专栏 1136

OpenClaw实战:拒绝复制粘贴,用 xlsx 技能打通“带公式模板”的月报自动化

本文详解了如何利用 OpenClaw 框架搭载的 xlsx skill,解决 AI 自动化处理“带复杂公式与格式”Excel 月报时极易翻车的业务痛点。针对传统大模型粗暴写入导致模板报废的问题,OpenClaw 创新采用“双核微创”工作流:首先利用 pandas 高效清洗并聚合海量原始明细数据,随后切换至 openpyxl 将计算结果精准注入目标模板,完美保留原有的底色、边框与跨表动态公式。

我有一个梦想 150

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

宁波阿成的博客 900

MFC工具栏CToolBar从专家到小白

图像列表会根据初始化时指定的图标尺寸(nBtnWidth x cSize.cy),​从左到右依次。这些样式来自Windows SDK,定义了窗口的行为和外观。:设置工具栏用于显示处于默认状态的按钮的图像列表。:设置工具栏控件将用于显示禁用的按钮的图像列表。是MFC预定义的一个ID,用于默认的工具栏。1.在资源文件中增加Toolbar资源文件。:设置工具栏控件将用于显示热按钮的图像列表。重新定位和调整工具栏和其他控件栏的大小。2.在.rc文件中定义资源路径映射。:工具栏控件的样式。:工具栏边框的尺寸。

Rainbow 633

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

通过载入bitmap来设置ctoolbar

//工具栏TBSTYLE_FLAT if (!m_wndToolBar.CreateEx(this, TBSTYLE_CUSTOMERASE, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))//载入工具栏IDR_MAINFRAME {

yyyzlf的专栏 1292

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

CDialog上使用CToolBar+CReBar

最经在做一些用户界面的东西,对话框上有很多按钮和组合框,全部加起来差不多有20多个吧,界面非常凌乱,最后决定用CToolBar + CReBar来重新设计界面,为什么选用这个呢?一是因为看到IE用的也是这个,二是用CReBar+透明的CToolBar可以实现漂亮的换肤效果。   1、在对话框类中添加成员变量: CStatic m_static; CButton m_btn;  CComb

dc11223344的专栏 3716

通过CToolBar类创建工具栏

原本不是专门做VC开发的,因为有VC开发经验,时不时的也被抓个壮丁啥的。 有些东西由于不常用,偶尔有想不起来的时候。于是弄个博客把常用的知识点整理一下。也免得每次都都上网查。 内容有很多都是借鉴过来的,不一一列举了。程序是自己调通的。只为方便自己,无他。

潜龙渊 861

VC/MFC 工具栏设计-CToolBar使用

工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标来表示。当单击某个按钮时,会产生一个相应的消息,对这个消息的处理就是按钮的功能实现。将菜单中常用的功能放置在工具栏中,这样可以方便用户操作,省去了在级联菜单中一层层查找菜单项的麻烦。 6.2.1 工具栏类CToolBar 在MFC类库中,CToolBar类封装了工具栏的基本功能,CToolBar类的主要方法如

qq_28337005的博客 7121
上一篇: CToolBar的使用总结
下一篇: AssertValid函数学习
mxling
博客等级 码龄19年 37粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值