MTMDI 示例:演示 MFC 用户界面线程
更新:2007 年 11 月
MTMDI 示例阐释 MFC 用户界面线程,其中用户界面事件在一个独立于主应用程序线程的线程中被处理。此示例是单线程 MDI 示例经过修改的版本。
MTMDI 没有就如何将弹跳的球窗口放在一个单独的线程中给出充分的解释。在单处理器计算机上用户看不出 MDI 和 MTMDI 示例之间的差别。即使在多处理器计算机上,如果球的运动是基于窗口计时器的,用户也看不出此差别。
但 MTMDI 确实阐释了实现 MFC 用户界面线程的方法。比较 MDI 和 MTMDI 示例的源代码,研究与使用 MFC 用户界面线程相关的编程系统开销。
MTMDI 中的编程系统开销是一个预兆,需有充足的理由证明编程成本的合理性,才应使用用户界面线程。在 MFC 中常用得多的线程类型是 MTRECALC 示例中阐释的辅助线程。
安全说明: |
---|
提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。 |
获取示例和安装示例的说明:
在 Visual Studio 的“帮助”菜单上,单击“示例”。
有关更多信息,请参见定位示例文件。
示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。
还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。
生成并运行示例
生成并运行 MTMDI 示例
打开解决方案 MtMdi.sln。
在“生成”菜单中单击“生成”。
在“调试”菜单中,单击“开始执行(不调试)”。
可以使用“File”菜单创建两种不同类型的新窗口。创建了窗口后,应用程序将允许使用下列菜单之一中的命令来更改窗口中各项的属性:“Color”、“Speed”、“Window”和“Help”。注意“Hello!”窗口没有“Speed”菜单。
MTMDI 利用自己的 CWinThread 派生类(称为 CBounceThread)。CBounceThread 在 Mtbounce.cpp 文件中实现。该线程包含弹跳的球窗口在使窗口中的球产生动画效果时所需的所有绘画和执行时间代码。
在创建 MDI 子窗口的同时,应用程序随之创建每个线程。这发生在位于 Bounce.cpp 中的 CBounceMDIChildWnd::Create 函数中。该函数同时创建窗口和线程,并使线程与窗口关联。
每当关闭弹跳窗口时,关联线程都自动销毁。“Hello!”窗口没有自己的线程;它们的消息由应用程序的主线程处理。
关键字
此示例说明以下关键字:
AfxGetInstanceHandle;AfxMessageBox;AfxRegisterWndClass;CBitmap::CreateCompatibleBitmap;CCmdTarget::OnCmdMsg;CCmdUI::SetCheck;CColorDialog::DoModal;CColorDialog::GetColor;CDC::BitBlt;CDC::CreateCompatibleDC;CDC::DeleteDC;CDC::DrawText;CDC::Ellipse;CDC::FillRect;CDC::GetDeviceCaps;CDC::SelectObject;CDC::SetBkColor;CDC::SetTextColor;CFrameWnd::LoadFrame;CFrameWnd::rectDefault;CGdiObject::DeleteObject;CMDIChildWnd::Create;CMenu::LoadMenu;CRect::Height;CRect::Width;CWinApp::ExitInstance;CWinApp::InitInstance;CWnd::Create;CWnd::DestroyWindow;CWnd::GetClientRect;CWnd::GetCurrentMessage;CWnd::GetDC;CWnd::GetDlgItem;CWnd::GetWindow;CWnd::Invalidate;CWnd::KillTimer;CWnd::MessageBox;CWnd::OnCreate;CWnd::OnDestroy;CWnd::OnLButtonDown;CWnd::OnPaint;CWnd::OnSize;CWnd::OnTimer;CWnd::ReleaseDC;CWnd::SendMessage;CWnd::SetTimer;CWnd::SetWindowPos;CWnd::ShowWindow;CWnd::UpdateWindow;CloseHandle;CreateEvent;CreateThread;EnumChildWindows;GetSysColor;GetVersion;LOWORD;LoadCursor;LoadIcon;LoadMenu;MAKEINTRESOURCE;RGB;SetEvent;Sleep;WaitForSingleObject;max;min
说明: |
---|
某些示例(如此示例)尚未经过修改以反映 Visual C++ 向导、库和编译器中所做的更改,但仍演示了如何完成所需的任务。 |