WEB开发网
开发学院软件开发VC MFC程序员的WTL指南(6)高级对话框用户界面类 阅读

MFC程序员的WTL指南(6)高级对话框用户界面类

 2006-07-22 22:03:25 来源:WEB开发网   
核心提示: 首先需要记住的是对话框必须是无模式的,因为CUpdateUI需要在程序的消息循环控制下工作,MFC程序员的WTL指南(6)高级对话框用户界面类(10),如果对话框是模式的,系统处理消息循环,而是调用UIAddChildWindowContainer(),它告诉CUpdateUI我们的对话框

首先需要记住的是对话框必须是无模式的,因为CUpdateUI需要在程序的消息循环控制下工作。如果对话框是模式的,系统处理消息循环,我们程序的空闲处理函数就不会被调用,由于CUpdateUI是在空闲时间工作的,所以没有空闲处理就没有UI updating。

ControlMania2的对话框是非模式的,类定义的开始部分很像是一个框架窗口类:

class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>,
         public CMessageFilter, public CIdleHandler
{
public:
  enum { IDD = IDD_MAINDLG };
  virtual BOOL PreTranslateMessage(MSG* pMsg);
  virtual BOOL OnIdle();
  BEGIN_MSG_MAP_EX(CMainDlg)
    MSG_WM_INITDIALOG(OnInitDialog)
    COMMAND_ID_HANDLER_EX(IDOK, OnOK)
    COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
    COMMAND_ID_HANDLER_EX(IDC_ALYSON_BTN, OnAlysonODBtn)
  END_MSG_MAP()
  BEGIN_UPDATE_UI_MAP(CMainDlg)
  END_UPDATE_UI_MAP()
//...
};

注意CMainDlg类从CUpdateUI派生并含有一个update UI链。OnInitDialog()做了这些工作,这和前面介绍的框架窗口中的代码很相似:

// register object for message filtering and idle updates
  CMessageLoop* pLoop = _Module.GetMessageLoop();
  ATLASSERT(pLoop != NULL);
  pLoop->AddMessageFilter(this);
  pLoop->AddIdleHandler(this);
  UIAddChildWindowContainer(m_hWnd);

只是这次我们不是调用UIAddToolbar()或UIAddStatusBar(),而是调用UIAddChildWindowContainer(),它告诉CUpdateUI我们的对话框含有需要updating的字窗口,只要看看OnIdle(),你会怀疑少了写什么:

上一页  5 6 7 8 9 10 

Tags:MFC 程序员 WTL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接