{A}{S0}Visual Studio 2005的更新
请注意,我添加了一个Visual Studio 2005的用户可下载的示范项目。一切都在原来的文章,以及适用于Visual Studio 2005中使用的,除了有关使用ClassWizard创建类/对象的协会的位。我假设,如果你是使用Visual Studio 2005,你已经知道如何定义协会,添加事件处理程序等,因此,恰恰忽视了类向导意见。重要的是,如果你派生自己的类,你必须做出一定的对话栏的资源ID匹配类的头文件中定义的资源ID。如果您使用的派生类,我已经提供了,那么你需要简单的名称在资源编辑器IDD_DIALOGBAR的对话栏的资源,你将被罚款。看演示,如果你仍然有难以落实,我行。简介
我看到很多帖子最近在论坛和文章评论,读者想知道如何使用一个对话栏绘制业主或自定义控件。尽管这些信息是来自微软的各种物品,我决定发表这篇文章的教程,把一篇文章的所有信息....当然,提供工作的例子来看看。
为了实现这一目标,你必须从CDialogBar派生的类的基础上的对话栏。由于应用程序向导不支持此操作,你必须从CDialog派生类,然后手动将其转换为一个CDialogBar类。由于微软的文章,让您一步一步的指示,我不会重复他们的工作。我就点你该文章:
。
还有一个姊妹篇:
。
在这个例子中派生类创建了下面这篇文章的指示,主要。使用示例类
要使用在您的应用程序,例如类,只需按照下列步骤操作。我假设你正在使用Visual Studio,在我的情况,6。
首先,从Visual Studio主菜单,单击"插入/资源,然后展开对话框。单击IDD_DIALOGBAR,然后单击新建。您现在有一个新的对话栏资源添加到项目中。默认情况下,这一资源的ID是IDD_DIALOGBAR。离开,因为它是,如果你改变的ID,那么你就必须改变在派生类的头文件的ID以及。现在,添加到您的项目从派生类的示例项目文件夹的MyDlgBar.h和MyDlgBar.cpp文件。
在这一点上,你将要链接到您的对话栏派生类。进入到项目文件夹,*. clw文件删除(或重命名)。然后选择你在资源编辑器,然后按CTRL_W的对话栏。 ClassWizard将提示重建类向导数据库。确保MyDlgBar.h和MyDlgBar.cpp文件列表中,让它重建。然后它会提示您添加一个新的类,或选择一个对话栏资源现有类。选择选择现有的类,然后选择CMyDlgBar类。单击"确定"。现在,在您为MainFrm.h文件的顶部,只是上面的类声明中,添加下面的行: . . . . . . . . . . . .
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "MyDlgBar.h" <--- ADD THIS LINE
class CMainFrame : public CFrameWnd
{
. . . . . . . . . . . . . . .
然后,您为MainFrm.h文件的类声明内,建立一个这样的对话栏的实例:{C}
最后,你MainFrm.cpp文件的OnCreate()函数,添加以下代码: if (!m_myDlgBar.Create(this, IDD_DIALOGBAR,
CBRS_TOP | CBRS_GRIPPER |CBRS_TOOLTIPS |
CBRS_FLYBY | CBRS_HIDE_INPLACE,
IDD_VIEW_DIALOGBAR))
{
TRACE0("Failed to create dialog bar m_wndDlgBar\n");
return -1; // fail to create
}
m_myDlgBar.EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_myDlgBar);
您可以修改此,如果你喜欢。这将创建一个标准的可停靠对话框栏,夹具,所以它可以脱开或移动。默认情况下,它是创建停靠在应用程序的顶部。注意在创建函数IDD_VIEW_DIALOGBAR。这是使用,如果你想在"视图"菜单上添加一个菜单选项来切换隐藏/显示对话栏,工具栏和状态栏通常做。添加这个功能是很容易的。只要在你的资源编辑器的查看菜单上创建一个新的菜单项。给它一个IDD_VIEW_DIALOGBAR编号和任何你想的标题,如放大器;对话酒吧。 MainFrm.cpp文件AFX_MESSAGE_MAP节这样,然后添加以下两行代码:BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
// AND THE LINE BELOW
ON_COMMAND_EX(IDD_VIEW_DIALOGBAR, OnBarCheck)
// AND THE LINE BELOW
ON_UPDATE_COMMAND_UI(IDD_VIEW_DIALOGBAR, OnUpdateControlBarMenu)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
现在你可以编译和运行。您将有一个对话栏,除非你对此一无所知。因此,让我们添加一个所有者绘制的CBitmapButton的乐趣。添加一个所有者绘制的CBitmapButton的
只需添加一个按钮,正常的对话栏。在"属性",检查所有者绘制的标题。给它一个编号IDC_BUTTON_BITMAP和一个按钮的标题。这是这里的重要组成部分,因为AUTOLOAD()函数读取的标题,以确定哪些位图加载。现在,创建了4位图和添加/导入到您的项目之一,为每个状态:按钮,按钮式,按钮的焦点和按钮禁用。唯一的按钮和按钮式,是必需的;,其他两个是可选的。一旦你添加/导入其中,以下改变自己的ID(注意:包括引号):"BUTTONUquot;,"BUTTONDquot;,"BUTTONFquot;和"BUTTONXquot;
现在在ClassView选项卡,右键点击CMyDlgBar,并选择"添加成员变量。 CBitmapButton的类型变量类型和变量名m_bmButton;使其保护。在MyDlgBar.cpp文件的Create()函数,调用基类后,添加以下代码: if(bReturn)
m_bmButton.AutoLoad(IDC_BUTTON_BITMAP, this);
同样,如果你给你一个不同的ID按钮,您将需要更改ID。这是... ...现在你有一个所有者绘制的CBitmapButton的。唯一剩下的就是为按钮添加消息处理程序。添加消息处理程序
的消息就像任何对话栏,必须处理的大型机,文档或视图类。在视图类中,我们会处理这一个。您必须手动添加您的消息处理程序。在你的视图类的头文件,函数声明中添加消息映射部分,是这样的:// Generated message map functions
protected:
//{{AFX_MSG(CDerivedDBView)
afx_msg void OnButtonBitmap(); <---- ADD THIS LINE
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
,然后在你的View类的*. cpp文件的消息映射,编辑代码如下:
现在你添加功能的实现您的视图类的*. cpp文件的底部:void CDerivedDBView::OnButtonBitmap()
{
CString msg = "You Clicked a CBitmapButton on a Dialog Bar \n";
msg += "in a CDialogBar derived class! ";
AfxMessageBox(msg);
}
最后一件事:在你的View类的*. cpp文件顶部,添加一行:#include "MyDlgBar.h"
这是所有有给它。编译,运行和瞧!,您必须在您的对话栏工作CBitmapButton的。这也将与任何自定义的控制。如果您想,您可以添加一个ActiveX控件。您添加任何控制,需要初始化,子类,所有者绘制或什么,只是在MyDlgBar.cpp的Create()重载函数初始化后调用基类。例如:在子类的按钮控制
演示项目包括在对话栏子类的按钮控制。 派生你的类的说明。子类在对话栏的按钮,继承现有项目中使用他的指示。在示例项目中MyDlgBar.h和MyDlgBar.cpp的文件,看看这是如何实现。要使用示例类文件,只需添加NewButton.h和NewButton.cpp到您的项目。
现在拖到对话栏按钮,并给它一个IDC_DBSUB_BUTTON编号。然后,只需添加一个NewButton.h在MyDlgBar.h文件中包括添加成员变量的类型CNewButton(即CNewButton m_subButton)。然后,在Create()函数MyDlgBar.cpp(高于或低于您CBitmapButton的初始化代码),添加一行:m_subButton.SubclassDlgItem(IDC_DBSUB_BUTTON, this);
既然你有一个以上的指令,可以肯定的周围放置您的指示下,if()语句的括号。还要注意的是,我们没有指定的按钮,在资源编辑器的所有者绘制。这是因为我们成立了我们的派生类(如每克里斯的指示),以强制所有子类的项目业主绘制。就是这样。用你的想象力,你可以与任何一个对话栏的控制类似的自定义。历史04年12月30日 - 新增子类化按钮控制。01/07/05 - 固定ZIP存档的兼容性问题。06年12月7日 - DerivedDlgBar_demo.zip是一个更新的演示项目,修复与类向导添加子类控制变量DDX数据交换方法的问题。 DDX的原因在某些情况下的一个子类调用冗余和调试汇编ASSERTS。如果使用类向导来创建你的子类的控制变量,并获得WinCore.cpp断言,您将需要手动删除的DDX数据地图父*. cpp文件中的条目。在本演示中,CBitmapButton的AUTOLOAD()方法中出现的问题。07年11月7日 - 上传Visual Studio 2005的演示项目