多线程中InitInstance()中怎样创建界面?

wdf2 2000-08-20 09:05:00

请给例子。是用非模对话框 ? MDI子窗体 ?

...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用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线程部分未讲清,不想再买新书了。 请支持.

604

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 控件与界面
社区管理员
  • 控件与界面社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