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_MAP与END_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个,那么这些按钮的消息该如何响应?
以后要记得文档书写的过程中及时保存,不然造成的后果只有自已返工。