用Visual Studio写mfc茶壶代码
时间: 2024-03-16 19:43:44 浏览: 125
visual c++ mfc编程实例
以下是一个简单的 MFC 茶壶代码,用于在 Visual Studio 中绘制一个简单的茶壶:
1. 创建一个 MFC 应用程序项目。
2. 打开 Class View 窗口,右键单击该项目,然后选择添加->类。
3. 在“添加类”对话框中,选择“MFC”类类别,然后选择“MFC ActiveX 控件”类模板。
4. 在“添加 MFC ActiveX 控件”对话框中,输入“CTeaPot”作为控件类名称,然后选择“框架支持 ActiveX 控件”复选框。
5. 单击“完成”按钮,创建一个新的 MFC ActiveX 控件类。
6. 在“CTeaPot.h”文件中添加以下代码:
```cpp
class CTeaPot : public COleControl
{
DECLARE_DYNCREATE(CTeaPot)
// Construction
public:
CTeaPot();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTeaPot)
public:
virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual void DoPropExchange(CPropExchange* pPX);
virtual void OnResetState();
//}}AFX_VIRTUAL
// Implementation
protected:
~CTeaPot();
DECLARE_OLECREATE_EX(CTeaPot) // Class factory and guid
DECLARE_OLETYPELIB(CTeaPot) // GetTypeInfo
DECLARE_PROPPAGEIDS(CTeaPot) // Property page IDs
DECLARE_OLECTLTYPE(CTeaPot) // Type name and misc status
// Message maps
//{{AFX_MSG(CTeaPot)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
// Dispatch maps
//{{AFX_DISPATCH(CTeaPot)
afx_msg float GetHeight();
afx_msg void SetHeight(float newVal);
afx_msg float GetWidth();
afx_msg void SetWidth(float newVal);
//}}AFX_DISPATCH
DECLARE_DISPATCH_MAP()
// Event maps
//{{AFX_EVENT(CTeaPot)
//}}AFX_EVENT
DECLARE_EVENT_MAP()
// Properties
public:
float m_fHeight;
float m_fWidth;
};
```
7. 在“CTeaPot.cpp”文件中添加以下代码:
```cpp
// TeaPot.cpp : Implementation of CTeaPotApp and DLL registration.
#include "stdafx.h"
#include "TeaPot.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTeaPotApp
BEGIN_MESSAGE_MAP(CTeaPotApp, CWinApp)
//{{AFX_MSG_MAP(CTeaPotApp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTeaPotApp construction
CTeaPotApp::CTeaPotApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CTeaPotApp object
CTeaPotApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CTeaPotApp initialization
BOOL CTeaPotApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
return TRUE;
}
```
8. 在“CTeaPot.cpp”文件中,添加以下代码来实现绘制茶壶的功能:
```cpp
// CTeaPot::OnDraw - Drawing function
void CTeaPot::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
// TODO: Replace the following code with your own drawing code.
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
CPen* pOldPen = pdc->SelectObject(&pen);
pdc->MoveTo(rcBounds.left, rcBounds.top);
pdc->LineTo(rcBounds.right, rcBounds.bottom);
pdc->MoveTo(rcBounds.left, rcBounds.bottom);
pdc->LineTo(rcBounds.right, rcBounds.top);
pdc->SelectObject(pOldPen);
}
// CTeaPot::PreCreateWindow - Modify parameters for CreateWindowEx
BOOL CTeaPot::PreCreateWindow(CREATESTRUCT& cs)
{
//cs.lpszClass = _T("STATIC");
cs.style |= WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
return COleControl::PreCreateWindow(cs);
}
```
9. 在“TeaPot.idl”文件中,添加以下代码:
```cpp
import "oaidl.idl";
[
uuid(69B182FE-3142-4B7C-8AF7-99FB9E77E705),
helpstring("TeaPot 1.0 Control"),
control,
threading(apartment),
vi_progid("TeaPot.TeaPotCtrl.1"),
progid("TeaPot.TeaPotCtrl"),
version(1.0),
helpfile("TeaPot.hlp"),
event_source("com")
]
interface ITeaPot : IDispatch {
[id(1), helpstring("property Height")] float Height;
[id(2), helpstring("property Width")] float Width;
};
```
10. 在“TeaPot.rgs”文件中,添加以下代码:
```cpp
HKCR
{
TeaPot.TeaPotCtrl.1 = s 'TeaPot ActiveX Control'
{
CLSID = s '{02D5B4F8-7177-4E7B-8B55-5E6D4C02E8D8}'
Insertable = s '1'
ProgID = s 'TeaPot.TeaPotCtrl.1'
VersionIndependentProgID = s 'TeaPot.TeaPotCtrl'
DefaultIcon = s '%MODULE%,0'
}
}
HKCR\CLSID
{
{02D5B4F8-7177-4E7B-8B55-5E6D4C02E8D8} = s 'TeaPot ActiveX Control'
{
ProgID = s 'TeaPot.TeaPotCtrl.1'
VersionIndependentProgID = s 'TeaPot.TeaPotCtrl'
Description = s 'TeaPot ActiveX Control'
Control = s ''
}
{F033EFE8-07B1-11D2-A4F8-0000F8756F7A} = s 'TeaPot ActiveX Control'
{
ProgID = s 'TeaPot.TeaPotCtrl.1'
VersionIndependentProgID = s 'TeaPot.TeaPotCtrl'
Description = s 'TeaPot ActiveX Control'
OleObject = s 'TeaPot.TeaPotCtrl.1'
}
}
HKLM
{
Software\Classes\TeaPot.TeaPotCtrl.1 = s 'TeaPot ActiveX Control'
{
CLSID = s '{02D5B4F8-7177-4E7B-8B55-5E6D4C02E8D8}'
Insertable = s '1'
ProgID = s 'TeaPot.TeaPotCtrl.1'
VersionIndependentProgID = s 'TeaPot.TeaPotCtrl'
DefaultIcon = s '%MODULE%,0'
}
}
HKLM\Software\Classes\CLSID
{
{02D5B4F8-7177-4E7B-8B55-5E6D4C02E8D8} = s 'TeaPot ActiveX Control'
{
ProgID = s 'TeaPot.TeaPotCtrl.1'
VersionIndependentProgID = s 'TeaPot.TeaPotCtrl'
Description = s 'TeaPot ActiveX Control'
Control = s ''
}
}
```
11. 编译并运行项目,在窗体设计器中将控件拖放到窗体上,然后在属性窗口中设置控件的高度和宽度属性,即可在窗体上看到绘制的茶壶。
阅读全文