VC++动态链接库编程之MFC扩展 DLL 3

本文介绍如何通过MFC扩展DLL导出函数和变量,并提供了一个带有颜色设置功能的CStatic派生类CMultiColorStatic的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读:


6.5 MFC扩展DLL导出函数和变量


  MFC扩展DLL导出函数和变量的方法也十分简单,下面我们给出一个简单的例子。


  我们在MFC向导生成的MFC扩展DLL工程中添加gobal.h和global.cpp两个文件:


//global.h:MFC扩展DLL导出变量和函数的声明


extern "C"


{


 int AFX_EXT_DATA total; //导出变量


 int AFX_EXT_API add( int x, int y ); //导出函数


}


//global.cpp:MFC扩展DLL导出变量和函数定义


#include "StdAfx.h"


#include "global.h"


extern "C" int total;


int add(int x,int y)


{


 total = x + y;


 return total;


}


  编写一个简单的控制台程序来调用这个MFC扩展DLL:


#include


#include 单击此处下载本工程)。


  我们知道static控件所对应的CStatic类不具备设置背景和文本颜色的接口,这使得我们不能在对话框或其它用户界面上自由灵活地修改static控件的颜色风格,因此我们需要一个提供了SetBackColor和SetTextColor接口的CStatic派生类CMultiColorStatic。


 


  这个类的声明如下:


class AFX_EXT_CLASS CMultiColorStatic : public CStatic


{


 // Construction


 public:


  CMultiColorStatic();


  virtual ~CMultiColorStatic();


  // Attributes


 protected:


  CString m_strCaption;


  COLORREF m_BackColor;


  COLORREF m_TextColor;


  // Operations


 public:


  void SetTextColor( COLORREF TextColor );


  void SetBackColor( COLORREF BackColor );


  void SetCaption( CString strCaption );


  // Generated message map functions


 protected:


  afx_msg void OnPaint();


  DECLARE_MESSAGE_MAP()


};


  在这个类的实现文件中,我们需要为它提供WM_PAINT消息的处理函数(这是因为颜色的设置依赖于WM_PAINT消息):


BEGIN_MESSAGE_MAP(CMultiColorStatic, CStatic)


//{{AFX_MSG_MAP(CMultiColorStatic)


 ON_WM_PAINT() //为这个类定义WM_PAINT消息处理函数


//}}AFX_MSG_MAP


END_MESSAGE_MAP()


  下面是这个类中的重要成员函数:


//为CMultiColorStatic类添加“设置文本颜色”接口


void CMultiColorStatic::SetTextColor( COLORREF TextColor )


{


 m_TextColor = TextColor; //设置文字颜色


}


//为CMultiColorStatic类添加“设置背景颜色”接口


void CMultiColorStatic::SetBackColor( COLORREF BackColor )


{


 m_BackColor = BackColor; //设置背景颜色


}


//为CMultiColorStatic类添加“设置标题”接口


void CMultiColorStatic::SetCaption( CString strCaption )


{


 m_strCaption = strCaption;


}


//重画Static,颜色和标题的设置都依赖于这个函数


void CMultiColorStatic::OnPaint()


{


 CPaintDC dc(this); // device context for painting


 CRect rect;


 GetClientRect( &rect );


 dc.SetBkColor( m_BackColor );


 dc.SetBkMode( TRANSPARENT );


 CFont *pFont = GetParent()->GetFont();//得到父窗体的字体


 CFont *pOldFont;


 pOldFont = dc.SelectObject( pFont );//选用父窗体的字体


 dc.SetTextColor( m_TextColor );//设置文本颜色


 dc.DrawText( m_strCaption, &rect, DT_CENTER );//文本在Static中央


 dc.SelectObject( pOldFont );


}


  为了验证CMultiColorStatic类,我们制作一个基于对话框的应用程序,它包含一个如图17所示的对话框。该对话框上包括一个static控件和三个按钮,这三个按钮可分别把static控件设置为“红色”、“蓝色”和“绿色”。








图17 扩展的CStatic类调用演示


  下面看看应如何编写与这个对话框对应的类。


  包含这种Static的对话框类的声明如下:


#include "../MultiColorStatic.h"


#pragma comment ( lib, "ColorStatic.lib" )


// CCallDllDlg dialog


class CCallDllDlg : public CDialog


{


 public:


  CCallDllDlg(CWnd* pParent = NULL); // standard constructor


  enum { IDD = IDD_CALLDLL_DIALOG };


  CMultiColorStatic m_colorstatic; //包含一个CMultiColorStatic的实例


 protected:


  virtual void DoDataExchange(CDataExchange* pDX);//DDX/DDV support


  HICON m_hIcon;


 // Generated message map functions


 //{{AFX_MSG(CCallDllDlg)


 virtual BOOL OnInitDialog();


 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);


 afx_msg void OnPaint();


 afx_msg HCURSOR OnQueryDragIcon();


 afx_msg void OnRedButton();


 afx_msg void OnBlueButton();


 afx_msg void OnGreenButton();


//}}AFX_MSG


DECLARE_MESSAGE_MAP()


};


  下面是这个类中与使用CMultiColorStatic相关的主要成员函数:


void CCallDllDlg::DoDataExchange(CDataExchange* pDX)


{


 CDialog::DoDataExchange(pDX);


 //{{AFX_DATA_MAP(CCallDllDlg)


  DDX_Control(pDX, IDC_COLOR_STATIC, m_colorstatic);


 //使m_colorstatic与IDC_COLOR_STATIC控件关联


 //}}AFX_DATA_MAP


}


BOOL CCallDllDlg::OnInitDialog()


{


 …


 // TODO: Add extra initialization here


 // 初始static控件的显示


 m_colorstatic.SetCaption("最开始为黑色");


 m_colorstatic.SetTextColor(RGB(0,0,0));


 return TRUE; // return TRUE unless you set the focus to a control


}


//设置static控件文本颜色为红色


void CCallDllDlg::OnRedButton()


{


 m_colorstatic.SetCaption( "改变为红色" );


 m_colorstatic.SetTextColor( RGB( 255, 0, 0 ) );


 Invalidate( TRUE ); //导致发出WM_PAINT消息


}


//设置static控件文本颜色为蓝色


void CCallDllDlg::OnBlueButton()


{


 m_colorstatic.SetCaption( "改变为蓝色" );


 m_colorstatic.SetTextColor( RGB( 0, 0, 255 ) );


 Invalidate( TRUE ); //导致发出WM_PAINT消息


}


//设置static控件文本颜色为绿色


void CCallDllDlg::OnGreenButton()


{


 m_colorstatic.SetCaption( "改变为绿色" );


 m_colorstatic.SetTextColor( RGB(0,255,0) );


 Invalidate( TRUE ); //导致发出WM_PAINT消息


}


  至此,我们已经讲解完成了所有类型的动态链接库,即非MFC DLL、MFC规则DLL和MFC扩展DLL。下一节将给出DLL的三个工程实例,与读者朋友们共同体会DLL的应用范围和使用方法。





本文转自


http://tech.163.com/05/1010/10/1VMP5SN900091589_3.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值