タグ:プログラミング ( 2 ) タグの人気記事

e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

MFC の CTreeView(CTreeCtrl)のチェックボックスで、上の階層や下の階層のチェックの制御

ツリーのアイテムをチェックすると、下の階層を全部チェックして、上の階層もルートまでのパスをチェックする。

チェックを外すと、下の階層を全部アンチェックして、上の階層の下の階層のチェックが全部消えていれば、チェックを外す。

という処理。

static void CheckChild(CTreeCtrl* pTree, HTREEITEM hParent, BOOL bCheck)
{
    HTREEITEM hItem = pTree->GetChildItem( hParent );
    while ( hItem != NULL )
    {
        pTree->SetCheck( hItem, bCheck );
        CheckChild(pTree, hItem, bCheck);
        hItem = pTree->GetNextItem( hItem, TVGN_NEXT );
    }
}

static bool IsAnyChildChecked(CTreeCtrl* pTree, HTREEITEM hParent)
{
    HTREEITEM hItem = pTree->GetChildItem( hParent );
    while ( hItem != NULL )
    {
        if(pTree->GetCheck(hItem) || IsAnyChildChecked(pTree, hItem))
        {
            return true;
        }
        hItem = pTree->GetNextItem( hItem, TVGN_NEXT );
    }
    return false;
}

static void CheckParent(CTreeCtrl* pTree, HTREEITEM hChild, BOOL bCheck)
{
    HTREEITEM hParent = pTree->GetParentItem(hChild);
    if(hParent == NULL) return;
    if(bCheck)
    {
        pTree->SetCheck(hParent, bCheck);
        CheckParent(pTree, hParent, bCheck);
    }
    else
    {
        if(!IsAnyChildChecked(pTree, hParent))
        {
            pTree->SetCheck(hParent, bCheck);
            CheckParent(pTree, hParent, bCheck);
        }
    }
}

void CXxxxTreeView::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO : ここにコントロール通知ハンドラ コードを追加します。
    NMTREEVIEW *pNMTree = ( NMTREEVIEW* )pNMHDR;
    TVHITTESTINFO ht = { 0 };
    CTreeCtrl* pTree = &GetTreeCtrl();
    DWORD pos = ::GetMessagePos();
    ht.pt.x = LOWORD( pos );
    ht.pt.y = HIWORD( pos );
    ::MapWindowPoints( HWND_DESKTOP, pNMHDR->hwndFrom, &ht.pt, 1 );
    pTree->HitTest( &ht );

    if ( TVHT_ONITEMSTATEICON & ht.flags )
    {
        // チェックが入る時→チェックが入っていない状態
        if ( !pTree->GetCheck( ht.hItem ) )
        {
            pTree->SetCheck(ht.hItem, TRUE);
            CheckChild(pTree, ht.hItem, TRUE);
            CheckParent(pTree, ht.hItem, TRUE);
            pTree->SetCheck(ht.hItem, FALSE);
        }
        else
        {
            pTree->SetCheck(ht.hItem, FALSE);
            CheckChild(pTree, ht.hItem, FALSE);
            CheckParent(pTree, ht.hItem, FALSE);
            pTree->SetCheck(ht.hItem, TRUE);
        }
    }
    *pResult = 0;
}

[PR]
by isoq | 2009-12-18 21:02 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

閏年の判定のアルゴリズム

閏年は、4で割り切れ、100で割り切れるものを抜かし、それでも400で割り切れるものは含めたもの。コードにすると、以下の通り。

bool bLeap = (nYear%4==0) && ((nYear%100!=0) || (nYear%400==0))

ちなみに、その月の最大の日にちは、以下のように求められる。

int nYear = 2004; // 年を入れる
int nMonth = 5; // 月を入れる

bool bLeap = (nYear%4==0) && ((nYear%100!=0) || (nYear%400==0))
int maxDay;
switch(nMonth)
{
case 2:
maxDay = bLeap ? 29 : 28;
break;
case 4:
case 6:
case 9:
case 11:
maxDay = 30;
break;
default:
maxDay = 31;
}
[PR]
by isoq | 2004-06-28 20:11 | 開発日記
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