一个很简单的对话框程序,内有一个ClistCtrl控件:
头文件内定义:
class CUMS1Dlg : public CDialog
{
// Construction
public:
CUMS1Dlg(CWnd* pParent = NULL); // standard constructor// Dialog Data
//{{AFX_DATA(CUMS1Dlg)
enum { IDD = IDD_UMS1_DIALOG };
CListCtrl m_list;但问题是我必须自己定义一个函数:
void yyy();
在这个函数内要修改、添加、删除m_list内的表项;
我是这样操作的:
CUMS1Dlg *dlg=new CUMS1Dlg;
dlg->m_list.InsertItem(0,"第一项");
delete dlg;
.......
而且yyy();还是一个线程函数,需要用创建线程的函数为它创建线程来运行。
问题在于:
如果我将yyy()定义为CUMS1Dlg的类函数,那么线程函数就无法为yyy()创建线程,编译错误。
但是我不将yyy()定义为CUMS1Dlg的类函数,那么编译通过,但运行时一到
dlg->m_list.InsertItem(0,"第一项");就非法操作。
弄了一天,也没搞好到底是怎么弄的,希望高手详细指教!谢谢!谢谢!
头文件内定义:
class CUMS1Dlg : public CDialog
{
// Construction
public:
CUMS1Dlg(CWnd* pParent = NULL); // standard constructor// Dialog Data
//{{AFX_DATA(CUMS1Dlg)
enum { IDD = IDD_UMS1_DIALOG };
CListCtrl m_list;但问题是我必须自己定义一个函数:
void yyy();
在这个函数内要修改、添加、删除m_list内的表项;
我是这样操作的:
CUMS1Dlg *dlg=new CUMS1Dlg;
dlg->m_list.InsertItem(0,"第一项");
delete dlg;
.......
而且yyy();还是一个线程函数,需要用创建线程的函数为它创建线程来运行。
问题在于:
如果我将yyy()定义为CUMS1Dlg的类函数,那么线程函数就无法为yyy()创建线程,编译错误。
但是我不将yyy()定义为CUMS1Dlg的类函数,那么编译通过,但运行时一到
dlg->m_list.InsertItem(0,"第一项");就非法操作。
弄了一天,也没搞好到底是怎么弄的,希望高手详细指教!谢谢!谢谢!
最好把代码贴全了.
gz
http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=435
m_list都没有,要出错..CUMS1Dlg *dlg=new CUMS1Dlg;
dlg->Create(IDD_DIALOG_); //对话框资源iD
dlg->ShowWindow(SW_SHOW);dlg->m_list.InsertItem(0,"第一项");
delete dlg;
((CUMS1Dlg *)(AfxGetApp()->m_pMainWnd))->m_list.InsertItem(0,"未知");
试试看
2.看你的代码
CUMS1Dlg *dlg=new CUMS1Dlg;
dlg->m_list.InsertItem(0,"第一项");
delete dlg;在函数内动态生成了一个对话框对象,这个对象并不是你原来的那个对话框,如果操作原来对话框中的listctrl,应该把对话框指针或者引用传进来你在执行到dlg->m_list.InsertItem(0,"第一项");错误,我觉得在new 后应该只是创建了对话框对象的内存空间,并调用了构造函数,但是实际上对话框并没有创建出来。当你执行dlg->DoModel后对话框才创建出来,才创建出对话框,你才可以向listctrl 后添加东西
按你的描述, 需要将你的类对象指针传入线程函数,此时就不能用new和create了, 用new则创建了一个新的对象,就
不是你原来的对象了.例:
m_pThread = AfxBeginThread(ThreadProc, this, //this将类对象做参数传入
THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);UINT ThreadProc(LPVOID pParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); //需加上 CYourDlg *pDlg = (CYourDlg *)pParam; //对到对象
dlg->m_list.InsertItem(0,"第一项");
'''''
}
AFX_MANAGE_STATE(AfxGetStaticModuleState()); //需加上