MFC 动态创建按钮及响应按钮消息

来源:互联网 发布:知所不知 编辑:程序博客网 时间:2024/04/27 16:40

1.动态创建按钮

2.响应按钮消息


1.动态创建按钮即是自已手动添加,由代码完成。这里的动态更深一层次的理解是通过New来动态开辟一块内存空间。

首先是声明变量,再为该变量申请一块内存空间这里即是New;

CButton* myButton;

myButton = new CButton();

然后通过调用CButton类中的Create成员函数创建按钮。

myButton->Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(100,300,220,350), this, 11119);

BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle,
    const RECT& rect, CWnd* pParentWnd, UINT nID);

详细解析Create函数:

lpszCaption:该按钮控件显示的文本。

dwStyle:按钮控件的风格样式。

rect:指定了该控件的大小及位置。它可以是一个CRect对象或者Rect的结构体。

pParentWnd:指定了该控件的父窗口,一般情况下是一个CDialog,该参数不能为空。

nID:该控件的标识,即ID。

返回值:如果成功则返回真,否则为0。


需要注意的是:

构造一个CButton对象需要两步,首先是分配内存空间即成生一个对象,然后再调用Create函数生成一个窗口的按钮控件。关于该控件的风格,一般WS_VISIBLE 是必要的。

对于一个Button控件的窗口样式有:WS_CHILD,WS_VISIBLE ,WS_DISABLED ,WS_GROUP,WS_TABSTOP 

按钮样式有:BS_BITMAP, BS_ICON ,BS_LEFTTEXT ,BS_PUSHBOX ,BS_TEXT ,BS_USERBUTTON ,BS_RIGHTBUTTON 等

如: myButton[0].Create("button1",WS_CHILD|WS_VISIBLE|BS_LEFTTEXT  , CRect(50,50,130,75),this, 21111);
myButton[1].Create("button2",WS_CHILD|WS_VISIBLE|WS_GROUP| BS_AUTORADIOBUTTON, CRect(50,80,130,105), this, 21112);
myButton[2].Create("button3",WS_CHILD|WS_VISIBLE|BS_BITMAP, CRect(50,110,130,145),this, 21113);
myButton[3].Create("button4",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, CRect(50,150,130,185),this, 21114);


2.响应按钮消息

这里创建好的按钮要想它起作用需要绑定消息函数,响应按钮消息要几个步骤:

步骤一:在当前类的BEGIN_MESSAGE_MAPEND_MESSAGE_MAP之间完成消息的绑定,如:

BEGIN_MESSAGE_MAP(CMy20121102buttonDlg, CDialog)
//{{AFX_MSG_MAP(CMy20121102buttonDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
//}}AFX_MSG_MAP

ON_BN_CLICKED(21111, Onbutton1)
END_MESSAGE_MAP
()

一般放在AFX_MSG_MAP的外面,第一个参数是句柄,第二个参数是消息函数的函数名。

步骤二:在该应用程序的自定义类中声明消息函数,如:

afx_msg voidOnbutton1();
afx_msg void OnButton12();
//}}AFX_MSG

DECLARE_MESSAGE_MAP()

步骤三:完成了整个消息的映射,那么剩下的就是写这些消息函数了,如:

void CMy20121102buttonDlg::Onbutton1()
{
AfxMessageBox("button1fka;sjd");
}


最后需要考虑的是资源的释放问题,即:

if(myButton != NULL)

{delete[] myButton;

myButton = NULL;

}


疑问:创建了好多个动态按钮,可能是1000个,那么这些按钮的消息该如何响应?


以后要记得文档书写的过程中及时保存,不然造成的后果只有自已返工。