[ 前言 ]
准备把自绘控件单独封装到DLL类中,尝试使用“使用共享MFC DLL的规则DLL”建立项目,总是无法找到.lib,最终发现应该使用“MFC扩展DLL”类型建立DLL项目。
自带的基本控件都不怎么美观,所以一般开发者都会自定义类对控件进行重绘。手里也积累了不少控件的重绘,对对话框、静态文本、列表框等。
但是每次都要把这些类重新导入到新的工程里,比较麻烦,而且我也不想公开我积累的这些代码,所以想到了封装成库文件,每次只要导入头文件和库就行了,这样别人也看不到内部实现。
现将过程总结如下:
【一】新建MFC 扩展库项目(本例项目名称为:MFCliabrary2)
【二】将要封装的类导入到已经建好的项目中如下图所示。
【三】以下为要封装的类的头文件和源文件
#ifndef _H_OWNERDRAWCHECKBUTTON
#define _H_OWNERDRAWCHECKBUTTON
#pragma once
#include
class CMyStatic : public CStatic
{
DECLARE_DYNAMIC(CMyStatic)
public:
CMyStatic();
virtual ~CMyStatic();
protected:
DECLARE_MESSAGE_MAP()
public:
CFont m_Text;
bool SetTextFont(const LOGFONT& lgfnt);
bool SetTextFont(LONG nHeight, bool bBold, bool bItalic, const CString& sFaceName);
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void m_SetBackClr(COLORREF bKClr);
afx_msg void m_SetTextClr(COLORREF textClr);
afx_msg void m_SetNormalBk(COLORREF nmBkClr);
afx_msg void m_SetNormalText(COLORREF nmTextClr);
afx_msg void m_SetBkColor(COLORREF bKColor);
afx_msg void m_SetNormalBkColor(COLORREF nbKColor);
COLORREF m_BkClr;
COLORREF m_TextClr;
COLORREF m_NormalBkClr;
COLORREF m_NomalTextClr;
COLORREF m_bKColor;
COLORREF m_bKNormalColor;
CBrush m_ClrBrush;
CBrush m_ClrNormalBrush;
BOOL Is_Focused;
BOOL Set_TextColorFlag;
};
#endif
#include "pch.h"
#include "CMyStatic.h"
IMPLEMENT_DYNAMIC(CMyStatic, CStatic)
CMyStatic::CMyStatic()
{
Is_Focused = FALSE;
Set_TextColorFlag = TRUE;
m_BkClr = RGB(255,255,255);
m_TextClr = RGB(0,0,255);
m_NormalBkClr = RGB(255, 255, 255);
m_NomalTextClr = RGB(10,10,10);
m_bKColor = RGB(0,255,0);
m_bKNormalColor = RGB(255,255,255);
}
CMyStatic::~CMyStatic()
{
}
BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
ON_WM_CTLCOLOR_REFLECT()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
END_MESSAGE_MAP()
bool CMyStatic::SetTextFont(const LOGFONT& lgfnt)
{
m_Text.DeleteObject();
m_Text.CreateFontIndirect(&lgfnt);
SetFont(&m_Text, TRUE);
Invalidate();
return true;
}
bool CMyStatic::SetTextFont(LONG nHeight, bool bBold, bool bItalic, const CString& sFaceName)
{
LOGFONT lgfnt;
lgfnt.lfHeight = -MulDiv(nHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), 72);
lgfnt.lfWidth = 0;
lgfnt.lfEscapement = 0;
lgfnt.lfOrientation = 0;
lgfnt.lfWeight = bBold ? FW_BOLD : FW_DONTCARE;
lgfnt.lfItalic = bItalic ? TRUE : FALSE;
lgfnt.lfUnderline = FALSE;
lgfnt.lfStrikeOut = FALSE;
lgfnt.lfCharSet = DEFAULT_CHARSET;
lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS;
lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lgfnt.lfQuality = DEFAULT_QUALITY;
lgfnt.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
wcscpy_s(lgfnt.lfFaceName, sFaceName);
return SetTextFont(lgfnt);
}
HBRUSH CMyStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetBkMode(TRANSPARENT);
if (Set_TextColorFlag)
{
pDC->SetBkColor(m_BkClr);
pDC->SetTextColor(m_TextClr);
return(HBRUSH)m_ClrBrush;
}
else
{
pDC->SetBkColor(m_NormalBkClr);
pDC->SetTextColor(m_NomalTextClr);
return(HBRUSH)m_ClrNormalBrush;
}
}
void CMyStatic::OnSetFocus(CWnd* pOldWnd)
{
CStatic::OnSetFocus(pOldWnd);
Is_Focused = TRUE;
}
void CMyStatic::OnKillFocus(CWnd* pNewWnd)
{
CStatic::OnKillFocus(pNewWnd);
Is_Focused = FALSE;
}
void CMyStatic::m_SetBackClr(COLORREF bKClr)
{
m_BkClr = bKClr;
Invalidate();
}
void CMyStatic::m_SetTextClr(COLORREF textClr)
{
m_TextClr = textClr;
Invalidate();
}
void CMyStatic::m_SetNormalBk(COLORREF nmBkClr)
{
m_NormalBkClr = nmBkClr;
Invalidate();
}
void CMyStatic::m_SetNormalText(COLORREF nmTextClr)
{
m_NomalTextClr = nmTextClr;
Invalidate();
}
void CMyStatic::m_SetBkColor(COLORREF bKColor)
{
m_bKColor = bKColor;
m_ClrBrush.Detach();
m_ClrBrush.CreateSolidBrush(m_bKColor);
Invalidate();
}
void CMyStatic::m_SetNormalBkColor(COLORREF nbKColor)
{
m_bKNormalColor = nbKColor;
m_ClrNormalBrush.Detach();
m_ClrNormalBrush.CreateSolidBrush(m_bKNormalColor);
Invalidate();
}
【四】将已导入的类的声明改为如下所示
class AFX_EXT_CLASS CMyStatic : public CStatic
#ifndef _H_OWNERDRAWCHECKBUTTON
#define _H_OWNERDRAWCHECKBUTTON
#pragma once
#include
class AFX_EXT_CLASS CMyStatic : public CStatic
{
DECLARE_DYNAMIC(CMyStatic)
public:
CMyStatic();
virtual ~CMyStatic();
protected:
DECLARE_MESSAGE_MAP()
public:
CFont m_Text;
bool SetTextFont(const LOGFONT& lgfnt);
bool SetTextFont(LONG nHeight, bool bBold, bool bItalic, const CString& sFaceName);
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void m_SetBackClr(COLORREF bKClr);
afx_msg void m_SetTextClr(COLORREF textClr);
afx_msg void m_SetNormalBk(COLORREF nmBkClr);
afx_msg void m_SetNormalText(COLORREF nmTextClr);
afx_msg void m_SetBkColor(COLORREF bKColor);
afx_msg void m_SetNormalBkColor(COLORREF nbKColor);
COLORREF m_BkClr;
COLORREF m_TextClr;
COLORREF m_NormalBkClr;
COLORREF m_NomalTextClr;
COLORREF m_bKColor;
COLORREF m_bKNormalColor;
CBrush m_ClrBrush;
CBrush m_ClrNormalBrush;
BOOL Is_Focused;
BOOL Set_TextColorFlag;
};
#endif
【五】以上步骤完成后编译工程,编译完成后如下所示
【六】编译完成后在项目文件夹的"Release"文件夹下回出现“MFCLibrary2.dll”文件和“MFCLibrary2.lib”文件。如下图所示
【七】新建MFC对话框类工程(MFCApplication1)用于测试封装完成的类是否正确,能否正常使用。在工程文件下新建“Cbinclude”文件夹用于存放DLL库文件的头文件“CMyStatic.h”文件,新建“Cblib”文件夹用于存放“MFCLibrary2.lib”文件。将“MFCLibrary2.dll”文件分别放入项目文件夹下的"Debug"和"Release"文件夹下。如下图所示。
【八】在项目属性中打开“MFCApplication1”项目属性对话框如下图所示。
【九】在项目属性中打开“MFCApplication1”项目属性对话框如下图所示。选中“C/C++”属性,在右边的“附加包含目录”中选择“Cbinlude”文件夹所在的目录。
【十】选中“连接器”属性中选择“输入”属性,在右边的“附加依赖项”添加“MFCLibrary2.lib”。如下图所示。
【十一】选中“连接器”属性中选择“常规”属性,在右边的“附加库目录”中添加“MFCLibrary2.lib”库所在文件夹“Cblib”文件夹所在的路径。如下图所示。
【十二】用同样的方法配置项目“Releas”属性,配置完成后在项目对话框中增加一个ID为IDC_STATICDDDD的Text Control控件并为控件增加变量m_idcttt。在MFCApplication1Dlg.h头文件中包含“CMyStatic.h”如下图所示。并将IDC_STATICDDDD控件变量类型改为CMyStatic类型。
【十三】在项目对话框初始化OnInitDialog函数中添加如下代码。编译并运行项目。
m_idcttt.SetWindowText(_T("Hello Word"));
m_idcttt.SetTextFont(24, FALSE, FALSE, L"Magneto");
m_idcttt.m_SetBkColor(RGB(0,0,255));
m_idcttt.m_SetTextClr(RGB(243, 249, 241));
【结束语】
如上图所示为导出MFC DLL并导入到工程应用的实例,从实例看出导出的MFC DLL能正常使用,说明导出过程正确无误。C++的动态链接库封装是一个较为复杂的工程,本人也是通过应用了解到其中的冰山一角,希望能跟大家一起进一步升入学习和了解DLL的运行机制。
完整封装项目文件和工程应用文件已经上传到资源文件,下载地址如下:
https://download.csdn.net/download/lzc881012/86397065https://download.csdn.net/download/lzc881012/86397065