社区
控件与界面
帖子详情
多线程中InitInstance()中怎样创建界面?
wdf2
2000-08-20 09:05:00
请给例子。是用非模对话框 ? MDI子窗体 ?
...全文
244
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
我还建立了相应的资源并在
InitInstance
中
添加了新的文档模板。但是,当我试图运行该程序时,出现了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 重载
InitInstance
()函数(必须重载),与ExitInstance(可选重载)函数 (类
中
...
控件与界面
604
社区成员
12,293
社区内容
发帖
与我相关
我的任务
控件与界面
PowerBuilder 控件与界面
复制链接
扫一扫
分享
社区描述
PowerBuilder 控件与界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章