找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: Hellow

[公告]:给大家看一个可自动隐藏的停靠面板

[复制链接]
发表于 2005-4-24 10:27:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
但是如果你是用CXTPDockingPane创建的面板如何产生消息映射呢?一般使用XTP的停靠都要实现如下的消息映射的:
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ON_WM_CREATE()
    //}}AFX_MSG_MAP
    ON_MESSAGE(XTPWM_DOCKINGPANE_NOTIFY, OnDockingPaneNotify)
END_MESSAGE_MAP()

LRESULT CMainFrame::OnDockingPaneNotify(WPARAM wParam, LPARAM lParam)
没有这个框架你如何实现消息映射;
我的做法是:
CXTPDockingPaneManager m_paneManager;
m_paneManager.InstallDockingPanes(CMainFrame指针);
m_paneManager.CreatePane()得到CXTPDockingPane指针;然后用这个指针创建停靠面板,但是没有这个框架窗口你如何办呢?

另外你说到的:
2、响应面板管理器窗口的WM_CREATE消息,在此消息内先让CWnd进行处理,之后创建XTP面板管理器,并调用响应函数将XTP面板管理器安装在CAD主窗体上,并设置XTP面板管理器的拥有者为面板管理器窗口(否则收不到通告消息)。接下来就创建好所有的面板及面板内置元素。
3、在面板管理器窗口拦截来自于面板管理器的通告(创建面板、显示面板、隐藏面板、销毁面板等)并进行处理。这些处理可做成独立的回调过程。

CXTPDockingPaneManager只是一个单独的一个类,我们只是定义了一个实例,但是你如何响应这个面板管理器窗口的WM_CREATE消息!
谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2005-4-24 10:43:32 | 显示全部楼层
用向导生成过工具条吗?它里面有一个消息处理器窗口(默认名称为CArxMsgHandler),这个窗口是一个最小化的、CAD子窗口,所有消息映射可在它里面作,而且它一般都是动态创建的,在里面可直接处理OnCreate等消息;所有内置元素均以此窗口为父窗口就可以收到消息并处理之。(这就是MFC消息机制:消息自顶至底的沿窗口的父子关系发送,直至被处理)。
用这个方法可完成常规的消息映射。若不想创建这个窗口,也可以,但要收到消息,必须采用钩子进行截取/转发特定的消息到特定的窗口。因为此时无窗口父子关系,收不到了。
而且还要注意一点,面板管理器安装的对象必须是CFrameWnd,但消息映射的对象可以和他不一样,只要能收到/处理就可以了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-24 11:11:16 | 显示全部楼层
呵呵,谢了,说到了关键的地方,我就是想知道这个,不过现在不是很清楚你的意思,
ARX里你创建了这个CArxMsgHandler,然后它会在
void UnloadApplication()
DestroyArxMsgHandler () ;

void InitApplication()
CreateArxMsgHandler () ;
再者之后,你又如何处理WM_CREATE消息呢!我只是想知道你如何使用这个CArxMsgHandler类,谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-24 11:37:31 | 显示全部楼层
在CArxMsgHandler里重写OnWndMsg函数不就可以了吗?可以同时产生WM_CREATE、WM_DESTROY、XTPWM_DOCKINGPANE_NOTIFY这些重要消息的回调。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-24 12:20:02 | 显示全部楼层
重写了virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
可是拦截不了XTPWM_DOCKINGPANE_NOTIFY这些消息,是不是要在创建CXTPDockingpaneManager里用SetOwner(这里参数填什么),
谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-24 14:15:15 | 显示全部楼层
对,应设置面板管理器的拥有者为CArxMsgHandler的那个窗口对象。按照MFC规则,消息发给CWnd对象的拥有者,而不是父窗口,只不过一般情况下/缺省情况下,父窗口和拥有者一样。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-24 14:48:46 | 显示全部楼层
讨论的比较具体,令我茅塞顿开啊,我以前的做法都是首先创建一个CAcUiDockCtronlBar,再在这个上面创建一个CFrameWnd,然后进行一系列操做,和你那个有点不同,但实现的功能是一样的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-24 16:12:05 | 显示全部楼层
设置了消息所有者,还是不能正确收到:
CXTPDockingPaneManager* GetDockingPaneManager()
{
return &m_paneManager;
}

CArxMsgHandler *pMsgHand=GetArxMsgHandler();


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
GetDockingPaneManager()->InstallDockingPanes(this);
GetDockingPaneManager()->SetTheme(xtpPaneThemeOffice);
GetDockingPaneManager()->SetOwner(pMsgHand);
}
以上代码错误在那里,还请指点,谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-25 19:17:15 | 显示全部楼层
怎么能将停靠面板安装到你自己的CMainFrame上呢?应该安装在CAD的主窗体上(acedGetAcadFrameWnd)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-25 19:33:36 | 显示全部楼层
CXTPDockingPaneManager m_paneManager;

