星期一, 八月 28, 2006

WTL中的界面元素自动更新(UI updating)

CUpdateUI是WTL中的重要工具之一。界面元素更新的更新是多个类协同工作的结果,其中包括CMessageLoop,CIdleHandler。

通过CUpdateUI实现UI需要满足一下四个条件:

1. 主窗口继承CUpdateUI和CIdleHandler
2. 在主窗口中添加UPDATE_UI_MAP宏 参见CUpdateUI的定义
3. 将主窗口添加到空闲处理队列
4. 将主窗口的消息链入CUpdateUI

第2个步骤需要在主窗口中增加UPDATE_UI_MAP,并将要自动更新的界面元素通过UPDATE_ELEMENT加以定义。

第3个步骤只首先要实现virtual BOOL OnIdle()就可以了,例如
virtual BOOL OnIdle()
{
return FALSE;
}
int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
CMessageLoop theLoop;
_Module.AddMessageLoop(&theLoop);
下面的过程是可选的(具体原因还需要进一步考证):
然后在初始化过程(WM_INITDIALOG或WM_CREATE)中注册本窗口到CAppModule的消息处理和空闲处理过程
CMessageLoop* pLoop = _Module.GetMessageLoop();
ATLASSERT(pLoop != NULL);
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);



第4个步骤要在消息映射宏BEGIN_MSG_MAP中添加到CUpdateUI的消息链映射
CHAIN_MSG_MAP(CUpdateUI)

支持的自动更新的元素包括
UPDUI_MENUPOPUP 弹出式菜单的菜单项
UPDUI_MENUBAR 顶级菜单项(菜单条)
UPDUI_CHILDWINDOW 子窗口(如对话框中的控件)
UPDUI_TOOLBAR 工具条按钮,
UPDUI_STATUSBAR 状态条的格子
界面元素的类型可以通过 位或运算(|) 来组合

CUpdateUI可以更新的状态包括
Enable状态
UPDUI_ENABLED 启用
UPDUI_DISABLED 禁用
Check状态
UPDUI_CHECKED
UPDUI_CHECKED2
UPDUI_RADIO
菜单项的默认状态
UPDUI_DEFAULT
设置WindowText
UPDUI_TEXT

CUpdateUI的设定UI状态的方法
BOOL UIEnable(int nID, BOOL bEnable, BOOL bForceUpdate = FALSE)
BOOL UISetCheck(int nID, int nCheck, BOOL bForceUpdate = FALSE)
BOOL UISetCheck(int nID, bool bCheck, BOOL bForceUpdate = FALSE)
BOOL UISetRadio(int nID, BOOL bRadio, BOOL bForceUpdate = FALSE)
BOOL UISetText(int nID, LPCTSTR lpstrText, BOOL bForceUpdate = FALSE)
BOOL UISetDefault(int nID, BOOL bDefault, BOOL bForceUpdate = FALSE)

没有评论: