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

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

 2008-01-19 20:25:19 来源:WEB开发网   
核心提示:对话框中控件的UI Updating对话框中的的UI updating控制比MFC中简单得多,在MFC中,MFC程序员WTL指南(6)高级对话框用户界面类(9),你需要响应未公开的WM_KICKIDLE消息,处理这个消息并触发控件的updating,ControlMania2的对话框是非模式的,类定义的开始部分很像是一

对话框中控件的UI Updating

对话框中的的UI updating控制比MFC中简单得多,在MFC中,你需要响应未公开的WM_KICKIDLE消息,处理这个消息并触发控件的updating,在WTL中,没有这个诡计,不过向导存在一个BUG,需要手工添加一行代码解决这个问题。

首先需要记住的是对话框必须是无模式的,因为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);

上一页  4 5 6 7 8 9 10 11  下一页

Tags:MFC 程序员 WTL

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