2 u014259816 u014259816 于 2014.03.29 10:50 提问

MFC 动态创建控件不响应消息

按照工程的要求,我必须建立一个类(动态链接库中),这个类是从CWnd派生的,里面的控件全部要求动态生成,而我这个类会作为一个Dialog的成员变量。
目前动态创建控件可以实现,但是控件却不响应消息,我认为是消息只在Dialog中,没法传到其成员变量中,不知道是不是这个原因……请大神帮忙!
我做了一个很简单的程序,请大神帮忙分析一下,灰常灰常感谢~

2个回答

u014259816
u014259816   2014.03.29 11:03

// MFCApplication1Dlg.h : 头文件

protected:
CTestWnd* m_pCTestWnd;

// MFCApplication1Dlg.cpp : 实现文件

BOOL CMFCApplication1Dlg::OnInitDialog()
{

// TODO: 在此添加额外的初始化代码
m_pCTestWnd = new CTestWnd(m_hWnd);
m_pCTestWnd->Create(_T("Test"), _T("Test"),
WS_CHILD | WS_VISIBLE, CRect(0, 0, 200, 200), this,1000);
}

// CTestWnd

class CTestWnd : public CWnd
{
DECLARE_DYNAMIC(CTestWnd)

public:
CTestWnd(const HWND& pParent);
virtual ~CTestWnd();

protected:
afx_msg void OnCButton();
DECLARE_MESSAGE_MAP()
public:
CButton* m_pCButton;
CRect m_rect;
};

// TestWnd.cpp : 实现文件
//

#include "stdafx.h"
#include "MFCApplication1.h"
#include "resource.h"
#include "TestWnd.h"

// CTestWnd

IMPLEMENT_DYNAMIC(CTestWnd, CWnd)

CTestWnd::CTestWnd(const HWND& pParent)
{

FromHandle(pParent)->GetClientRect(&m_rect);
m_pCButton = new CButton();
m_pCButton->Create( _T("确定"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    CRect(m_rect.left+10,m_rect.top+10,m_rect.left+60,m_rect.top+40),
    FromHandle(pParent), IDC_CBUTTON );

}

CTestWnd::~CTestWnd()
{
}

BEGIN_MESSAGE_MAP(CTestWnd, CWnd)
ON_BN_CLICKED(IDC_CBUTTON, &CTestWnd::OnCButton)
END_MESSAGE_MAP()

// CTestWnd 消息处理程序

void CTestWnd::OnCButton()
{

AfxMessageBox(_T("OK"));

}

u014259816
u014259816   2014.03.29 11:06

部分代码贴上来了
完整代码:
http://pan.baidu.com/s/1pJDawT9
请各位大神帮忙看一下,我都被折磨三天了,怎么也弄不出来,sendmessage都试过了。。。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
动态加载的 CTreeCtrl 消息响应
自己程序里的 CTreeCtrl 控件是在指定位置通过 CTreeCtr::Create() 来创建的,无法通过 VS 中图形化的界面在 Properties 面板里的 Control Events 工具来自动生成消息 映射函数,但控件又需要响应鼠标点击事件,这时最简单的办法就是重载 CTreeCtr 类中的虚函数 OnNotify() 。 自己先从CTreeCtrl类派生出CMyTreeCt
【VS开发】MFC CListCtrl列表控件的消息响应
MFC里的CListCtrl选中一行,消息是哪个.实在想不起来了。找了一篇文章,比较有用: http://www.cnblogs.com/hongfei/archive/2012/12/25/2832806.html LVN_BEGINDRAG 鼠标左键正在被触发以便进行拖放操作(当鼠标左键开始拖拽列表视图控件中的项目时产生) LVN_BEGINRDRAG 鼠标右
MFC 动态创建按钮及响应按钮消息
内容大纲 1、CButton类对象的成员方法 2、重视GetBitmap,GetCursor,GetIcon,GetState,DrawItem方法 3、动态添加按钮 4、字符串"ff"在内存中也以ff的形式存放,函数实现   详细内容 1.CButton类对象的成员方法 详细的实现代码见20121102button,其中各函数的具体描述参见《MFC程序开发参考大全》第五章5.5
VC对话框控件不响应回车消息之解决方案
VC webbrowser控件 响应回车消息 重载PreTranslateMessage(MSG* pMsg) 重载WM_GETDEFID消息
MFC CListCtrl不响应LVN_GETDISPINFO消息
今天写程序给对话框加了个列表控件CListCtrl【拖进去的控件】,用来显示类中一个Vector的内容。由于这个控件之前就用过很多遍了,已经知道如果列表想要响应LVC_GETDISPINFO消息,必须使能LVS_OWNERDATA风格。所以在OnInitDialog( )里面写了如下代码: m_listCtrl.ModifyStyle(0, LVS_OWNERDATA|LVS_REPORT|L
mfc 关于不响应键盘消息的处理
一:首先介绍键盘消息 系统消息:     ALT,F1,——F24等,是由系统内部处理的,程序本身就存在,比如F1是帮助键。     WM_SYSKEYDOWN     WM_SYSKEYUP     WM_SYSCHAR 非系统消息:     是由我们自己加上去的,     WM_KEYDOWN     WM_KEYUP     WM_CHAR 二:然后介绍虚拟键代
MFC 动态创建控件及添加消息响应函数
动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的。    一、创建动态控件:   为了对照,我们先来看一下静态控件的创建。   放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示。
MFC动态创建控件(按钮)及添加消息响应
动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的。一、创建动态控件:为了对照,我们先来看一下静态控件的创建。 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示。 静态控件不需要调用Create()
mfc中picture control 自定义控件不能响应鼠标问题
mfc定义了picture control 自定义的控件放上去 不能响应鼠标调整区域后,重新调整大小
MFC中非模态对话框不响应PreTranslateMessage函数的解决方法
程序员真心不容易啊,为了一个好的用户体验真可谓是操碎了心。今天由于项目需要,需要在非模态对话框上,当鼠标处于某个位置的时候有提示框显示。实现这个功能本来很简单,但是却遇到了一个郁闷的问题:PreTranslateMessage函数没响应。于是各种度娘,可惜度娘非谷歌,找了一个小时终于在一个隐蔽的地方找到了解决方法。     首先我介绍下当鼠标处于特定位置的时候有提示信息显示的实现方法。