关于在DLL中创建以主程序MainFram为父窗口的浮动窗口(浮空窗口是基类为CDockablePane的属性页窗口) HWND* 还用指针?直接用HWND做参数 好兼容64位系统 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CWndpreant2 ->DockPane(m_pWndProperties )你注释掉看看断言还会不会触发。格式太乱,窗口对象太多,从你提供的错误来看,感觉是一个panel被dock了两遍,第二遍断言失败了。 注释掉也不行还是那个错误, if(!m_pWndProperties ->Create(strPropertiesWnd,CWndpreant2 ,CRect(0,0,200,200),TURE,ID_VIEW_PROPERTIESWND,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDR EN|CBRS_FLOAT_MULTI|CBRS_RIGHT))到这就出错了下面的都没执行到 上面代码没用格式 ,中间也有打错的地方 我用格式重发一遍这是我在主程序中调用DLL的代码:BOOL CClientIsTOCOMAPP::InitInstance(){ //如果一个运行在 Windows XP 上的应用程序清单指定要 //使用ComCtl32.dll 版本 6或 更高版本来启用可视化方式, //则需要 Ini他CommonControlsEx()。否则,将无法创建窗口。 INITXOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); ........... //创建并调用接口 CFramWndEx* pMainFrame = (CFramWndEx*)AfxGetMainWnd; HWND id = pMainFrame->GetSafeHwnd(); LONG Frameid = (LONG)id; if( m_pFlowcharIntface != NULL) { delete m_pFlowcharIntface; m_pFlowchartIntface = NULL; } m_pFlowchartIntface = new CMyFlowchartIntface; m_pFlowchartIntface ->CreateDispatch(_T("MyFilwchartCOM.MyFlowchartInface")); LONG hwndID = m_pFlowchartIntface ->COMCreateView(Frameid); return TURE;}在DLL中的接口函数中的创建代码如下: LONG MyFlowchartIntFace::COMCreateView(LONG FramID) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HWND m_SZHwnd = (HWND)FramID; CFramWndEx* pMyView->m_pWndProperties = new CPropertiesWnd(); BOOL bNameValid; CString strPropertiesWnd; bNameValid = strPropertiesWnd.LoadString(IDS_PROPERTIES_WND); ASSERT(bNameValib); ASSERT(::IsWindow(m_SZHwnd )); CWnd * CWndPreant = CWnd::FromHandle(m_SZHwnd ); CFrameWndEx* CWndpreant2 = (CFrameWndEx*)CWndPreat; if(!m_pWndProperties ->Create(strPropertiesWnd,CWndpreant2 ,CRect(0,0,200,200),TURE,ID_VIEW_PROPERTIESWND,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDR EN|CBRS_FLOAT_MULTI|CBRS_RIGHT)) { TRACRO("未能创建“属性”窗口\n"); return FALSE; } m_pWndProperties ->EnableDocking(CBRS_ALIGN_ANY); CWndpreant2 ->DockPane(m_pWndProperties ); m_pWndProperties ->show(TRUE,TRUE,TRUE);}编译没有错误运行时出现断言错误出错位置在CMFCDragFrameImpl::Init() ENSURE(m_pDockManager != NULL), 断点跟进去好像是传进去的句柄在判断的时候判断不是框架类不能设置停靠,在CWnd* PASCAL CWnd::FromHandle(HWND hWnd)中的CWnd* pWnd = (CWnd*)pMap->FromHandle(hWnd);中没有置成框架类指针高手帮帮忙!!!! 抱歉,开始没有仔细看,你这个问题原因基本上明确了,因为CFrameWndEx类内部没有实现CDockingManager类,有两种解决方法:①继承CFrameWndEx类,实现CDockingManager,可以参照CMDIChildWndEx的源码②将CFrameWndEx类换成CMDIChildWndEx类。BOOL CMDIChildWndEx::PreCreateWindow(CREATESTRUCT& cs){ m_dockManager.Create(this); return CMDIChildWnd::PreCreateWindow(cs);} 抱歉,开始没有仔细看,你这个问题原因基本上明确了,因为CFrameWndEx类内部没有实现CDockingManager类,有两种解决方法:①继承CFrameWndEx类,实现CDockingManager,可以参照CMDIChildWndEx的源码②将CFrameWndEx类换成CMDIChildWndEx类。BOOL CMDIChildWndEx::PreCreateWindow(CREATESTRUCT& cs){ m_dockManager.Create(this); return CMDIChildWnd::PreCreateWindow(cs);}我的客户端程序是SDI的程序啊,CFrameWndEx只是Mainfram的基类,将CFrameWndEx类换成CMDIChildWndEx类有几个本来的成员函数就用不了了啊,再说我之前在以CFrameWndEx为基类的Mainfram中创建浮动窗口也没有问题啊。 这个问题还没有解决,希望 blueln 在帮我看看 抱歉,开始没有仔细看,你这个问题原因基本上明确了,因为CFrameWndEx类内部没有实现CDockingManager类,有两种解决方法:①继承CFrameWndEx类,实现CDockingManager,可以参照CMDIChildWndEx的源码②将CFrameWndEx类换成CMDIChildWndEx类。BOOL CMDIChildWndEx::PreCreateWindow(CREATESTRUCT& cs){ m_dockManager.Create(this); return CMDIChildWnd::PreCreateWindow(cs);}我的浮动窗口是属性页形式的,创建在主程序的框架上 如图: 抱歉,开始没有仔细看,你这个问题原因基本上明确了,因为CFrameWndEx类内部没有实现CDockingManager类,有两种解决方法:①继承CFrameWndEx类,实现CDockingManager,可以参照CMDIChildWndEx的源码②将CFrameWndEx类换成CMDIChildWndEx类。BOOL CMDIChildWndEx::PreCreateWindow(CREATESTRUCT& cs){ m_dockManager.Create(this); return CMDIChildWnd::PreCreateWindow(cs);}我的浮动窗口是属性页形式的,创建在主程序的框架上 如图:这种的该怎么办啊,你说的因为CFrameWndEx类内部没有实现CDockingManager类,但是我在主程序中用派生于CFrameWndEx的CMainFrame的指针为父窗口就可以创建成功啊。 这个问题我也没有解决,现在是在DLL中又见了个单文档,以DLL中单文档的框架类为父窗口创建的 关于OnTimer进入问题 list view 中如何获取列的数量 不同界面间(相关界面)的重复代码问题 求知识:关于socket客服务同机的问题 永不言败!“软肋”何以软了? 这是怎么了? #pragma comment这样的关键字表示什么? API函数READFILE调用的问题 大家能否帮我看一下这段小代码 不知是不是CScrollView的bug啊? vc2008 unicode项目下,有utf-8编码的网站抓取网页内容,转成unicode始终乱码 socket 接收不定数组
你注释掉看看断言还会不会触发。
格式太乱,窗口对象太多,从你提供的错误来看,感觉是一个panel被dock了两遍,第二遍断言失败了。
if(!m_pWndProperties ->Create(strPropertiesWnd,CWndpreant2 ,CRect(0,0,200,200),TURE,ID_VIEW_PROPERTIESWND,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDR EN|CBRS_FLOAT_MULTI|CBRS_RIGHT))到这就出错了下面的都没执行到
{
//如果一个运行在 Windows XP 上的应用程序清单指定要
//使用ComCtl32.dll 版本 6或 更高版本来启用可视化方式,
//则需要 Ini他CommonControlsEx()。否则,将无法创建窗口。
INITXOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
...........
//创建并调用接口
CFramWndEx* pMainFrame = (CFramWndEx*)AfxGetMainWnd;
HWND id = pMainFrame->GetSafeHwnd();
LONG Frameid = (LONG)id;
if( m_pFlowcharIntface != NULL)
{
delete m_pFlowcharIntface;
m_pFlowchartIntface = NULL;
}
m_pFlowchartIntface = new CMyFlowchartIntface;
m_pFlowchartIntface ->CreateDispatch(_T("MyFilwchartCOM.MyFlowchartInface"));
LONG hwndID = m_pFlowchartIntface ->COMCreateView(Frameid);
return TURE;
}
在DLL中的接口函数中的创建代码如下:
LONG MyFlowchartIntFace::COMCreateView(LONG FramID)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); HWND m_SZHwnd = (HWND)FramID;
CFramWndEx* pMyView->m_pWndProperties = new CPropertiesWnd();
BOOL bNameValid;
CString strPropertiesWnd;
bNameValid = strPropertiesWnd.LoadString(IDS_PROPERTIES_WND);
ASSERT(bNameValib);
ASSERT(::IsWindow(m_SZHwnd ));
CWnd * CWndPreant = CWnd::FromHandle(m_SZHwnd );
CFrameWndEx* CWndpreant2 = (CFrameWndEx*)CWndPreat; if(!m_pWndProperties ->Create(strPropertiesWnd,CWndpreant2 ,CRect(0,0,200,200),TURE,ID_VIEW_PROPERTIESWND,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDR EN|CBRS_FLOAT_MULTI|CBRS_RIGHT))
{
TRACRO("未能创建“属性”窗口\n");
return FALSE;
}
m_pWndProperties ->EnableDocking(CBRS_ALIGN_ANY);
CWndpreant2 ->DockPane(m_pWndProperties );
m_pWndProperties ->show(TRUE,TRUE,TRUE);
}
编译没有错误运行时出现断言错误出错位置在CMFCDragFrameImpl::Init() ENSURE(m_pDockManager != NULL), 断点跟进去好像是传进去的句柄在判断的时候判断不是框架类不能设置停靠,在CWnd* PASCAL CWnd::FromHandle(HWND hWnd)中的CWnd* pWnd = (CWnd*)pMap->FromHandle(hWnd);中没有置成框架类指针
高手帮帮忙!!!!
抱歉,开始没有仔细看,你这个问题原因基本上明确了,因为CFrameWndEx类内部没有实现CDockingManager类,有两种解决方法:①继承CFrameWndEx类,实现CDockingManager,可以参照CMDIChildWndEx的源码②将CFrameWndEx类换成CMDIChildWndEx类。BOOL CMDIChildWndEx::PreCreateWindow(CREATESTRUCT& cs)
{
m_dockManager.Create(this);
return CMDIChildWnd::PreCreateWindow(cs);
}
抱歉,开始没有仔细看,你这个问题原因基本上明确了,因为CFrameWndEx类内部没有实现CDockingManager类,有两种解决方法:①继承CFrameWndEx类,实现CDockingManager,可以参照CMDIChildWndEx的源码②将CFrameWndEx类换成CMDIChildWndEx类。BOOL CMDIChildWndEx::PreCreateWindow(CREATESTRUCT& cs)
{
m_dockManager.Create(this);
return CMDIChildWnd::PreCreateWindow(cs);
}我的客户端程序是SDI的程序啊,CFrameWndEx只是Mainfram的基类,将CFrameWndEx类换成CMDIChildWndEx类有几个本来的成员函数就用不了了啊,再说我之前在以CFrameWndEx为基类的Mainfram中创建浮动窗口也没有问题啊。
抱歉,开始没有仔细看,你这个问题原因基本上明确了,因为CFrameWndEx类内部没有实现CDockingManager类,有两种解决方法:①继承CFrameWndEx类,实现CDockingManager,可以参照CMDIChildWndEx的源码②将CFrameWndEx类换成CMDIChildWndEx类。BOOL CMDIChildWndEx::PreCreateWindow(CREATESTRUCT& cs)
{
m_dockManager.Create(this);
return CMDIChildWnd::PreCreateWindow(cs);
}
我的浮动窗口是属性页形式的,创建在主程序的框架上 如图:
抱歉,开始没有仔细看,你这个问题原因基本上明确了,因为CFrameWndEx类内部没有实现CDockingManager类,有两种解决方法:①继承CFrameWndEx类,实现CDockingManager,可以参照CMDIChildWndEx的源码②将CFrameWndEx类换成CMDIChildWndEx类。BOOL CMDIChildWndEx::PreCreateWindow(CREATESTRUCT& cs)
{
m_dockManager.Create(this);
return CMDIChildWnd::PreCreateWindow(cs);
}
我的浮动窗口是属性页形式的,创建在主程序的框架上 如图:这种的该怎么办啊,你说的因为CFrameWndEx类内部没有实现CDockingManager类,但是我在主程序中用派生于CFrameWndEx的CMainFrame的指针为父窗口就可以创建成功啊。