C언어,ARM

CTabCtrl_CalSize

안녕1999 2020. 9. 26. 23:35
//CTabCtrl_util.cpp
#include "stdafx.h"
#include "CTabCtrl_util.h"

int CTabCtrl_ShowTabPage(CTabCtrl *pCTabCtrl,int i)
{
    int ipre=-1;

    if(pCTabCtrl)
    {
        TCITEM item;
        CWnd *pCWnd;

        item.mask=TCIF_PARAM;
        ipre=pCTabCtrl->GetCurSel();
        if(ipre==i)
        {
            //skip
        }
        else
        {
            if(pCTabCtrl->GetItem(ipre,&item))
            {
                pCWnd=(CWnd*)item.lParam;
                if(pCWnd)
                {
                    pCWnd->ShowWindow(SW_HIDE);
                }
            }
            pCTabCtrl->SetCurSel(i);
            if(pCTabCtrl->GetItem(i,&item))
            {
                pCWnd=(CWnd*)item.lParam;
                if(pCWnd)
                {
                    pCWnd->ShowWindow(SW_SHOW);
                }
            }
        }
    }
    return ipre;
}
CWnd *CTabCtrl_ShowCurSelTabPage(CTabCtrl *pCTabCtrl,int bCmdShow)
{
    CWnd *pCWnd;
    TCITEM ti;
    int CurSel;

    ti.mask=TCIF_PARAM;
    CurSel=pCTabCtrl->GetCurSel();
    pCTabCtrl->GetItem(CurSel,&ti);
    
    pCWnd=(CWnd*)ti.lParam;
    if(pCWnd)
    {
        pCWnd->ShowWindow(SW_SHOW);
    }
    return pCWnd;
}
void *CTabCtrl_GetCurPage(CTabCtrl *pCTabCtrl)
{
    if(pCTabCtrl)
    if(pCTabCtrl->m_hWnd)//20140708
    {
        int i;
        TCITEM item;

        i=pCTabCtrl->GetCurSel();
        item.mask=TCIF_PARAM;
        if(pCTabCtrl->GetItem(i,&item))
        {
            return (void*)(item.lParam);
        }
    }
    return 0;
}
int CTabCtrl_GetTabPageIndex(CTabCtrl *pCTabCtrl,char *title)
{
    if(title)
    if(pCTabCtrl)
    {
        int i;
        int cnt;
        TCITEM item;
        char buf[128];

        //memset(&item,0,sizeof(item));
        item.mask=TCIF_TEXT;
        item.pszText=buf;
        item.cchTextMax=sizeof(buf);
        cnt=pCTabCtrl->GetItemCount();
        for(i=0; i < cnt; i++)
        {
            if(pCTabCtrl->GetItem(i,&item))
            {
                if(item.pszText)
                if(item.pszText[0]==title[0])
                if(strcmp(item.pszText,title)==0)
                {
                    return i;
                }
            }
        }
    }
    return -1;
}
void *CTabCtrl_GetTabPage(CTabCtrl *pCTabCtrl,char *title)
{
    void *pPage=NULL;
    int i;
    
    if(pCTabCtrl)
    {
        i=CTabCtrl_GetTabPageIndex(pCTabCtrl,title);
        if(i!=-1)
        {
            pPage=CTabCtrl_GetTabPage(pCTabCtrl,i);
        }
    }
    return pPage;
}
void *CTabCtrl_GetTabPage(CTabCtrl *pCTabCtrl,int i)
{
    void *pPage=NULL;
    
    if(i!=-1)
    if(pCTabCtrl)
    {
        TCITEM item;
        
        item.mask=TCIF_PARAM;
        if(pCTabCtrl->GetItem(i,&item))
        {
            pPage=(void*)item.lParam;
        }
    }
    return pPage;
}
int CTabCtrl_ShowTabPage(CTabCtrl *pCTabCtrl,char *title)
{
    int i;

    i=CTabCtrl_GetTabPageIndex(pCTabCtrl,title);
    if(i!=-1)
    {
        CTabCtrl_ShowTabPage(pCTabCtrl,i);
    }
    return i;
}
void CTabCtrl_CalSize(CTabCtrl *pCTabCtrl)
{
    if(pCTabCtrl)
    {
        RECT r;

        if(pCTabCtrl->m_hWnd)
        {
                        //set tabctrl size
            CWnd *pCWnd;
            
            pCWnd=(CWnd*)(pCTabCtrl->GetParent());
            void SetWindowSizeNoMoveFit(HWND hwnd_parent,HWND hwnd_control,int right,int bottom);
            SetWindowSizeNoMoveFit(pCWnd->m_hWnd,pCTabCtrl->m_hWnd,0,0);
                        ::GetClientRect(pCTabCtrl->m_hWnd,&r);
            pCTabCtrl->AdjustRect(0,&r);
                        TCITEM item;
            //CWnd *pCWnd;
            int i;

            item.mask=TCIF_PARAM;
            i=0;
            while(pCTabCtrl->GetItem(i,&item))
            {
                pCWnd=(CWnd*)item.lParam;
                if(pCWnd)
                {
                    pCWnd->MoveWindow(&r);
                }
                i++;
            }
        }
    }
}
//tab컨트롤 안의 윈도우를 tab컨트롤 크기에 맞게 조정한다.
void CTabCtrl_SizeFitClient(CTabCtrl *pCTabCtrl)
{
    if(pCTabCtrl)
    {
        RECT r;

        if(pCTabCtrl->m_hWnd)
        {
            TCITEM item;
            CWnd *pCWnd;
            int i;

            ::GetClientRect(pCTabCtrl->m_hWnd,&r);
            pCTabCtrl->AdjustRect(0,&r);    //tab 사이즈 빼고 실질적인 클라이언트 영역
            item.mask=TCIF_PARAM;
            i=0;
            while(pCTabCtrl->GetItem(i,&item))
            {
                pCWnd=(CWnd*)item.lParam;
                if(pCWnd)
                {
                    pCWnd->MoveWindow(&r);
                }
                i++;
            }
        }
    }
}
void CTabCtrl_CalSize(CTabCtrl *pCTabCtrl,int i)
{
    if(pCTabCtrl)
    {
        RECT r;

        if(pCTabCtrl->m_hWnd)
        {
            TCITEM item;
            CWnd *pCWnd;
            
            pCTabCtrl->GetClientRect(&r);
            pCTabCtrl->AdjustRect(0,&r);
            item.mask=TCIF_PARAM;
            if(pCTabCtrl->GetItem(i,&item))
            {
                pCWnd=(CWnd*)item.lParam;
                if(pCWnd)
                {
                    pCWnd->MoveWindow(&r);
                }
            }
        }
    }
}
void CTabCtrl_AddPage(CTabCtrl *pCTabCtrl,CWnd *pCWnd,char *text)
{
    if(pCTabCtrl)
    {
        TCITEM item;
        int cnt;
        
        item.mask=TCIF_TEXT|TCIF_PARAM;
        cnt=pCTabCtrl->GetItemCount();
        item.pszText=text;
        item.lParam=(LPARAM)pCWnd;
        pCTabCtrl->InsertItem(cnt,&item);
        CTabCtrl_CalSize(pCTabCtrl,cnt);
        CTabCtrl_ShowTabPage(pCTabCtrl,cnt);
    }
}
void CTabCtrl_DeletePage(CTabCtrl *pCTabCtrl,
                         int i,
                         void (*delete_func)(void *pDlg),
                         int default_view_page)
{
    if(pCTabCtrl)
    {
        //i=pCTabCtrl->GetCurSel();
        //if(i > 0)
        {
            TCITEM item;CWnd *pCWnd;
            
            item.mask=TCIF_PARAM;
            if(pCTabCtrl->GetItem(i,&item))
            {
                pCWnd=(CWnd*)item.lParam;
                if(pCWnd)
                {
                    pCWnd->ShowWindow(SW_HIDE);
                    pCWnd->CloseWindow();
                    pCWnd->DestroyWindow();
                    if(delete_func)delete_func(pCWnd);
                }
            }
            pCTabCtrl->DeleteItem(i);
            
            if(default_view_page==-1)default_view_page=i-1;
            if(default_view_page==-1)default_view_page=0;
            CTabCtrl_ShowTabPage(pCTabCtrl,default_view_page);
            CTabCtrl_CalSize(pCTabCtrl);
        }
    }
}
void CTabCtrl_DeletePage(CTabCtrl *pCTabCtrl,void *pPage,void (*delete_func)(void *pDlg))
{
    if(pCTabCtrl)
    {
        TCITEM item;
        int i,cnt;

        item.mask=TCIF_PARAM;
        cnt=pCTabCtrl->GetItemCount();
        for(i=0; i < cnt; i++)
        {
            if(pCTabCtrl->GetItem(i,&item))
            if(((void*)item.lParam)==pPage)
            {
                CTabCtrl_DeletePage(pCTabCtrl,i,delete_func);
                break;
            }
        }
    }
}
void CTabCtrl_DeletePageAll(CTabCtrl *pCTabCtrl,void (*delete_func)(void *pDlg))
{
    if(pCTabCtrl)
    {
        TCITEM item;
        int i,cnt;

        item.mask=TCIF_PARAM;
        cnt=pCTabCtrl->GetItemCount();
        for(i=0; i < cnt; i++)
        {
            CTabCtrl_DeletePage(pCTabCtrl,0,delete_func);//20140818 페이지 삭제가 제대로 안되는 문제 수정(메모리누수)
        }
    }
}
void CTabCtrl_DeletePage(CTabCtrl *pCTabCtrl,void *pDlg)
{
    if(pCTabCtrl)
    {
        TCITEM item;
        int i,cnt;

        item.mask=TCIF_PARAM;
        cnt=pCTabCtrl->GetItemCount();
        for(i=0; i < cnt; i++)
        {
            if(pCTabCtrl->GetItem(i,&item))
            if(((void*)item.lParam)==pDlg)
            {
                pCTabCtrl->DeleteItem(i);
                break;
            }
        }
        CTabCtrl_CalSize(pCTabCtrl);
        cnt=pCTabCtrl->GetItemCount();
        if(cnt)
        {
            cnt--;
            CTabCtrl_ShowTabPage(pCTabCtrl,cnt);
        }
    }
}

