none
dll窗体中给listbox添加值失败,这是什么原因 RRS feed

  • 问题

  • dll中窗体,建一类叫Clei
    窗体加一 botton和 listbox(给它新建 控件变量m_LB)

    按钮代码

    void CLei::OnBnClickedButton()
    {
        m_LB.AddString(_T("123456"));
        ShowValue();
        m_LB.AddString(_T("7890"));
    }


    ShowValue();是写在另一cpp中的

    void ShowValue()
    {
        CLei lei;
        lei.m_LB.AddString(_T("abcde"));
    }

    (CLei lei;放到函数外面,生名成全局的也不行)

    2013年3月14日 6:15

全部回复

  • CLei lei;
    lei
    .m_LB.AddString(_T("abcde"));
    ----------------------------------------------
    这样肯定是不可以的,你的CLei类中的对象m_LB没有与ListBox窗口控件关联起来,所以后面的AddString的操作都是非法的。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年3月14日 7:14
    版主
  • 那该怎么关联起来?
    2013年3月14日 10:32
  • 传递对象指针到函数而不是重新创建一个对象并且在函数完成时销毁。



    Visual C++ MVP

    2013年3月14日 13:56
    版主
  • 我只找到了,这样取控件指针的方法,

    CListBox *pclistbox=(CListBox*)GetDlgItem(IDC_LIST1);

    可以用,但,该怎么销毁呢?

    我用

    if(pclistbox)
    
        delete pclistbox;

    一点例程就直接退了。。。

    另外

    这个只能用listbox

    换成edit,正常这样显示,m_str="123";(m_str控件变量CString)

    但这么写CEdit *pCedit=(CEdit*)GetDlgItem(IDC_EDIT1);

    我该怎么让这个edit控件显示值呢?

    在问一句,是不是mfc所有控件都可以这样取对像指针。。(太多了,没法一个个试)

    2013年3月18日 13:56
  • GetDlgItem返回的指针不用销毁,它要么是临时的CTempWnd对象(定时销毁)或者是你的类的成员变量的地址(你的类负责销毁)。

    不是mfc所有控件都可以这样取对像指针。只有那些内存布局和CTempWnd一致的可以。检查类的定义看看是否增加了非静态变量或者虚函数。

    比较保险的方式是通过成员变量直接访问,例如如果你的IDC_EDIT1通过DDX关联到一个CEdit类型的变量,而且你的代码在同一个线程之内执行,那么可以直接用这个变量直接访问IDC_EDIT1,因为这时候GetDlgItem不过是返回这个变量的地址,而且因为多了一个搜索对应变量的过程,速度更慢。



    Visual C++ MVP

    2013年3月18日 14:10
    版主
  • 谢谢,CEdit那个没明白,,

    我用“添加程员变量向导”添加了CEdit类型变量Cstr,可是还是不会。

    按钮,传进去*pCedit.

    void testWinDLL::OnBnClickedOk()
    {
    	// TODO: 
    	CEdit *pCedit=(CEdit*)GetDlgItem(IDC_EDIT1);
    	showSTR(pCedit);
    	//UpdateData(0);
    	
    }

    另一个CPP

    void showSTR(CEdit *pCedit){

    m_str="12345"; pCedit-> }

    怎么让它显示出来呢?

    我只是随便建了个MFC程序,然后写一个dll注入进去。按键可以呼出窗体,我也不知道怎么看它们在不在一个线程里

    2013年3月19日 5:48
  • 被调用的函数和调用者在一个线程。

    你的IDC_EDIT1已经通过DDX_Control(注意不是DDX_Text,这个直接给控件传值了)关联到m_str的话,可以把m_str的的引用或者地址传递给你的showSTR函数。



    Visual C++ MVP

    2013年3月19日 14:28
    版主
  • void showSTR(CEdit *pCedit){
            Cstr	         //控件变量,DDX_Control
            m_str="12345";   //CString变量,DDX_Text
    	pCedit->
    }

    谢谢,明白了。

    可是只会直接用控件的变量,

    不会取m_str的引用或地址。(搜了半天也没找到)

    Cstr是控件型 的,

    能给个,这两个方式使用的例子吗?

    2013年3月20日 7:18