2024年4月19日发(作者:)

MFC自定义控件详细»

/3582077/blog/item/ 关

于Custom Control 自定义控件的介绍,有一篇文章感觉不错,不过是英文的,英语不好

的也没关系,不 是有“有道”吗?再说了,我们只要看代码就行了,而且步骤也就那么几

步,结合教程图片稍微猜一下也 就知道了。 原文地址:

/KB/static/ 接下来我把上面教程的

操作步骤简单描述一下: 1、首先往对话框添加一个“自定义控件”,然后右击该控件选

择“建立类向导”,在弹出的对话框点击 “”,选择“", 之后“Name"

项填CMyCustomControl, “Base Class"选择generic CWnd,点确定。 在

MyCustomControl.h

CMyCustomControl

添加函数声明

类添加如

BOOL

下函

RegisterWndClass();

数:

BOOL

CMyCustomControl::RegisterWndClass() { WNDCLASS windowclass; HINSTANCE

hInst=AfxGetInstanceHandle();

if(!::GetClassInfo(hInst,"MyDrawPad",&windowclass))

{ =CS_DBLCLKS; dProc=::DefWindowProc;

xtra=xtra=0;

nce=hInst; =NULL;

r=AfxGetApp()->LoadStandardCursor(IDC_ARROW);

kground=::GetSysColorBrush(COLOR_WINDOW);

nuName=NULL; assName="MyDrawPad";

if(!AfxRegisterClass(&windowclass)) { AfxThrowResourceException(); return

FALSE; } } return TRUE; } 在MyCustomControl 类构造函数中调用RegisterWndClass

函数,如下: CMyCustomControl::CMyCustomControl() { RegisterWndClass(); } 接

着右击对话框里“自定义控件”,选择属性,“种类”框里填上MyDrawPad(窗口类)。

给对话框类添 加一个CMyCustomControl 类对象(是在*Dlg.h)。如:

CMyCustomControl m_drawpad;(记得包含头文件)。 #include

"MyCustomControl.h" 对话框类的DoDataExchange 函数里添加如下语句: void

CThirdDlg::DoDataExchange(CDataExchange* pDX)

{ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CThirdDlg) // NOTE: the

ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP

DDX_Control(pDX,IDC_CUSTOM1,m_drawpad);//IDC_CUSTOM1 为自定义控件的ID

号 } 到了这里,自定义控件的基本问题算是解决了。可自行给CMyCustomControl 类添

加消息响应函数,运行一 下吧。 自定义控件仿工具栏 标题名是仿工具栏控件,其实也只

是仿下工具栏那个模式而已,想一下,工 具栏类里有那么多个函数,能仿得过来吗?如果

有谁觉得用自定义控件模仿这个 太麻烦的话,也可直接从按钮控件(CButton)派生出类

来代替“自定义控件”类。 我这里就直接以上面工程的CMyCustomControl 类为例。

1、首先往工程里引三张图片如下: 2、再引入六个图标,用于项显示图标,ID 号保持默

认不变, 3、CMyCustomControl 添加如下成员变量(私有变量) 4、响应自定义控件

(CMyCustomControl) WM_ERASEBKGND、WM_LBUTTONDOWN、

WM_LBUTTONUP、WM_MOUSEMOVE、WM_PAINT、WM_TIMER 消息 5、添加如

下成员函数 6、构造函数中初始化部分成员变量(私有变量初始化) 7、添加各函数代码

8、成员函数要在.h 中的public 中声明 void SetBitmapIDs(UINT BKID,UINT

itemMOverID,UINT itemPushID); BOOL SetItemSize(int Width,int Height,int

itemSpacing=5); BOOL SetImageList(CImageList *pImageList); BOOL

AddItem(UINT nID); 9、在*Dlg.h 中定义一个需要用到的变量 CImageList

m_ImageList; 10、在*.cpp 中添加初始化响应函数

m_(32,32,ILC_COLOR32|ILC_MASK,1,0);

m_(AfxGetApp()->LoadIcon(IDI_ICON1+i));

m_geList(&m_ImageList);

for(int i=0;i<6;i++)