[ ページコメント(0) ] [ トラックバック(0) ]
Counter: 1637,
today: 2,
yesterday: 6
CDockBarを継承する
ツールバーなどのコントロールバーが ドッキング時にサイズ変更したりするのには、 CDockBarが使用されています。 CDockBarはWM_SIZEPARENTのメッセージを受けて OnSizeParentを実行しているのですが、 これがPreTranslateMessage関数などを使用しても 改造することができません。 これを改造するためには まずCDockBarを継承したクラスを作成することが必要です。 ところがCDockBarはVC.NETでは何故か継承候補として選べません。 ですのでとりあえずCControlBarを継承し、 手書きでクラスをCDockBarに置き換えれば大丈夫です。 以下の感じになります。
// ExtDockBar.cpp
#include "ExtDockBar.h"
IMPLEMENT_DYNAMIC(CExtDockBar, CDockBar)
CExtDockBar::CExtDockBar()
{
}
CExtDockBar::~CExtDockBar()
{
}
BEGIN_MESSAGE_MAP(CExtDockBar, CDockBar)
ON_MESSAGE(WM_SIZEPARENT, OnSizeParent)
END_MESSAGE_MAP()
// CExtDockBar メッセージ ハンドラ
void CExtDockBar::OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL /*bDisableIfNoHndler*/)
{
}
LRESULT CExtDockBar::OnSizeParent(WPARAM wParam, LPARAM lParam)
{
if( theApp.m_pMainWnd && theApp.m_pMainWnd->m_hWnd && theApp.m_pMainWnd->IsIconic() )
{
theApp.m_pMainWnd->OpenIcon();
}
return CDockBar::OnSizeParent( wParam, lParam );
}
// CExtDockBar
#pragma once
class CExtDockBar : public CDockBar
{
DECLARE_DYNAMIC(CExtDockBar)
public:
CExtDockBar();
virtual ~CExtDockBar();
virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
protected:
//{{AFX_MSG(CExtDockBar)
afx_msg LRESULT OnSizeParent(WPARAM, LPARAM);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
で、クラスを作るだけではしょうがないので、 CDockBarをCExtDockBarに置き換えるために、 デフォルトでCDockBarを作成している場所を改造します。 EnableDocking関数を最初に使用していると思いますが、 この関数の代わりにExtEnableDocking関数を作って そちらを使用するようにします。
void CMainFrame::ExtEnableDocking(DWORD dwDockStyle)
{
// must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);
m_pFloatingFrameClass = RUNTIME_CLASS(CMiniDockFrameWnd);
for (int i = 0; i < 4; i++)
{
if (dwDockBarMap[i][1] & dwDockStyle & CBRS_ALIGN_ANY)
{
CDockBar* pDock = (CDockBar*)GetControlBar(dwDockBarMap[i][0]);
if (pDock == NULL)
{
CExtDockBar *pExtDock = new CExtDockBar;
if (!pExtDock->Create(this,
WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |
dwDockBarMap[i][1], dwDockBarMap[i][0]))
{
AfxThrowResourceException();
}
}
}
}
}
これで継承完了です。 好きに改造することができます。 改造すると言っても一体何ができるんだと思いますが… 自分はoleサーバーをアイコン化してから Wordに貼り付けてあるオブジェクトをダブルクリックすると oleサーバーが開かれた時にツールバーなどの位置が バラバラになってしまうのでなおしてほしいという要望を受け やむなくMFCを睨みました。 これもわりに合わない作業…
付箋の編集