我是根据VISUAL C++从入门到精通这本书上步骤,建立了一个工程:
1. 打开Visual C++(如果还没有打开的话)。
2. 使用File | New 命令打开New 对话框,然后选择Project 选项卡。本例中,我们将在工程类型列表中选择MFC AppWizard(EXE)工程类型。
3. 在Project Name 域中键入应用程序的名称。本样本程序使用的名称为Dialog,但你也可以使用任何自己喜欢的名称。必要时修改Location 域的值(单击Location 域旁边的按钮进行选择)。
4. 单击OK 按钮,你会看到如下图所示的MFC AppWizard - Step 1对话框。
5. 选择Dialog Based 选项按钮,然后单击Next,系统显示如下图所示的MFCAppWizard - Step 2 of 4对话框。
6. 在Please Enter a Title for Your Dialog 域中键入Sample DialogApplication。注意,在这个对话框中可以给应用程序增加一些其它特性,比如上下文相关帮助等。Automation 复选框允许把OLE 自动化功能添加到应用程序中。你也可以在这个对话框中对应用程序增加Windows Sockets 支持——该支持允许应用程序通过TCP/IP 网络进行通信。7. 单击Next,然后再单击Next。我们不需要改变这两个对话框中的设置,但应该知道它们的作用。前一个对话框让你选择是否要在代码中添加注释。你还可以选择MFC是静态还是动态链接到应用程序中。
8. 单击Finish。Visual C++显示如下图所示的New Project Information 对话框。这是你确保各种设置都正确无误的最后一次机会。不正确的设置选择将延长工程的开发时间而不是缩短开发时间。
9. 单击OK。MFC AppWizard 将生成应用程序的框架。
现在我们已经得到了一个可以使用的基本程序框架,到了实际开始编写示例程序的时候了。由于这个程序要使用Microsoft Calendar 控件,所以我们要做的第一件事就是安装所需的ActiveX 控件。使用Project | Add to Project | Components and Controls 命令显示如下图所示的Components and Controls Gallery 对话框。双击Registered ActiveX Controls 文件夹,你就会看到机器中已经注册的一系列控件。找到Calendar Control 8.0(我的机器是日历控件10) 列表项(这是本版Visual C++携带的控件之一),然后单击Insert。Visual C++将显示一个对话框询问是否真要把这个控件插入到工程中。单击OK。Visual C++将添加某些包装类到应用程序中,以便为其提供该ActiveX 控件。Visual C++在如下图所示的Confirm Classes 对话框中显示这些类的类名。单击OK 接受缺省的ActiveX 控件类设置。现在我们有了一个可以使用的新控件,它被添加到了工具箱中。单击Close 按钮关闭Components and Controls
Gallery对话框。
现在到了设计对话框的时候了。图2.1 显示了设计好的对话框。该对话框的当前大小为300×200,我把Calendar 控件的大小调整为230×186,这样该控件上的数字就看得清楚些了。请注意,虽然该应用程序现在并没有运行,但Calendar控件依然立即显示当前日期,这是由于在把ActiveX 控件放置到对话框上时,该控件自动激活了自身。如果在你把某个控件放置到对话框上时并没有发生其它反应,或许该控件没有正确地安装。显然,需要检查控件的文档以确保控件按所期待的方式工作。如果现在编译和运行这个应用程序,你会发现它只是个半成品.(我这时进行编译,没问题,只是点确定后就结束了)日历会让你选择新的日期,单击OK 按钮后对话框也会消失,但也只是如此,该程序现在还没有更多的其它功能。图2.1 加入控件后,基于对话框的示例程序开始成型了在给Calendar 控件添加代码之前,我们还要为它创建一个成员变量。创建成员变量是件简单的事,按住CTRL 键双击Calendar 控件,系统显示如下图所示的Add Member Variable 对话框。
由于该控件是应用程序中使用的第一个Calendar 控件,因此在m_(不要删除m_)后键入Calendar1,单击OK创建该变量。(添加这个变量后,再进行编译就出错,提示:\示例源程序\visual c++从入门到精通\diag\calendar.h(53) : error C2556: 'class COleFont __thiscall CCalendar::Get(void)' : overloaded function differs only by return type from 'unsigned long __thiscall CCalendar::Get(void)'
e:\示例源程序\visual c++从入门到精通\diag\calendar.h(49) : see declaration of 'Get'再比较,与前一次多了一个calendar.h文件).下一步要完成的任务是检测用户是否改变了该控件。右击Calendar 控件,你会看到一个上下文菜单,从中选择Events,系统显示如下图所示的New Windows Message and Event Handlers 对话框。
该对话框包含了控件可以监视的所有事件的完整列表。程序员在设计该控件时设置了这些事件。在本例的情况下,我们要监视DblClick 事件。加亮DblClick事件列表项,然后单击Add and Edit 按钮,Visual C++显示Add Member Function对话框。单击OK 接受缺省的函数名,你会看到一个空的函数体。现在我们要完成的任务就是加些代码让函数正常工作。
1. 打开Visual C++(如果还没有打开的话)。
2. 使用File | New 命令打开New 对话框,然后选择Project 选项卡。本例中,我们将在工程类型列表中选择MFC AppWizard(EXE)工程类型。
3. 在Project Name 域中键入应用程序的名称。本样本程序使用的名称为Dialog,但你也可以使用任何自己喜欢的名称。必要时修改Location 域的值(单击Location 域旁边的按钮进行选择)。
4. 单击OK 按钮,你会看到如下图所示的MFC AppWizard - Step 1对话框。
5. 选择Dialog Based 选项按钮,然后单击Next,系统显示如下图所示的MFCAppWizard - Step 2 of 4对话框。
6. 在Please Enter a Title for Your Dialog 域中键入Sample DialogApplication。注意,在这个对话框中可以给应用程序增加一些其它特性,比如上下文相关帮助等。Automation 复选框允许把OLE 自动化功能添加到应用程序中。你也可以在这个对话框中对应用程序增加Windows Sockets 支持——该支持允许应用程序通过TCP/IP 网络进行通信。7. 单击Next,然后再单击Next。我们不需要改变这两个对话框中的设置,但应该知道它们的作用。前一个对话框让你选择是否要在代码中添加注释。你还可以选择MFC是静态还是动态链接到应用程序中。
8. 单击Finish。Visual C++显示如下图所示的New Project Information 对话框。这是你确保各种设置都正确无误的最后一次机会。不正确的设置选择将延长工程的开发时间而不是缩短开发时间。
9. 单击OK。MFC AppWizard 将生成应用程序的框架。
现在我们已经得到了一个可以使用的基本程序框架,到了实际开始编写示例程序的时候了。由于这个程序要使用Microsoft Calendar 控件,所以我们要做的第一件事就是安装所需的ActiveX 控件。使用Project | Add to Project | Components and Controls 命令显示如下图所示的Components and Controls Gallery 对话框。双击Registered ActiveX Controls 文件夹,你就会看到机器中已经注册的一系列控件。找到Calendar Control 8.0(我的机器是日历控件10) 列表项(这是本版Visual C++携带的控件之一),然后单击Insert。Visual C++将显示一个对话框询问是否真要把这个控件插入到工程中。单击OK。Visual C++将添加某些包装类到应用程序中,以便为其提供该ActiveX 控件。Visual C++在如下图所示的Confirm Classes 对话框中显示这些类的类名。单击OK 接受缺省的ActiveX 控件类设置。现在我们有了一个可以使用的新控件,它被添加到了工具箱中。单击Close 按钮关闭Components and Controls
Gallery对话框。
现在到了设计对话框的时候了。图2.1 显示了设计好的对话框。该对话框的当前大小为300×200,我把Calendar 控件的大小调整为230×186,这样该控件上的数字就看得清楚些了。请注意,虽然该应用程序现在并没有运行,但Calendar控件依然立即显示当前日期,这是由于在把ActiveX 控件放置到对话框上时,该控件自动激活了自身。如果在你把某个控件放置到对话框上时并没有发生其它反应,或许该控件没有正确地安装。显然,需要检查控件的文档以确保控件按所期待的方式工作。如果现在编译和运行这个应用程序,你会发现它只是个半成品.(我这时进行编译,没问题,只是点确定后就结束了)日历会让你选择新的日期,单击OK 按钮后对话框也会消失,但也只是如此,该程序现在还没有更多的其它功能。图2.1 加入控件后,基于对话框的示例程序开始成型了在给Calendar 控件添加代码之前,我们还要为它创建一个成员变量。创建成员变量是件简单的事,按住CTRL 键双击Calendar 控件,系统显示如下图所示的Add Member Variable 对话框。
由于该控件是应用程序中使用的第一个Calendar 控件,因此在m_(不要删除m_)后键入Calendar1,单击OK创建该变量。(添加这个变量后,再进行编译就出错,提示:\示例源程序\visual c++从入门到精通\diag\calendar.h(53) : error C2556: 'class COleFont __thiscall CCalendar::Get(void)' : overloaded function differs only by return type from 'unsigned long __thiscall CCalendar::Get(void)'
e:\示例源程序\visual c++从入门到精通\diag\calendar.h(49) : see declaration of 'Get'再比较,与前一次多了一个calendar.h文件).下一步要完成的任务是检测用户是否改变了该控件。右击Calendar 控件,你会看到一个上下文菜单,从中选择Events,系统显示如下图所示的New Windows Message and Event Handlers 对话框。
该对话框包含了控件可以监视的所有事件的完整列表。程序员在设计该控件时设置了这些事件。在本例的情况下,我们要监视DblClick 事件。加亮DblClick事件列表项,然后单击Add and Edit 按钮,Visual C++显示Add Member Function对话框。单击OK 接受缺省的函数名,你会看到一个空的函数体。现在我们要完成的任务就是加些代码让函数正常工作。
以下是calendar.h的内容
#if !defined(AFX_CALENDAR_H__0D6960F1_2AE1_40C9_A46C_A99830F91BA7__INCLUDED_)
#define AFX_CALENDAR_H__0D6960F1_2AE1_40C9_A46C_A99830F91BA7__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++// NOTE: Do not modify the contents of this file. If this class is regenerated by
// Microsoft Visual C++, your modifications will be overwritten.
// Dispatch interfaces referenced by this interface
class COleFont;/////////////////////////////////////////////////////////////////////////////
// CCalendar wrapper classclass CCalendar : public CWnd
{
protected:
DECLARE_DYNCREATE(CCalendar)
public:
CLSID const& GetClsid()
{
static CLSID const clsid
= { 0x8e27c92b, 0x1264, 0x101c, { 0x8a, 0x2f, 0x4, 0x2, 0x24, 0x0, 0x9c, 0x2 } };
return clsid;
}
virtual BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd, UINT nID,
CCreateContext* pContext = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); } BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
CFile* pPersist = NULL, BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
pPersist, bStorage, bstrLicKey); }// Attributes
public:// Operations
public:
unsigned long Get();
void Set(unsigned long newValue);
short Get_1(); // Get日
void Set_2(short nNewValue); // Set日
COleFont Get();错误指在这里
void Set(LPDISPATCH newValue);
long Get();
void Set(long nNewValue); short Get_3(); // Get月
void Set_4(short nNewValue); // Set月
BOOL Get();
void Set(BOOL bNewValue);
VARIANT Get_5(); // Get值
void Set_6(const VARIANT& newValue); // Set值
short Get_7(); // Get年
void Set_8(short nNewValue); // Set年
void NextDay();
void NextMonth();
void NextWeek();
void NextYear();
void PreviousDay();
void PreviousMonth();
void PreviousWeek();
void PreviousYear();
void Refresh();
void Today();
void AboutBox();
};//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_CALENDAR_H__0D6960F1_2AE1_40C9_A46C_A99830F91BA7__INCLUDED_)