• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 132  文章 - 51  trackbacks - 0
            <2012年7月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(7)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            cocos2d-x

            OGRE

            OPenGL

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            1.UI文件保存的設計缺陷
               我們生成.UI文件來保存我們生成的控件數據,下面是UI結構設計圖



            這樣的設計有缺陷:
                  以前UI控件最大數量定CONTROLS_COUNT_MAX= 64,因為m_ControlsType為固定數組,一旦控件數量超出64,我們就需要將以前的.UI文件轉換為現在的UI文件進行版本兼容,而我們又不能具體確定好我們的控件上限是多少,每次版本兼容進行的轉換相當麻煩...
             改進:設為容器,根據控件數量,動態讀取保存到.UI文件中

            struct S_UIData
            {
                
            struct S_UIHead
                
            {
                    S_UIHead()
                    
            {
                        memset( m_szVer, 
            0sizeof(m_szVer) );
                        m_nControlsType.resize( CONTROLS_COUNT_MAX );
                        memset( 
            &m_nControlsType[0], 0sizeof(m_nControlsType) );
                        strcpy( m_szVer, UI_VER);
                        m_nControlsCount 
            = 0;
                        m_dwCreatedDate 
            = 0;
                    }

                    
            ~S_UIHead()
                    
            {
                        m_nControlsType.clear();
                    }


                    
            char        m_szVer[10];
                    DWORD        m_dwCreatedDate;
                    S_FrameData    m_stFrameData;
                    
            int            m_nControlsCount;
                    
            //int            m_nControlsType[CONTROLS_COUNT_MAX];
                    vector<int>    m_nControlsType;
                }
            ;

                S_UIData();
                
            ~S_UIData();
                
            void Release();
                DWORD LoadOldFile( 
            const char* pszFileName );
                DWORD LoadFile( 
            const char* pszFileName );
                DWORD SaveFile( 
            const char* pszFileName );
                
            static S_BaseData* NewData( int nType );

                S_UIHead    m_stHead;
                
            //S_BaseData    *m_pstControlData[CONTROLS_COUNT_MAX];
                vector< S_BaseData* > m_pstControlData;
            }
            ;


            這個樣子,以后我們即使控件不夠用了,只需要更改一下上限CONTROLS_COUNT_MAX就OK,但是.UI文件我們卻不需要做版本轉換,因為.UI中的數據都是根據控件數量來讀取保存的 eg.10個控件,讀取10個類型和控件數據。

            DWORD S_UIData::LoadFile( const char* pszFileName )
            {
                guard(S_UIData::LoadFile);
                assert( pszFileName );
                assert( pszFileName[
            0!= 0 );

                FILE 
            *fp = fopen(pszFileName, "rb" );
                
            if ( fp )
                
            {
                    
            forint n=0; n<CONTROLS_COUNT_MAX; n++ )
                    
            {
                        
            if ( m_pstControlData[n] )
                        
            {
                            delete m_pstControlData[n];
                            m_pstControlData[n] 
            = NULL;
                        }

                    }


                    fread( 
            &m_stHead.m_szVer, sizeof(m_stHead.m_szVer), 1, fp );
                    fread( 
            &m_stHead.m_dwCreatedDate, sizeof( DWORD ) , 1, fp );
                    fread( 
            &m_stHead.m_stFrameData, sizeof( S_FrameData ) , 1, fp );
                    fread( 
            &m_stHead.m_nControlsCount, sizeofint ) , 1, fp );
                    fread( 
            &m_stHead.m_nControlsType[0],sizeof(int)*m_stHead.m_nControlsCount,1,fp);
                    
            //fread( &m_stHead, sizeof(m_stHead), 1, fp );

                    
            if ( strcmp( m_stHead.m_szVer, UI_VER ) != 0 )
                    
            {
                        fclose(fp);
                        MessageBox( NULL, 
            "讀取的*.UI文件版本不一樣!""失敗", MB_OK );
                        
            return 0;
                    }


                    assert( m_stHead.m_nControlsCount 
            < CONTROLS_COUNT_MAX );

                    
            forint n=0; n<m_stHead.m_nControlsCount; n++ )
                    
            {
                        m_pstControlData[n] 
            = NewData( m_stHead.m_nControlsType[n] );
                        
            switch( m_stHead.m_nControlsType[n] )
                        
            {
                        
            case Type_Button:
                            fread( m_pstControlData[n], 
            sizeof(S_ButtonData), 1, fp );
                            
            break;
                        
            case Type_CheckBox:
                            fread( m_pstControlData[n], 
            sizeof(S_CheckBoxData), 1, fp );
                            
            break;
                        
            case Type_Edit:
                            fread( m_pstControlData[n], 
            sizeof(S_EditData), 1, fp );
                            
            break;
                        
            case Type_Text:
                            fread( m_pstControlData[n], 
            sizeof(S_TextData), 1, fp );
                            
            break;
                        
            case Type_List:
                            fread( m_pstControlData[n], 
            sizeof(S_ListData), 1, fp );
                            
            break;
                        
            case Type_ListImg:
                            fread( m_pstControlData[n], 
            sizeof(S_ListImgData), 1, fp );
                            
            break;
                        
            case Type_ScrollBar:
                            fread( m_pstControlData[n], 
            sizeof(S_ScrollBarData), 1, fp );
                            
            break;
                        
            case Type_ScrollBarEx:
                            fread( m_pstControlData[n], 
            sizeof(S_ScrollBarExData), 1, fp );
                            
            break;
                        
            case Type_ComboBox:
                            fread( m_pstControlData[n], 
            sizeof(S_ComboBoxData), 1, fp );
                            
            break;
                        
            case Type_Picture:
                            fread( m_pstControlData[n], 
            sizeof(S_PictureData), 1, fp );
                            
            break;
                        
            case Type_Progress:
                            fread( m_pstControlData[n], 
            sizeof(S_ProgressData), 1, fp );
                            
            break;
                        
            case Type_Tab:
                            fread( m_pstControlData[n], 
            sizeof(S_TabData), 1, fp );
                            
            break;
                        
            case Type_ListEx:
                            fread( m_pstControlData[n], 
            sizeof(S_ListExData), 1, fp );
                            
            break;
                        
            default:
                            assert( 
            false );
                            
            break;
                        }

                    }


                    fclose(fp);
                    
            return m_stHead.m_dwCreatedDate;
                }

                
            return 0;
                unguard;
            }


            DWORD S_UIData::SaveFile( 
            const char* pszFileName )
            {
                
            //time_t osBinaryTime;  // C run-time time (defined in <time.h>)
                
            //time( &osBinaryTime );
                
            //m_stHead.m_dwCreatedDate = (DWORD)osBinaryTime;
                assert( pszFileName );
                
            //
                DWORD dwVer = 0;
                
            forint n=0; n<m_stHead.m_nControlsCount; n++ )
                
            {
                    
            int nIdLength = strlen(m_pstControlData[n]->m_szID);
                    assert( nIdLength 
            > 0 );
                    
            forint i=0; i<nIdLength; i++ )
                    
            {
                        dwVer 
            += m_pstControlData[n]->m_szID[i];
                    }

                }

                dwVer 
            = dwVer*m_stHead.m_nControlsCount + 1;
                m_stHead.m_dwCreatedDate 
            = dwVer;

                FILE 
            *fp = fopen( pszFileName, "w+b" );
                
            if ( fp )
                
            {
                    fwrite( &m_stHead.m_szVer, sizeof(m_stHead.m_szVer), 1, fp );
                    fwrite( &m_stHead.m_dwCreatedDate, sizeof( m_stHead.m_dwCreatedDate ) , 1, fp );
                    fwrite( &m_stHead.m_stFrameData, sizeof( m_stHead.m_stFrameData ) , 1, fp );
                    fwrite( &m_stHead.m_nControlsCount, sizeof( m_stHead.m_nControlsCount ) , 1, fp );

                    //fwrite( &m_stHead, 
                    //    sizeof(m_stHead.m_szVer)+sizeof(m_stHead.m_dwCreatedDate)+sizeof(m_stHead.m_stFrameData)+sizeof(m_stHead.m_nControlsCount),
                    //    1, fp );
                  
                     //按容器中的空間數量進行讀取
                    fwrite( &m_stHead.m_nControlsType[0],sizeof(int)*m_stHead.m_nControlsCount, 1, fp );
                    

                    for( int n=0; n<m_stHead.m_nControlsCount; n++ )
                    {
                        switch( m_stHead.m_nControlsType[n] )
                        {
                        case Type_Button:
                            SAVE_CONTROL( S_ButtonData );
                            break;
                        case Type_CheckBox:
                            SAVE_CONTROL( S_CheckBoxData );
                            break;
                        case Type_Edit:
                            SAVE_CONTROL( S_EditData );
                            break;
                        case Type_Text:
                            SAVE_CONTROL( S_TextData );
                            break;
                        case Type_List:
                            SAVE_CONTROL( S_ListData );
                            break;
                        case Type_ListImg:
                            SAVE_CONTROL( S_ListImgData );
                            break;
                        case Type_ScrollBar:
                            SAVE_CONTROL( S_ScrollBarData );
                            break;
                        case Type_ScrollBarEx:
                            SAVE_CONTROL( S_ScrollBarExData );
                            break;
                        case Type_ComboBox:
                            SAVE_CONTROL( S_ComboBoxData );
                            break;
                        case Type_Picture:
                            SAVE_CONTROL( S_PictureData );
                            break;
                        case Type_Progress:
                            SAVE_CONTROL( S_ProgressData );
                            break;
                        case Type_Tab:
                            SAVE_CONTROL( S_TabData );
                            break;
                        case Type_ListEx:
                            SAVE_CONTROL( S_ListExData );
                            break;
                        default:
                            assert(false);
                            break;
                        }
                    }
                    fclose(fp);
                    return dwVer;
                }
                
            return 0;
            }


            最后需要注意的就是 字節對齊 問題

            ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

            2.UI整體設計思路 

             設計思路:我們游戲中的UI常劃分為常見UI模塊,如Friend面板,Property面板,Pack面板,Pet面板等等.
             每個模塊中的單個UI也處理消息,渲染...
             我們創建一個UIMgr來管理這些大的UI模塊(即UIFrame),每個UIFrame來管理大模塊中的單個小UI控件
             然后在應用程序中分別調用UIMgr來處理
             
             一句話:app管理UIMgr,UIMgr管理UIFrame, UIFrame管理單個UI控件(UI_Object)
             
             
             我們的應用程序擁有主要函數:
             virtual HRESULT FrameMove(); //更新
             virtual HRESULT Render();  //渲染
             virtual LRESULT MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
             
             分別調用 theUIMgr.FrameMove(), theUIMgr.Render(), theUIMgr().MsgProc(...)
             
             theUIMgr是一個UIFrame的容器  vector<UIFrame*> vecFrame;
             
             內部調用UIFrame的消息處理
             for( int i = 0; i < vecFrame.size(); i++ )
             vecFrame[i]->FrameMove();
             vecFrame[i]->Render();
             vecFrame[i]->OnMouseMove(...);
             vecFrame[i]->OnLButtonDown(...);
             
             vecFrame[i]->MsgProc(...);
             

             
            UIFrame是單個UI控件的容器 vector<UI_Object*> m_vecChild;
             
             for( int i = 0; i < m_vecChild.size(); i++ )
             m_vecChild[i]->FrameMove();
             ....
             m_vecChild[i]->Render();
             ....
             m_vecChild[i]->OnMouseMove(...);
             

            所有的UI消息都能夠處理了,所有處理要依據先后關系,如一個面板消息被一個UI處理后,那么要返回true,
            其他的UI將不會重復處理


            問題是我們會將我們的UI做成一個UI 靜態庫,那么我們按鈕按下觸發的功能,無法提前設置好,
            解決方法: 設置回調函數
            eg:
             CHR_UI_Frame下的回調函數接口
             typedef bool (*funOnClick)( OUT CHR_UI_Object* pSender );
             typedef bool (*funOnRBtnDown)( OUT CHR_UI_Object* pSender );
             typedef bool (*funRun)(void);
             typedef bool (*funRender)(void);
             
             CHR_UI_Edit下的回調函數指針
             typedef void (*funOnEnter)( OUT CHR_UI_Object* pSender, OUT const char *szData );
             typedef void (*funOnTab)( OUT CHR_UI_Object* pSender, OUT const char* szData);
             
             CHR_UI_Button下的函數接口
             typedef bool (*funOnButtonClick)( OUT CHR_UI_Object* pSender );
             
             ...
             
             在WM_LBUTTONUP中調用觸發
             if ( m_pFunOnButtonClick )  //函數指針
             {
              if ( m_pFunOnButtonClick( this ) == false )
              {
               if ( m_pFather && strcmp( m_pstData->m_szID, "ID_BUTTON_CLOSE" ) == 0 )
               {
                m_pFather->SetVisable( false );
               }
              }
             }
             
             m_pID_BUTTON_SelectRole.SetButtonClickFunc( ID_BUTTON_SELECTROLEOnButtonDown );
             
               

            posted on 2010-09-03 14:14 風輕云淡 閱讀(563) 評論(0)  編輯 收藏 引用 所屬分類: UI
            久久香综合精品久久伊人| 久久久久久av无码免费看大片| 久久久久久综合一区中文字幕| 中文字幕人妻色偷偷久久| 性高湖久久久久久久久AAAAA| 久久久精品波多野结衣| 久久久久无码中| 久久综合九色综合久99| 欧美久久综合九色综合| 久久久网中文字幕| 亚洲午夜无码AV毛片久久| 色老头网站久久网| 久久综合九色综合网站| 97r久久精品国产99国产精| 亚洲狠狠综合久久| 精品久久综合1区2区3区激情| 精品人妻伦一二三区久久 | 久久久久久久久久久| 久久九九兔免费精品6| 色8久久人人97超碰香蕉987| 久久久久免费看成人影片| 97久久精品无码一区二区天美| 久久精品国产精品青草| 久久有码中文字幕| 久久久久久国产精品免费无码 | 国产精品久久久久久久久久影院| 奇米影视7777久久精品人人爽| 久久综合精品国产二区无码| 亚洲精品高清久久| 亚洲а∨天堂久久精品| 久久国产精品无码一区二区三区 | 无码国内精品久久综合88 | 麻豆成人久久精品二区三区免费 | 97精品久久天干天天天按摩| 四虎国产精品免费久久5151 | 伊人色综合久久天天| 亚洲人成电影网站久久| 久久久精品免费国产四虎| 久久久久人妻一区二区三区| 亚洲国产精品婷婷久久| 人妻精品久久久久中文字幕69|