我建立了一个基于对话框的MFC程序,主对话框类CMainDlg,又添加了一个对话框类CInfoDlg并在其中添加了一个List Control控件。想通过点击主对话框中的Button1来调用子对话框在List Control中显示数据库内容。刚开始我在CInfoDlg中重载了OnInitDialog()函数,想在其中添加List Control的初始化代码,编译正常但运行后执行到mInfoList.SetExtendedStyle(dwExtendedStyle)时就出错了。之后我改为在主对话框Button1的事件处理函数中添加初始化代码,出现同样的错误。另外,对于Static Text控件,例如调用其SetWindowText()也会出现Debug Assertion Failed错误。
作为初学者,这几天我上网查了很多资料都没找到解决的方法,只好在这请教各位前辈了,期待你们的指导,谢谢!

解决方案 »

  1.   

    确实非技术问题
    看你这描述,估计是定义完对话框还没DoModal就开始操作这个对话框的资源了.
    或者资源错了,所以被操作的控件窗口句柄无效.如果搞不定就把调用对话框的代码和对话框内初始化的代码贴出来再说
      

  2.   


    // InfoDlg.cpp : 实现文件
    //#include "stdafx.h"
    #include "test.h"
    #include "InfoDlg.h"
    // CInfoDlg 对话框IMPLEMENT_DYNAMIC(CInfoDlg, CDialog)CInfoDlg::CInfoDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CInfoDlg::IDD, pParent)
    {}CInfoDlg::~CInfoDlg()
    {
    }void CInfoDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST1, mInfoList);
    }
    BEGIN_MESSAGE_MAP(CInfoDlg, CDialog)
    END_MESSAGE_MAP()
    // CInfoDlg 消息处理程序
    BOOL CInfoDlg::OnInitDialog()
    {
    DWORD dwExtendedStyle;
    dwExtendedStyle=LVS_REPORT|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT;
    mInfoList.SetExtendedStyle(dwExtendedStyle); //mInfoList关联List Control控件IDC_LIST1 //添加字段
    mInfoList.InsertColumn(0,L"txt0",LVCFMT_LEFT,100);
    mInfoList.InsertColumn(1,L"txt1",LVCFMT_LEFT,100);
    mInfoList.InsertColumn(2,L"txt2",LVCFMT_LEFT,100); return TRUE;
    }//////////////////////////////////////////////////////////////////////////////
    // testDlg.cpp : 实现文件
    //#include "stdafx.h"
    #include "test.h"
    #include "testDlg.h"
    #include "InfoDlg.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialog
    {
    public:
    CAboutDlg();// 对话框数据
    enum { IDD = IDD_ABOUTBOX }; protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
    protected:
    DECLARE_MESSAGE_MAP()
    };CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    }BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    // CtestDlg 对话框
    CtestDlg::CtestDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CtestDlg::IDD, pParent)
    {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }void CtestDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    }BEGIN_MESSAGE_MAP(CtestDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_BUTTON1, &CtestDlg::OnBnClickedButton1)
    END_MESSAGE_MAP()
    // CtestDlg 消息处理程序BOOL CtestDlg::OnInitDialog()
    {
    CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE); // 设置大图标
    SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }void CtestDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialog::OnSysCommand(nID, lParam);
    }
    }// 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。void CtestDlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialog::OnPaint();
    }
    }//当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CtestDlg::OnQueryDragIcon()
    {
    return static_cast<HCURSOR>(m_hIcon);
    }
    void CtestDlg::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知处理程序代码
    CInfoDlg mDlg;
    mDlg.DoModal();}请你帮我分析一下错在哪,该怎么改才能实现我的意图,我没什么积分,无以为报,只能心存感激!
      

  3.   

        ON_BN_CLICKED(IDC_BUTTON1, &CtestDlg::OnBnClickedButton1)
    这个消息响应函数是你自己添加的,写错了.自己在对话框资源编辑里面双击这个button,就会提示创建一个消息响应函数了.
    不知道为啥你自己单独写个,还多了个&符号,&不是随便用的