问题描述:
需要一个系统管理页面,为此写了个dll,调用产生系统管理对话框,
系统管理对话框中使用TabCtrl产生标签页,
每个标签页又绑定一个子对话框,
在系统管理对话框类初始化TabCtrl对象时,用:
子对话框类对象.Create(IDD_子对话框, GetDlgItem(IDC_TabCtrl));
//或:子对话框类对象.Create(子对话框类::IDD, &TabCtrl对象);
绑定子对话框对象和TabCtrl对象时,子对话框对象==NULL
问题解决:
在Create前加一句AFX_MANAGE_STATE(AfxGetStaticModuleState());
,如
AFX_MANAGE_STATE(AfxGetStaticModuleState());
子对话框类对象.Create(IDD_子对话框, GetDlgItem(IDC_TabCtrl));
问题原因:
在dll外调用时,需要指定让dll里的界面代码使用该dll的资源(Resource.h)
MFC的对话框装载资源是通过获取当前线程对应的ModuleState保存的ResourceHandler来装载资源的。
所以,dll里的代码,需要在函数的入口,首先把当前执行线程的ModuleState换成该dll的State,这样才能装载该dll的资源!
否则会因为找不到资源导致新建对话框句柄为NULL