void CTabCtrl_AddTabDlg(CTabCtrl *pTabCtrl,void *pDlg,char *tabname)
{
    if(pTabCtrl)
    {
        TCITEM item;
        int cnt;

        item.mask=TCIF_TEXT|TCIF_PARAM;
        item.pszText=tabname;
        item.lParam=(LPARAM)pDlg;
        cnt=pTabCtrl->GetItemCount();
        pTabCtrl->InsertItem(cnt,&item);

        //g_Data.m_pTabCtrl->SetCurSel(cnt);
        CTabCtrl_CalSize(pTabCtrl);
        CTabCtrl_ShowTabPage(pTabCtrl,cnt);
    }
}
//실패 : -1
int CTabCtrl_FindTabPage(CTabCtrl *pTabCtrl,void *pDlg)
{
    if(pTabCtrl)
    {
        TCITEM item;
        int cnt;
        int i;

        item.mask=TCIF_PARAM;
        //item.pszText=tabname;
        cnt=pTabCtrl->GetItemCount();
        for(i=0; i < cnt; i++)
        {
            if(pTabCtrl->GetItem(i,&item))
            {
                if((void*)(item.lParam)==pDlg)
                {
                    return i;
                }
            }
        }
    }
    return -1;
}
void CTabCtrl_ChangeTabName(CTabCtrl *pTabCtrl,void *pDlg,char *tabname)
{
    int i;

    i=CTabCtrl_FindTabPage(pTabCtrl,pDlg);
    if(i!=-1)
    {
        TCITEM item;
        
        item.mask=TCIF_TEXT;
        item.pszText=tabname;
        pTabCtrl->SetItem(i,&item);
        CTabCtrl_CalSize(pTabCtrl,i);
        CTabCtrl_ShowTabPage(pTabCtrl,i);
    }
}
char *CTabCtrl_GetTabName(CTabCtrl *pTabCtrl,void *pDlg,char *buf,int len)
{
    int i;

    i=CTabCtrl_FindTabPage(pTabCtrl,pDlg);
    if(i!=-1)
    {
        TCITEM item;
        
        item.mask=TCIF_TEXT;
        item.pszText=buf;
        item.cchTextMax=len;
        pTabCtrl->GetItem(i,&item);
        return item.pszText;
    }
    return NULL;
}