本人用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'请高手赐教,谢谢!

解决方案 »

  1.   

    还有一点需要说明的是当单元格双击的时候,我通过class CCellEdit : public CWindowImpl<CCellEdit> 
    ...
          CCellEdit::CCellEdit(...) {
               ..
               Create(hwndGrid, *rect, NULL, dwStyle);
               SetParaent(hwndGrid);
          }
    }
    的方式动态创建了一个Edit输入控件,在Edit的OnKillFocus事件中做回写数据处理,在这里可能需要比较长的运行时间.