hur.cn - 华软网

 热门搜索

传参小问题

  作者:未知    来源:网络    更新时间:2010/12/9
有一个禁用对话框所有控件的函数
void CComman::RunningEnable(BOOL bEnable, CDialog* pDlg)
{
CWnd* pWnd;
//猎取第一个子窗口,即第一个控件
pWnd = pDlg->GetWindow(GW_CHILD);
while (NULL != pWnd)
{
//禁用,启用所有CButton
if (pWnd->IsKindOf(RUNTIME_CLASS(CButton)))
{
pWnd->EnableWindow(bEnable);
}
//禁用,启用查询树
else if (pWnd->IsKindOf(RUNTIME_CLASS(CTreeCtrl)))
{
pWnd->EnableWindow(bEnable);
}
//禁用,启用查询下拉框
else if (pWnd->IsKindOf(RUNTIME_CLASS(CComboBox)))
{
pWnd->EnableWindow(bEnable);
}
//禁用,启用编辑框
else if (pWnd->IsKindOf(RUNTIME_CLASS(CEdit)))
{
pWnd->EnableWindow(bEnable);
}
//猎取下一个控件
pWnd = pWnd->GetNextWindow();
}
}

现在有问题以下
typedef struct  
{
CComman* pCom;
CDialog* pDlg;
}tdFindGroup, *ptdFindGroup;

UINT thread_findgroup(LPVOID param)
{
    ptdFindGroup ptd = (ptdFindGroup)param;
    ptd->pCom->RunningEnable(TRUE, ptd->pDlg);
    return 0;
}

        CComman com;
ptdFindGroup ptd = new tdFindGroup();
ptd->pCom = &com;
ptd->pDlg = this;
//启用线程
AfxBeginThread ( thread_findgroup, (LPVOID)ptd , 0 ) ;
在线程函数中启用控件无效,就是ptd->pCom->RunningEnable(TRUE, ptd->pDlg);这句无效
然则如果不是在线程中是有效的
猜想应该是this传参的问题,this当前指向一个对话框,应该怎么做呢?  谢谢列位
试过
static CDialog* pDlg = this;
ptd->pDlg = pDlg;
也不行
---华软 网友回答---
CComman com;
ptdFindGroup ptd = new tdFindGroup();
ptd->pCom = &com;
ptd->pDlg = this;

应该获得已存留的CComman的指针,而不是新建一个对象
---华软网友回复---
另外,在线程里最好不要直接操作界面,发消息
---华软网友回复---
引用 2 楼 ouyh12345 的回复:
另外,在线程里最好不要直接操作界面,发消息

能说说怎么做或给个简单例子吗 ,菜鸟,见笑
---华软网友回复---
引用 3 楼 bellusvita 的回复:
引用 2 楼 ouyh12345 的回复:

另外,在线程里最好不要直接操作界面,发消息

能说说怎么做或给个简单例子吗 ,菜鸟,见笑

先获得界面的句柄,能够当参数传过来,也能够是全局的,然后通过该句柄SENDMESSAGE(),界面收到消息后在用消息响应函数措置惩罚 就好
---华软网友回复---
界面创建线程的时候 把该界面的句柄传过去 或用个全局变量记住该句柄 
---华软网友回复---
CComman com;
ptdFindGroup ptd = new tdFindGroup();
ptd->pCom = &com;
ptd->pDlg = this;


我想问题出现在 CComman com; 这里,如果没有猜错的话,CComman应该就是主窗口类了吧,
你在这里其实只需要传送一个控件所在的主窗体的句柄就能够了 完全不需要一个结构体的。。
以下:
1.AfxBeginThread ( thread_findgroup, (LPVOID)m_hWnd, 0 ) ; //当然这里将CComman理解为主窗体了


2.修改一下你自定义的程序:大体以下面的东西 RunningEnable(BOOL bEnable, CWnd* pWnd)


3.在线程函数中这样些
CWnd* pwnd;
pwnd = CWnd::FromHandle((HWND)pParam);
pwnd->RunningEnable(true,pwnd);

4.RnnningEnalbe(BOOL bEnable,CWnd* pWnd);
{
           .
           .
    pWnd->GetDlgItem(IDOK)->EnableWindow(FALSE);//以确定按钮为例子
             .
            .//伪代码
}

其实你上面的就是传送 &com 有问题了,也不知道啊所说的对与不对
。。个人意见
 
---华软网友回复---
引用 4 楼 yihandrensunyong 的回复:
引用 3 楼 bellusvita 的回复:
引用 2 楼 ouyh12345 的回复:

另外,在线程里最好不要直接操作界面,发消息

能说说怎么做或给个简单例子吗 ,菜鸟,见笑

先获得界面的句柄,能够当参数传过来,也能够是全局的,然后通过该句柄SENDMESSAGE(),界面收到消息后在用消息响应函数措置惩罚 就好

学习了,圆满解决问题
---华软网友回复---
线程中发送自定义的消息到主界面线程,线程参数改用主界面的HWND窗口句柄      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。