找回密码
 注册
搜索
查看: 776|回复: 0

用VC创建程序启动画面

[复制链接]
发表于 2010-7-27 00:18:54 | 显示全部楼层 |阅读模式
  最近由于项目需要,要在VC环境下做一个启动界面。当时拿到这个任务我想的是直接AfxBeginThread一下就行了,后来发现没这么简单。要解决这个问题首先需要了解以下知识点。

  一 MFC将线程分为工作线程和用户界面线程。听名字就应该知道他们的区别在于用途不同,用户界面是用来创建界面并负责和用户交互的而工作线程则是负责处理后台的计算。从技术上讲,用户界面线程具有消息循环能处理消息,而工作线程则不行。

  二 线程直接的信息交互可以通过PostThreadMessage来解决。

  那么如何创建用户界面线程呢?

  1 首先创建你自己的对话框类。

  2 创建用户界面线程类,注意这个类必须继承自CWinThread类,同时以对话框类为成员变量。

  3 用以下语句创建线程:

  CWinThread *pThread = AfxBeginThread(RUNTIME_CLASS(用户界面线程类名));

  4 重写函数InitInstance,在里面创建对话框类。

  BOOL CSplashThread::InitInstance()

  {

  // TODO:  perform and per-thread initialization here

  m_splashDlg.Create(IDD_SPLASHDLG_DIALOG);

  m_splashDlg.ShowWindow(SW_SHOW);

  m_pMainWnd = &m_splashDlg;

  return TRUE;

  }

  5 用以下语句发送消息给用户界面线程。

  ::PostThreadMessage(pThread->m_nThreadID,WM_SPLASH_NOTIFY,0,0);

  其声明如下:

  BOOL   PostThreadMessage

  (

  DWORD   idThread, //   thread   identifier

  UINT   Msg, //   message   to   post

  WPARAM  wParam, //   first   message   parameter

  LPARAM   lParam   //   second   message   parameter

  );

  6 在用户界面线程类中重载PreTranslateMessage函数:

  BOOL用户界面线程类名::PreTranslateMessage(MSG* pMsg)

  {

  // TODO: Add your specialized code here and/or call the base class

  if(pMsg->message == WM_SPLASH_NOTIFY)

  {

  在这里处理消息

  }

  return CWinThread::PreTranslateMessage(pMsg);

  }

  以上便是用户界面线程的创建的整个过程。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|QQ客服|联系我们|Archiver|手机版|小黑屋|悉远网络 ( 鄂ICP备09013446号 )

GMT+8, 2024-11-23 17:50 , Processed in 0.031404 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表