社区
控件与界面
帖子详情
多线程中InitInstance()中怎样创建界面?
wdf2
2000-08-20 09:05:00
请给例子。是用非模对话框 ? MDI子窗体 ?
...全文
235
6
打赏
收藏
多线程中InitInstance()中怎样创建界面?
请给例子。是用非模对话框 ? MDI子窗体 ?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wdf2
2000-08-22
打赏
举报
回复
UI 线程最常用的UI是何类型,给出代码例子,不就完了 !
谢谢 !
wdf2
2000-08-22
打赏
举报
回复
Holly大侠:
最常用的UI线程是否就是非模式对话框 ? 使用MDI的子窗体中的childframe或formview行吗?
若有例子最好 !
我的另一贴子“怎样在 CMDIMainFrame 的客户区创建 CEdit 控件 ?” 请您继续支持,
明天一并给分(共 150).
谢谢。
Holly
2000-08-22
打赏
举报
回复
对话框的例子!
先以你的程序的AboutDlg为例:
在你的CAboutDlg中重载OnOK和OnCancel函数,添加对PostQuitMessage()的调用;
(当然如此改动之后,原来在App中的调用就应当注释,不过只是试验,没关系)
新建一个类CDlgThread,继承CWinThread;
声明成员变量:
CAboutDlg m_DlgThread;
在CDlgThread::InitInstance()中添加:
m_dlgAbout.Create(CAboutDlg::IDD);
m_pMainWnd = &m_dlgAbout;
m_dlgAbout.ShowWindow(SW_SHOW);
m_dlgAbout.UpdateWindow();
建立一个菜单用来专门创建线程,我暂且借用ID_FILE_OPEN那么代码如下:
void C*App::OnFileOpen()
{
CDlgThread dlgThread;
if (dlgThread.InitInstance())
{
dlgThread.Run();
}
}
此时你每点击文件打开一次,就出现一个About对话框;
Holly
2000-08-21
打赏
举报
回复
你问这样的问题,是不知道UI线程的真正原理!
例子我懒得给,因为实在简单,而且与你用非模式对话框和MDI框架窗口无关!
你可以随便建立一个MFC的应用程序,然后新建一个继承CWinThread的类,在该类的InitInstance()中把MFC缺省的产生的主程序中的::InitInstance中有关窗口初始化的代码拷贝过来MDI和SDI程序通常如下:
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
pMainFrame->UpdateWindow();
将你继承的类在需要的地方声明(比如:在主程序中声明成员变量m_UIThread)
在你希望启动的地方添加:
if(m_UIThread.InitInstance())
{
m_UIThread.Run();
}
你会看到什么?
出现了两个程序界面!
当然这时的程序是有问题的,因为缺省的线程类的Run()函数调用了OnIdle,如果你不作处理,会导致关闭窗口时出现断言错误!不会当机!简单的处理是重载Run()函数,将OnIdle的调用加以修改或干脆去掉!
还有程序的文档模板没有在线程中加入,所以有关文档的处理会怪怪的到主程序中去!当然没必要处理这些问题,你不会用这样的处理方式。
我主要是想让你知道;
UI线程和工作线程实际上是一样的,如果你在工作线程中循环调用GetMessage(),TranslateMessage(),DispatchMessage()进行消息的分发处理的话,跟UI线程就一样了;
实际上,从Windows SDK的角度上来说,是没有区别的,都是一个循环;
如果你愿意,你可以将MFC生成的框架程序中的::InitInstance()中的全部代码删掉,然后用一个一定退出条件的循环替代,程序就变成了纯粹的工作进程;
只有一点提醒你注意的是,如果你仔细跟踪CDialog::DoModal()的代码你就知道,实际上它就是自己在循环取消息处理,所以模式对话框不能简单的象上述那样拷贝,因为它阻塞了线程的消息循环自己处理因此要另外处理,方法我就不举例了等你理解了UI线程的原理自然就知道如何处理了;
如果还不明白,继续问!
Holly
2000-08-21
打赏
举报
回复
首先我需要质疑你的需求,为何要如此,你要知道MFC的消息映射表是线程局部存储的,按照你的说法,似乎想要跨线程使用。
wdf2
2000-08-21
打赏
举报
回复
给您又加了25分,谢谢 !
请给出 1.非模式对话框 2.pDocTemplate->OpenDocumentFile(NULL); 即调用主线程中
多文档模板生成子窗体 来形成多线程的例子.
我买了一本书,它UI线程部分未讲清,不想再买新书了。 请支持.
VC++常用的共用函数100多页
◆在调试
中
怎么样MESSAGEBOX一个数字◆ 16 ◆如何控制控件的焦点◆ 16 ◆如何对析构函数
中
对象进行释放◆ 16 ◆如何关闭一个模态窗口◆ 17 ◆如何将一个提示的声音发到声卡上◆ 17 ◆如何得到打开exe的带的参数◆ 17...
VC++ 专家指导.doc
我还建立了相应的资源并在
Init
Instance
中
添加了新的文档模板。但是,当我试图运行该程序时,出现了Assertion信息。为什么? 71 (95) 我在一对话框
中
有一列表框,我需要tabbed列表框
中
的项目。但是,当我处理含有tab...
VC++常用功能实例
◆在调试
中
怎么样MESSAGEBOX一个数字◆ 16 ◆如何控制控件的焦点◆ 16 ◆如何对析构函数
中
对象进行释放◆ 16 ◆如何关闭一个模态窗口◆ 17 ◆如何将一个提示的声音发到声卡上◆ 17 ◆如何得到打开exe的带的参数◆ 17...
Visual.C#2010从入门到精通
14.3.4
多线程
实例 295 14.4 MFC的线程处理 301 14.4.1 线程的
创建
与终止 302 14.4.2 线程的消息循环 304 14.5 线程同步 305 14.5.1 同步对象 306 14.5.2 多个同步对象的应用 311 14.6 小结 314 第三篇 数据库编程 ...
基于win32的
多线程
编程04:
界面
线程的
创建
步骤以及在
界面
线程
中
创建
模态对话框和非模态对话框
界面
线程的
创建
步骤和以及在
界面
线程
中
创建
模态对话框和非模态对话框
界面
线程的
创建
从CWinThread类派生自己的子类:如,CUIThreadApp 重载
Init
Instance
()函数(必须重载),与Exit
Instance
(可选重载)函数 (类
中
...
控件与界面
604
社区成员
12,293
社区内容
发帖
与我相关
我的任务
控件与界面
PowerBuilder 控件与界面
复制链接
扫一扫
分享
社区描述
PowerBuilder 控件与界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章