void InitApplication()
{
        extern CArxMsgHandler *pgArxMsgHandler;
        // NOTE: DO NOT edit the following lines.
        //{{AFX_ARX_INIT
       
        CreateArxMsgHandler () ;
    m_paneManager.InstallDockingPanes(acedGetAcadFrame());
        m_paneManager.SetTheme(xtpPaneThemeGrippered);
        m_paneManager.SetOwner(GetArxMsgHandler ()->GetSafeOwner());
        // Create docking panes.
        CXTPDockingPane* pwndPane1 = m_paneManager.CreatePane(
                IDR_PANE_OPTIONS, CRect(0, 0,200, 120), dockLeftOf);
       
        //}}AFX_ARX_INIT

        // TODO: add your initialization functions

}

LRESULT CArxMsgHandler::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
        // TODO: Add your specialized code here and/or call the base class
        if(message==XTPWM_DOCKINGPANE_NOTIFY)acutPrintf("xt message comming!\n");
        return CWnd::WindowProc(message, wParam, lParam);
}





我已经做了这样的试验了,还是不能收到消息,请指点!
另外用CJ609界面库(当时你说是不可以做出停靠的窗口)但是清华大学(北京艾克斯特)用CJ609已经做出停靠的窗体,效果并不比XTP差,想请一下你现在知道如何实现了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-25 20:13:27 | 显示全部楼层
青蛙跳井,不懂!
说的我都累了,算了,给你看看我的接口类CPaneHook,以他为基类重写里面的三个函数就可以了;再看懂我也没办法了。
[PHP]
#ifndef __PANEMANAGER_H__
#define __PANEMANAGER_H__

// XTP面板体系与主系统挂接基础类
class CPaneHook: public CWnd
{
protected:
        CPaneHook();
        virtual ~CPaneHook(){ unInstall(); }
        void _Install();
        void unInstall();
public:
        BOOL Install(CFrameWnd *pTarget);//安装面板到主系统框架

protected:
        virtual BOOL OnWndMsg(UINT message,WPARAM wParam,LPARAM lParam,LRESULT* pResult);

protected:
        virtual void OnCreatePane()                 { return; }//缺省创建面板过程实现,在派生类中重写
        virtual void OnDestroyPane()                { return; }//缺省销毁面板过程实现,在派生类中重写
        virtual LRESULT OnPaneNotify(WPARAM,LPARAM) { return 0; }//缺省面板通告回调实现,由消息处理转换形成,在派生类中重写

protected:
        CXTPDockingPaneManager* m_paneManager;//停靠面板管理器

private:
        CFrameWnd*              m_pTarget;    //主窗口指针
        BOOL                    m_bInstalled; //是否已安装
};

__inline CPaneHook::CPaneManager()
{
        m_paneManager = NULL;
        m_pTarget     = NULL;
        m_bInstalled  = FALSE;
}

__inline BOOL CPaneHook::Install(CFrameWnd *pTarget)
{
        if(m_bInstalled || pTarget==NULL || !IsWindow(pTarget->GetSafeHwnd()))
                return FALSE;
        m_pTarget=pTarget;
        return TRUE;
}

__inline void CPaneHook::_Install()
{
        if(m_pTarget==NULL)
                return;

        m_paneManager=new CXTPDockingPaneManager;
        m_paneManager->InstallDockingPanes(m_pTarget);
        OnCreatePane();//调用面板创建过程
    m_paneManager->SetOwner(this);
        m_bInstalled=TRUE;
}

__inline void CPaneHook::unInstall()
{
        if(!m_bInstalled)
                return;

        CWnd *pParent=m_paneManager->GetParent();
        if(pParent!=NULL && IsWindow(pParent->GetSafeHwnd()))
                m_paneManager->SetOwner(pParent);

        OnDestroyPane();//调用面板销毁过程
        m_paneManager->DestroyAll();
        m_paneManager->DestroyWindow();
        delete m_paneManager;
        m_paneManager=NULL;
        m_pTarget=NULL;
        m_bInstalled=FALSE;
}

__inline BOOL CPaneHook::OnWndMsg(UINT message,WPARAM wParam,LPARAM lParam,LRESULT *pResult)
{
        if(message==WM_CREATE)
        {
                BOOL bOk=CWnd::OnWndMsg(message,wParam,lParam,pResult);
                if(!bOk)//继续创建过程
            _Install();
                return bOk;
        }
        else if(message==WM_DESTROY)
                unInstall();
        else if(message==XTPWM_DOCKINGPANE_NOTIFY)
        {               
                if(OnPaneNotify(wParam,lParam))//调用面板通告处理函数
                        return TRUE;
        }
        return CWnd::OnWndMsg(message,wParam,lParam,pResult);
}

#endif
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-25 21:39:31 | 显示全部楼层
还是不行,用你提供的这个类,连面板都显示不出来,消息还是不能接收到,就只能接收到WM_CREATE,不能收到XTP的消息,我看是XTP不知道发消息去那个窗体去了!
能留下你的msn 或者QQ吗?谢!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-25 22:31:57 | 显示全部楼层
算了,实在是讲不通了,不也不知你是怎么做的?我提供的这个类是基类,通用构造,使用时必须派生自己的类(看到基类里面的虚函数了吗),我觉得讲的很清楚了,而且这东西本身并不是很高深的东西。我的信箱lab_zj@163.com,把你做的发过来我看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-26 07:48:44 | 显示全部楼层
邮件代码巳发出,谢帮忙检查!
谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2005-4-27 15:11:10 | 显示全部楼层
???????
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-4 16:41 , Processed in 0.461184 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表