MFC问题
来源:百度文库 编辑:神马文学网 时间:2024/04/29 22:47:18
为对话框中加入工具栏
紫瑗
工具栏(ToolBar)是一种非常方便的控件,能大大增加了用户操作的效率。但是基于对话框的程序,却不能像使用编辑框(Edit Box)和列表框(List Box)一样,方便地增加工具栏控件。本文介绍在对话框中加入工具栏的方法。
技术要点分析
所有的Windows控件(包括工具栏,编辑框等)都派生自CWnd类,也就是说,它们其实都是一种窗口。这就意味着,我们就可以用窗口类的Create()函数却把它们“创建”并显示到另一个窗口(例如对话框)上。把工具栏加入到对话框中也是使用了这样的一种方法。
通常,我们使用CToolBarCtrl类(派生自CWnd类)来创建并管理工具栏控件。使用这一个类创建一条工具栏的一般步骤如下:
1、派生一个CToolBarCtrl对象
2、调用CToolBarCtrl::Create函数创建工具栏对象
3、调用CToolBarCtrl::AddBitmap()和CToolBarCtrl::AddString()为工具栏对象加入位图和提示信息。
4、派生一个TBUTTON数组对象进行工具栏中各按钮的具体设置
5、修改主窗口的OnNotify()函数,以显示工具栏上的提示信息
以上步骤在下面的范例代码中有具体体现
范例程序的建立与主要代码分析
利用Visulal C++ 的向导生成一个基于对话框的程序,命名为ToolBarInDial。修改主对话框样式如右图。绘画一条工具栏的位图;建立一条菜单,设置几个子菜单项;建立一组工具栏的提示信息串(String Table),一旦鼠标在工具栏某项上停留,就显示提示信息。
下面给出程序中的主要代码:
在主对话框CToolBarInDialDlg类的类定义中有如下的变量说明:
CToolBarCtrl ToolBar;
int ButtonCount;
int ButtonBitmap;
BOOL DoFlag;
TBUTTON m_Button[5]; //设置工具栏上具体信息的变量数组
//主对话框的初始化函数
BOOL CToolBarInDialDlg::OnInitDialog()
{
RECT rect; //设置工具栏的显示范围
rect.top=0; rect.left=0; rect.right=48; rect.bottom=16;
ToolBar.Create(WS_CHILD|WS_VISIBLE|CCS_TOP|TBSTYLE_TOOLTIPS|CCS_ADJUSTABLE,rect,this,0); //建立工具栏并设置工具栏的样式
ButtonBitmap=ToolBar.AddBitmap(5,IDB_PLAY); //加入工具栏的位图
ButtonString=ToolBar.AddString(IDS_FIRST);//加入工具栏的提示信息
//以下相似的代码开始设置各具体的按钮
m_Buttons[ButtonCount].iBitmap=ButtonBitmap+ButtonCount; //ButtonCount初为0
m_Buttons[ButtonCount].idCommand=ID_PLAY; //工具栏与菜单上某子项对应
m_Buttons[ButtonCount].fsState=TBSTATE_ENABLED; //设置工具栏按钮为可选
m_Buttons[ButtonCount].fsStyle=TBSTYLE_BUTTON; //设置工具栏按钮为普通按钮
m_Buttons[ButtonCount].dwData=0;
m_Buttons[ButtonCount].iString=IDS_LAST;
++ButtonCount;
//类似地设置第二个按钮
m_Buttons[ButtonCount].iBitmap=ButtonBitmap+ButtonCount;
m_Buttons[ButtonCount].idCommand=ID_STOP;
m_Buttons[ButtonCount].fsState=TBSTATE_ENABLED;
m_Buttons[ButtonCount].fsStyle=TBSTYLE_BUTTON;
m_Buttons[ButtonCount].dwData=0;
m_Buttons[ButtonCount].iString=IDS_NEXT;
++ButtonCount;
……//省略设置剩下的按钮与上面类似的代码
ToolBar.AddButtons(ButtonCount,m_Buttons);//为工具栏加入按钮并显示在对话框中
return TRUE;
}
//当鼠标在工具栏上停留时,调用这个函数来显示提示信息
BOOL CToolBarInDialDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
TOOLTIPTEXT *tt;
tt=(TOOLTIPTEXT*)lParam;
CString Tip;
switch(tt->hdr.code)
{
case TTN_NEEDTEXT: //该信息表明要求显示工具栏上的提示
switch(tt->hdr.idFrom) //从tt->hdr.idFrom中取得现在指的是工具栏上那一个按钮
{
case ID_PLAY:
Tip.LoadString(IDS_FIRST); //设置对应于工具栏上ID_PLAY的按钮的提示信息
break;
case ID_STOP:
Tip.LoadString(IDS_NEXT); //IDS_FIRST,IDS_NEXT等为一系列CString串
break;
……//类似地设置剩下的按钮的提示信息
}
strcpy(tt->szText,(LPCSTR)Tip); //显示提示信息
break;
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
//该演示程序的工具栏能由用户定制,随时增加或删除工具栏中的某一项
void CToolBarInDialDlg::OnApply()
{
switch(DoFlag) //用户选择了增加或删除工具栏中的“退出”按钮
{
case TRUE: //增加工具栏上的“退出”按钮
m_Buttons[ButtonCount].iBitmap=ButtonBitmap+ButtonCount;
m_Buttons[ButtonCount].idCommand=ID_QUIT;
m_Buttons[ButtonCount].fsState=TBSTATE_ENABLED;
m_Buttons[ButtonCount].fsStyle=TBSTYLE_BUTTON;
m_Buttons[ButtonCount].dwData=0;
m_Buttons[ButtonCount].iString=IDS_FIRST;
ToolBar.InsertButton(ButtonCount,&m_Buttons[ButtonCount]); //根据m_Buttons的信息
//在工具栏的尾加上一个按钮
break;
case FALSE:
if(ToolBar.GetButtonCount()==4) //删除工具栏上某一特定位置的按钮
{
ToolBar.DeleteButton(3); //删除工具栏上某一按钮
}
break;
}
}
void CToolBarInDialDlg::OnPlay() //响应函数举例
{
……//对应菜单项的响应函数,也就是说,
//当按下工具栏上某一按钮时,等于选择了
//菜单上的某一项。
}
紫瑗
工具栏(ToolBar)是一种非常方便的控件,能大大增加了用户操作的效率。但是基于对话框的程序,却不能像使用编辑框(Edit Box)和列表框(List Box)一样,方便地增加工具栏控件。本文介绍在对话框中加入工具栏的方法。
技术要点分析
所有的Windows控件(包括工具栏,编辑框等)都派生自CWnd类,也就是说,它们其实都是一种窗口。这就意味着,我们就可以用窗口类的Create()函数却把它们“创建”并显示到另一个窗口(例如对话框)上。把工具栏加入到对话框中也是使用了这样的一种方法。
通常,我们使用CToolBarCtrl类(派生自CWnd类)来创建并管理工具栏控件。使用这一个类创建一条工具栏的一般步骤如下:
1、派生一个CToolBarCtrl对象
2、调用CToolBarCtrl::Create函数创建工具栏对象
3、调用CToolBarCtrl::AddBitmap()和CToolBarCtrl::AddString()为工具栏对象加入位图和提示信息。
4、派生一个TBUTTON数组对象进行工具栏中各按钮的具体设置
5、修改主窗口的OnNotify()函数,以显示工具栏上的提示信息
以上步骤在下面的范例代码中有具体体现
范例程序的建立与主要代码分析
利用Visulal C++ 的向导生成一个基于对话框的程序,命名为ToolBarInDial。修改主对话框样式如右图。绘画一条工具栏的位图;建立一条菜单,设置几个子菜单项;建立一组工具栏的提示信息串(String Table),一旦鼠标在工具栏某项上停留,就显示提示信息。
下面给出程序中的主要代码:
在主对话框CToolBarInDialDlg类的类定义中有如下的变量说明:
CToolBarCtrl ToolBar;
int ButtonCount;
int ButtonBitmap;
BOOL DoFlag;
TBUTTON m_Button[5]; //设置工具栏上具体信息的变量数组
//主对话框的初始化函数
BOOL CToolBarInDialDlg::OnInitDialog()
{
RECT rect; //设置工具栏的显示范围
rect.top=0; rect.left=0; rect.right=48; rect.bottom=16;
ToolBar.Create(WS_CHILD|WS_VISIBLE|CCS_TOP|TBSTYLE_TOOLTIPS|CCS_ADJUSTABLE,rect,this,0); //建立工具栏并设置工具栏的样式
ButtonBitmap=ToolBar.AddBitmap(5,IDB_PLAY); //加入工具栏的位图
ButtonString=ToolBar.AddString(IDS_FIRST);//加入工具栏的提示信息
//以下相似的代码开始设置各具体的按钮
m_Buttons[ButtonCount].iBitmap=ButtonBitmap+ButtonCount; //ButtonCount初为0
m_Buttons[ButtonCount].idCommand=ID_PLAY; //工具栏与菜单上某子项对应
m_Buttons[ButtonCount].fsState=TBSTATE_ENABLED; //设置工具栏按钮为可选
m_Buttons[ButtonCount].fsStyle=TBSTYLE_BUTTON; //设置工具栏按钮为普通按钮
m_Buttons[ButtonCount].dwData=0;
m_Buttons[ButtonCount].iString=IDS_LAST;
++ButtonCount;
//类似地设置第二个按钮
m_Buttons[ButtonCount].iBitmap=ButtonBitmap+ButtonCount;
m_Buttons[ButtonCount].idCommand=ID_STOP;
m_Buttons[ButtonCount].fsState=TBSTATE_ENABLED;
m_Buttons[ButtonCount].fsStyle=TBSTYLE_BUTTON;
m_Buttons[ButtonCount].dwData=0;
m_Buttons[ButtonCount].iString=IDS_NEXT;
++ButtonCount;
……//省略设置剩下的按钮与上面类似的代码
ToolBar.AddButtons(ButtonCount,m_Buttons);//为工具栏加入按钮并显示在对话框中
return TRUE;
}
//当鼠标在工具栏上停留时,调用这个函数来显示提示信息
BOOL CToolBarInDialDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
TOOLTIPTEXT *tt;
tt=(TOOLTIPTEXT*)lParam;
CString Tip;
switch(tt->hdr.code)
{
case TTN_NEEDTEXT: //该信息表明要求显示工具栏上的提示
switch(tt->hdr.idFrom) //从tt->hdr.idFrom中取得现在指的是工具栏上那一个按钮
{
case ID_PLAY:
Tip.LoadString(IDS_FIRST); //设置对应于工具栏上ID_PLAY的按钮的提示信息
break;
case ID_STOP:
Tip.LoadString(IDS_NEXT); //IDS_FIRST,IDS_NEXT等为一系列CString串
break;
……//类似地设置剩下的按钮的提示信息
}
strcpy(tt->szText,(LPCSTR)Tip); //显示提示信息
break;
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
//该演示程序的工具栏能由用户定制,随时增加或删除工具栏中的某一项
void CToolBarInDialDlg::OnApply()
{
switch(DoFlag) //用户选择了增加或删除工具栏中的“退出”按钮
{
case TRUE: //增加工具栏上的“退出”按钮
m_Buttons[ButtonCount].iBitmap=ButtonBitmap+ButtonCount;
m_Buttons[ButtonCount].idCommand=ID_QUIT;
m_Buttons[ButtonCount].fsState=TBSTATE_ENABLED;
m_Buttons[ButtonCount].fsStyle=TBSTYLE_BUTTON;
m_Buttons[ButtonCount].dwData=0;
m_Buttons[ButtonCount].iString=IDS_FIRST;
ToolBar.InsertButton(ButtonCount,&m_Buttons[ButtonCount]); //根据m_Buttons的信息
//在工具栏的尾加上一个按钮
break;
case FALSE:
if(ToolBar.GetButtonCount()==4) //删除工具栏上某一特定位置的按钮
{
ToolBar.DeleteButton(3); //删除工具栏上某一按钮
}
break;
}
}
void CToolBarInDialDlg::OnPlay() //响应函数举例
{
……//对应菜单项的响应函数,也就是说,
//当按下工具栏上某一按钮时,等于选择了
//菜单上的某一项。
}
MFC问题
MFC
一个MFC宏实现COM接口的问题
truetype技术及矢量字库问题,大家请进,分数不是问题,急~~~~~~~~~!!!!!!! VC/MFC / 基础类
MFC头文件
VC /MFC 源码下载
MFC DLL向导(摘)
MFC窗口销毁过程
MFC全局函数::AfxBeginThread
对比MFC,winform,wpf
MFC全局函数::AfxBeginThread
MFC ODBC 编程
功能区 - MFC
MFC文件读取1
MFC和Win32
API,SDK,MFC
MFC:Tab Control 控件
用独立线程解决弹出模态对话框后执行自定义函数问题 - VC/MFC - 提供最全面实用的J...
MFC在线英文教程DLL
使用MFC的数组类
MFC中的列表控件CListCtrl
MFC文件读取2L
MFC程序最小化到托盘
MFC下的文件类