本人用ATL编写了一个Grid控件(从头做起的一个表格控件)class ATL_NO_VTABLE CGrid :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CGrid, &CLSID_Grid>,
public CComControl<CGrid>,
public IOleControlImpl<CGrid>,
public IOleObjectImpl<CGrid>,
public IOleInPlaceActiveObjectImpl<CGrid>,
public IViewObjectExImpl<CGrid>,
... DECLARE_REGISTRY_RESOURCEID(IDR_GRID)
DECLARE_NOT_AGGREGATABLE(CGrid)
...
};在运行过程发现一个问题,但表格的单元格上的一个编辑框失去焦点后回写数据到表格时,内部调用了一个方法,这个方法可能需要很长的时间,而这个时候,这个表格控件居然还能正常响应键盘鼠标的其他的事件,也就是说能正常的在表格中移动焦点等操作。按理说,当控件在响应一个事件并长时间处理的时候,应该不会响应其他事件才对呀?为什么会出现这种情况?难道是线程模型的问题?在grid.rgs中的定义如下:
...
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
ForceRemove 'Control'请高手赐教,谢谢!
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CGrid, &CLSID_Grid>,
public CComControl<CGrid>,
public IOleControlImpl<CGrid>,
public IOleObjectImpl<CGrid>,
public IOleInPlaceActiveObjectImpl<CGrid>,
public IViewObjectExImpl<CGrid>,
... DECLARE_REGISTRY_RESOURCEID(IDR_GRID)
DECLARE_NOT_AGGREGATABLE(CGrid)
...
};在运行过程发现一个问题,但表格的单元格上的一个编辑框失去焦点后回写数据到表格时,内部调用了一个方法,这个方法可能需要很长的时间,而这个时候,这个表格控件居然还能正常响应键盘鼠标的其他的事件,也就是说能正常的在表格中移动焦点等操作。按理说,当控件在响应一个事件并长时间处理的时候,应该不会响应其他事件才对呀?为什么会出现这种情况?难道是线程模型的问题?在grid.rgs中的定义如下:
...
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
ForceRemove 'Control'请高手赐教,谢谢!
...
CCellEdit::CCellEdit(...) {
..
Create(hwndGrid, *rect, NULL, dwStyle);
SetParaent(hwndGrid);
}
}
的方式动态创建了一个Edit输入控件,在Edit的OnKillFocus事件中做回写数据处理,在这里可能需要比较长的运行时间.