lafe @ ウィキ
DonutTabView
最終更新:
lafe
-
view
CTabViewImplのMovePage
消すのももったいないので
消すのももったいないので
// nMovePageは移動するタブのインデックス、nInsertBeforePageは移動先のタブのインデックス
bool MoveTab(int nMovePage, int nInsertBeforePage)
{
ATLASSERT(IsValidPageIndex(nMovePage));
ATLASSERT(IsValidPageIndex(nInsertBeforePage));
if(!IsValidPageIndex(nMovePage) || !IsValidPageIndex(nInsertBeforePage)) {
return false;
}
if(nMovePage == nInsertBeforePage) {
return true; // nothing to do
}
CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1);
if(lpstrTabText == NULL)
return false;
TCITEMEXTRA tcix = { 0 };
tcix.tciheader.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM;
tcix.tciheader.pszText = lpstrTabText;
tcix.tciheader.cchTextMax = m_cchTabTextLength + 1;
BOOL bRet = m_tab.GetItem(nMovePage, tcix);
ATLASSERT(bRet != FALSE);
if(bRet == FALSE)
return false;
/* 移動先にタブを挿入する処理 */
// 移動先のインデックスが移動するタブのインデックスより大きい場合
// (タブが右に移動された場合)
// 移動先のインデックス + 1の場所にアイテムを挿入する
// (挿入されたアイテムは保持、移動するタブのアイテムは削除するようにする)
int nInsertItem = (nInsertBeforePage > nMovePage) ? nInsertBeforePage + 1 : nInsertBeforePage;
int nNewItem = m_tab.InsertItem(nInsertItem, tcix);
ATLASSERT(nNewItem == nInsertItem);
if(nNewItem != nInsertItem)
{
// タブに追加失敗
ATLVERIFY(m_tab.DeleteItem(nNewItem));
return false;
}
/* 移動元のアイテムを削除する処理 */
// 移動するタブのインデックスが移動先のインデックスより大きい場合
// (タブが左に移動された場合)
if(nMovePage > nInsertBeforePage) {
ATLVERIFY(m_tab.DeleteItem(nMovePage + 1) != FALSE);
} else if(nMovePage < nInsertBeforePage) {
// タブが右に移動されたので移動元のアイテムのインデックスは変化しない
ATLVERIFY(m_tab.DeleteItem(nMovePage) != FALSE);
}
// SetActivePage(nInsertBeforePage);
// OnPageActivated(m_nActivePage);
return true;
}