随笔-145  评论-173  文章-70  trackbacks-0
开始学习MFC,各位高手不要见笑啊。

其实之前一直都在陆续的学习中,不过看书和动手相差太远了,所以一直没有长进,今天动手写了小的程序,就出现了很多状况,于是不得不好好的思考和查找资料,也收获了不少。

这个是第一个成功的程序。第一个就是一个小的对话框,点击上面的add按钮,就会出现一个Test的按钮,然后再次点击的时候,就会消失,此时就会出现循环的出现和消失的情况,而如果不点击的时候,就会保持那种状态。
先上了一张图:



(高手们暗笑吧)那个按钮就是动态生成的,而那个MessageBox则是点击动态生成的按钮出现的。
问题和解答:
1)如何实现显示和不显示呢?
添加类的成员变量。这里是一个dlg,对话框的类,因此切换到类的层次结构图中,然后点击右边,添加member variable,添加两个变量,一个是BOOL类型的,一个是CButton类型的,其中后者,就是那个要创建的按钮的名称。
如何实现呢?很简单,添加方法。在拖住一个button控件后,双击,生成一个响应函数,那么在里面添加的话就直接响应了add按钮了。
然后,里面的就是填充函数体了,来一个if判断,如果刚才的那个BOOL类型的变量为true或者是false,就响应的创建或者销毁,注意完成之后,需要重新设置,使得下次点击的时候可以再次起作用。
至此,就完成了前面的那部分功能。

2)如何实现响应动态生成的按钮呢?
动态生成的按钮,如何得到ID,然后响应呢?
(参加blog:http://www.cppblog.com/deercoder/articles/107132.html
那么我具体说说我做的吧。(本来书上在Create的最后一个参数是123,也就是一个整数,对它来说没有作用,所以直接整数)
但是对于我来说,由于要继续实现响应这个按钮的动作,于是不得不得到具体的这个ID,那么,我就要用一个宏来定义了。
在resources.h里面添加#define    IDC_1 123,然后替换,就OK了。
然后剩下的问题是响应,通过查资料,知道了基本步骤是:
CButton *p_Button = new CButton();
p_Button
->Create( "Good", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, ID_MYBUT1 ); 
然后添加:
afx_msg 
void OnMybut1()
ON_BN_CLICKED(ID_MYBUT1, OnMybut1)
最后
void CTextEditorView::OnMybut1()
{
MessageBox( 
"哈!你单击了动态按钮。" );
}

我知道这样可以动态创建一个按钮并添加消息响应函数,但其消息响应函数还是手动
添加,我想问一下有没有一种方法,可以动态创建一个按钮后再动态创建其消息响应函数?

 这个是网上摘录的。但是添加后明显就知道有错误。如何实现呢?看看刚刚那篇blog吧,
afx_msg void OnMybut1()和ON_BN_CLICKED(ID_MYBUT1, OnMybut1)放在一起肯定是不行的,而以前看过的《深入浅出MFC》则在这个上面讲了很多,特别是消息映射和消息的响应。于是了解到:
ON_BN_CLICKED(ID_MYBUT1, OnMybut1)-----------------将相应的ID_MYBUT1关联到函数OnMybut1   (放在实现中,有其他的类似的东西,那些paint等等函数也都是这样映射到ID的,实现方法的。因此放在.cpp文件中)

代码如下:
BEGIN_MESSAGE_MAP(CTeswDlg, CDialog)
 //{{AFX_MSG_MAP(CTeswDlg)
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
 ON_BN_CLICKED(IDC_1, OnMybut1)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()



afx_msg void OnMybut1()---------------------------------------(Generated message map functions)消息映射函数(放在类定义中,其中注释的那个部分说明了这个的具体位置,有很多函数,比如,OnInitDialog , Onpaint等等函数。因此也是类的成员函数)代码部分如下
(由于是声明,放在.h文件中):
protected:
 HICON m_hIcon;

 // Generated message map functions
 //{{AFX_MSG(CTeswDlg)
 virtual BOOL OnInitDialog();
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 afx_msg void OnButton1();
 afx_msg void OnMybut1();
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};



将这两者完成后,实际上就完成了大部分工作,不过还是不够啊。

下面的,具体实现那个方法,即void OnMybut1();到底是哪个类的成员函数呢?我如何定义呢?

前面的问题其实就解决了。如何,在.h文件中,我既然用到了消息映射的函数,而且在class中,那么自然是这个class的子函数,于是就是用到这个类的,前面的Demo小例子,用的是TextEdit,这里是一个DLG,要具体的分析,于是改正之后,就变成了下面的的这个。
void CTeswDlg::OnMybut1()
{
 MessageBox( "哈!你单击了动态按钮。" );
}

这样,就OK了。

看到结果就会发现,其实处理的函数都没有变,只是添加了一个新的消息映射和button,由他们来自动处理,与我们原来的那个add按钮的函数是没有任何关系的。两者独立。

于是程序就完了。结果很简单,入门不容易。。。。



源代码我上传到程序员联合开发网,下载地址为:http://www.pudn.com/downloads225/sourcecode/windows/control/button/detail1058419.html
ok,完了。继续学习中………………(寒假闭关修炼,哈哈!!)

posted on 2010-02-03 23:17 deercoder 阅读(3337) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理