昨天搞了很久,当一个CMFCPropertyGridCtrl的属性改变时,如何得到这个改变。查MSDN有个OnPropertyChanged方法,由MFC框架调用,然后查源码,在afxpropertygridctrl.cpp中找到OnPropertyChanged方法,其中有一句GetOwner()->SendMessage(AFX_WM_PROPERTY_CHANGED, GetDlgCtrlID(), LPARAM(pProp));原来这个方法会发送个消息,然后由用户处理。于是疯狂的在CMFCPropertyGridCtrl中添加这个消息(然后必须是各种不行),完全接收不到。今天再过来静下心看,突然发现昨天漏个很重要的东西,GetOwner(),于是测GetOwner()返回的是什么,原来是CDockablePane,然后再CDockablePane中响应这个消息,果然就行了。
但是为什么呢?MFC为什么不让CMFCPropertyGridCtrl自己处理这个消息呢?万一我的Ctrl不在Pane上怎么办?再查MSDN。
MSDN上并没有说Ctrl一定要在Pane中。于是我理解为,Ctrl是个控件,他的父窗口,也就是GetOwner得到的窗口来处理他产生的消息(与其他的控件一样)。这样想就明白了。
另外AFX_WM_PROPERTY_CHANGED是注册消息,要ON_REGISTER_MESSAGE(AFX_WM_PROPERTY_CHANGED, function)来消息响应。