在MFC的子线程中,去操作主线程的编辑窗口

首先,我创建了一个MFC的对话框工程。
我创建了一个子线程,然后子线程循环接收数据
我希望每次接收到的数据,都可以在DLG的编辑窗口中显示。

可是,我不清楚怎么取显示?
我想调用SetWindowText函数,可是他还让我输入一个参数句柄。
我感觉这个句柄应该是编辑窗口的句柄,但是我不清楚怎么获取?

这个功能到底怎么实现呢?

就是在子线程中获取数据,然后在主线程的对话框的编辑窗口显示。

句柄指明了你要更新哪一个窗口。平时所说的“控件”,其实Windows下都叫“窗口”

如果你用类向导为这些控件创建了控件类型的变量,那么直接用这些变量操作就行了(创建线程的时候不是可以传递一个线程参数吗,在主窗口把this传进去就是了。然后从this就可以取到这个“控件变量”,直接在它上面调用SetWindowText方法而不是调用SetWindowText API,就不需要“句柄”了追问

能说详细点不~~
我明天就要交差了,我是真不想学MFC,无奈~~

追答

就你问题里描述的这些东西的详细程度,我没办法说具体。

追问

这样吧,你能把这块代码给我不,我再说下我的问题。

    我创建了一个MFC 对话框模式,该对话框什么都没有,只有一个编辑框。

    我创建了一个子线程

    子线程中,我不断的获取数据,每一条数据都是一个字符串,并且接收速度很快

    子线程接收数据后,将数据显示到编辑框上。

     

    就这样,我已经获取到数据了,现在就差显示了。高手,能把这一块的详细步骤或者代码给下不,第一步咋样,第二步咋样~~~~

追答

1、右键点编辑框,选properties,在style里面,把multiline勾起来,vertical scroll最好也勾。英文看得懂吧?……
2、记下编辑框的名字,比如IDC_EDIT1
3、创建线程的时候,把this作为参数送入
4、在线程函数里把参数转回原来的类型(比如CXxxxDlg*)
5、要更新数据的时候,代码大概长这样
CAaaDlg* dlg = (CAaaDlg*) p; //第四步所说
CString str;
CWnd* pe = dlg->GetDlgItem(IDC_EDIT1); //第二步所说
pe->GetWindowText(str);
str += "aasdfasdf\r\n"; //注意换行是 \r\n
pe->SetWindowText(str);

虽然效率可能不太好不过毕竟能实现……

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-25
GetDlgItem(IDC_EDIT1)->SetWindowText("hello");//IDC_EDIT1是编辑框的

MFC调出子对话框后如何操作主对话框(不关闭子对话框)
1 在头文件中加入 include "Dlg.h"public:CDlg *Dlg;2 在代码中加入 Dlg=new CDlg(this);Dlg->Create(IDD_DIALOG1);Dlg->ShowWindow(SW_RESTORE);\/\/建好后,主窗体和子窗体 可以相互切换

VC 如何在线程里调用主窗口的控件
关键的步骤就是获取实际窗口指针(句柄)。不同程序和模式获取方式不同,一般可以通过参数传递、AfxGetMainWnd等MFC函数获取、全局变量、共享内存等方式获取,第一种最简单,其它的各有要求。获取指针后GetSafeHandle可以获取句柄,然后SendMessage即可。

如何解决mfc子窗口移动时对主窗口的不断刷新
用“双缓冲 内存DC”应该可以解决这个问题。你不止是移动窗口吧,最小化之后最大化也应该会出现这个问题。在初始化的时候将内存DC创建好,线程只是对内存DC进行绘制,同时,在绘制速度调节的时候还应该控制内存DC对设备DC的刷新。百度上面双引号内容,介绍和代码比较丰富,就不复制了。

mfc创建一个死循环线程时。对话框会被占用。刚点到对话框编辑控件上...
因为如果工作和界面合用同一个线程的话,一个函数(例如上面的某个事件处理程序)工作量很大,很长时间都运行不完的话会一直占用界面线程,界面会一直是卡死的,不能操作,自然也就没法点击第二个按钮。

vc mfc怎样在创建进程时把它的stdout重定向到我的编辑框里
那你得自己封装一个函数,这个函数的功能就是输出到编辑框,然后在线程中需要输出的时候调用这个函数即可,比如在创建进程时候调用

如何解决mfc子窗口移动时对主窗口的不断刷新
用“双缓冲 内存DC”应该可以解决这个问题。你不止是移动窗口吧,最小化之后最大化也应该会出现这个问题。在初始化的时候将内存DC创建好,线程只是对内存DC进行绘制,同时,在绘制速度调节的时候还应该控制内存DC对设备DC的刷新。百度上面双引号内容,介绍和代码比较丰富,就不复制了。

我在用mfc,现在有主窗口和子窗口,子窗口是domodal方式弹出来的,线程...
::SetForegroundWindow(hwnd);使用这个函数,参数是你那个子窗口的句柄,在每次MessageBox后你要手动写代码,使子窗口处于被激活状态,就是获得焦点。

MFC在其他线程中刷新一个对话框中的EDIT BOX的数据
\/\/把this指针传递给线程函数 AfxBeginThread(TestThreadFun, this);然后,在线程处理函数里面来更新EditBox::方法一:直接修改,代码:UINT TestThreadFun( LPVOID pParam ){ \/\/假设你的对话框类叫CMFCTestDlg \/\/把参数传过来的this指针转换成对话框类指针 \/\/然后就可以直接访问类成员了 \/\/当然EditBox...

QT中想在子线程中创建对话窗口怎么建
我做网络传输文件程序使用TCP异步传输文件数据希望传输候显示进度显示窗体(像Windows Explorer文件复制框) 现都完进度条窗体设计差显示进度条窗体由于异步TCP使用线程进行操作其线程函数创建窗体象并显示进度条窗体总处于忙状态控件都显示即再用单独线程呈现窗体行~~ 办 建工程候选dialog工程MFC创建线程函数...

这算是MFC 多线程 吗?
不是多线程。你的四个窗口对象都在主线程中,都用一个消息队列。不信你在一个button处理的最后加上while(1);死循环看看,这个时候所有的窗口都死了。如果要在新的线程中创建窗口,可以看看用户界面线程。

相似回答