• <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>

            飯中淹的避難所~~~~~

            偶爾來(lái)避難的地方~

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              94 隨筆 :: 0 文章 :: 257 評(píng)論 :: 0 Trackbacks
             1 void InputBox::_SetCaretPos( int iPos )
             2 {
             3     //    將光標(biāo)位置保持在0到文本的總長(zhǎng)度間
             4     int iNewPos = iPos < 0 ? 0 : (iPos > m_strText.length() ? m_strText.length() : iPos);
             5 
             6     //    如果光標(biāo)位置較上一次有所改變
             7     if( iNewPos != m_iCaretCharPos )
             8     {
             9         //    如果新的位置小於上一次光標(biāo)位置
            10         if( iNewPos < m_iCaretCharPos )
            11         {
            12             //    最開(kāi)始左邊界是邊界寬度
            13             int iLeftBorder = BORDER_WIDTH;
            14             //    將光標(biāo)相對(duì)於首字符的顯示位置根據(jù)兩個(gè)位置間的字符的寬度加以調(diào)整
            15             forint i = iNewPos;i < m_iCaretCharPos; ++i )
            16             {
            17                 m_iCaretFirstCharDistance -= m_pFont->GetCharWidth( m_strText.c_str()[i] ) + CHAR_SPACE;
            18             }
            19             //    如果前面仍有字符,就調(diào)整邊界位置
            20             if( iNewPos > 0 )
            21             {
            22                 //    調(diào)整邊界位置
            23                 iLeftBorder += m_pFont->GetCharWidth( m_strText.c_str()[iNewPos-1] ) + CHAR_SPACE;
            24             }
            25             //    光標(biāo)渲染位置超出左邊界,將光標(biāo)移動(dòng)到邊界上
            26             if( m_iCaretFirstCharDistance + m_iFirstCharRenderPosition < iLeftBorder )
            27             {
            28                 m_iFirstCharRenderPosition = iLeftBorder - m_iCaretFirstCharDistance;
            29             }
            30         }
            31         else
            32         {
            33             //    計(jì)算右邊界,寬度減去邊界寬度,還有為光標(biāo)位置留出的像素
            34             int iRightBorder = m_iWidth - BORDER_WIDTH - CARET_WIDTH;
            35             forint i = m_iCaretCharPos; i < iNewPos; ++i )
            36             {
            37                 m_iCaretFirstCharDistance += m_pFont->GetCharWidth( m_strText.c_str()[i] ) + CHAR_SPACE;
            38             }
            39             //    如果後面還有一個(gè)字符
            40             if( iNewPos < m_strText.length() )
            41             {
            42                 iRightBorder -= m_pFont->GetCharWidth( m_strText.c_str()[iNewPos] );
            43             }
            44             //    光標(biāo)超出右邊界
            45             if( m_iCaretFirstCharDistance + m_iFirstCharRenderPosition > iRightBorder )
            46             {
            47                 m_iFirstCharRenderPosition = iRightBorder - m_iCaretFirstCharDistance;
            48             }
            49         }
            50 
            51         m_iCaretCharPos = iNewPos;
            52     }
            53 }
            54 

            m_iCaretFirstCharDistance 表示光標(biāo)位置和第一個(gè)字符位置之間的距離
            m_iFirstCharRenderPosition 表示第一個(gè)字符的渲染位置
            m_iCaretCharPos 表示光標(biāo)在字符串的字符索引位置
            BORDER_WIDTH 表示編輯框向內(nèi)的邊界寬度
            CARET_WIDTH 表示光標(biāo)的寬度
            CHAR_SPACE 表示編輯框中字符間距

             1 void InputBox::Render()
             2 {
             3     hge->Gfx_SetClipping( m_iX, m_iY, m_iWidth, m_iHeight );
             4     _RenderBox(0xffffff00);
             5     m_pFont->Render( m_strText.c_str(), m_strText.length(), m_iX + BORDER_WIDTH + m_iFirstCharRenderPosition, m_iY, 0xff000000 );
             6     if( m_bShowCaret )
             7     {
             8         forint i = 0;i < m_iCaretWidth; ++i )
             9         {
            10             hge->Gfx_RenderLine( 
            11                 m_iX + BORDER_WIDTH + m_iFirstCharRenderPosition + m_iCaretFirstCharDistance + i, 
            12                 m_iY, 
            13                 m_iX + m_iFirstCharRenderPosition + BORDER_WIDTH + m_iCaretFirstCharDistance + i, 
            14                 m_iY + m_iHeight, 
            15                 0xff000000 );
            16         }
            17     }
            18     hge->Gfx_SetClipping();
            19 }

            m_iX 表示文本框的位置X
            m_iY 表示文本框的位置Y
            m_iWidth 表示文本框的寬度
            m_iHeight 表示文本框的高度
            hge->Gfx_RenderLine 是畫(huà)線的
            _RenderBox 是畫(huà)外框的。
            hge->Gfx_SetClipping 是設(shè)置裁剪的
            m_pFont->Render 是渲染字符串




            針對(duì)_SetCaretPos的邏輯算法,需要注意的一點(diǎn)是,如果要?jiǎng)h除光標(biāo)位置和首字符間的字符,就一定要對(duì)光標(biāo)位置進(jìn)行重定位。
            退格鍵邏輯裏面,應(yīng)該先設(shè)置光標(biāo)位置向前一格,再執(zhí)行刪除邏輯刪除光標(biāo)當(dāng)前位置上的字符。
            刪除邏輯只要?jiǎng)h除光標(biāo)位置上的字符就可以了,光標(biāo)相對(duì)於首字符的位置不會(huì)改變。

            綜上,光標(biāo)位置的主要邏輯思想是
            1- 改變光標(biāo)位置
            2- 計(jì)算新的光標(biāo)位置到首字符的距離
            3- 根據(jù)新的距離產(chǎn)生一個(gè)新的光標(biāo)顯示位置
            4- 根據(jù)光標(biāo)顯示位置是否超出邊界和超出的多少,調(diào)整首字符顯示位置。

            posted on 2010-03-24 02:24 飯中淹 閱讀(2294) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 游戲客戶(hù)端數(shù)據(jù)算法分析
            狠狠精品干练久久久无码中文字幕| 丁香五月综合久久激情| 奇米影视7777久久精品| 香蕉久久一区二区不卡无毒影院| 国产精久久一区二区三区| 2021国产精品久久精品| 国产精品久久久久久搜索| 久久夜色精品国产亚洲av| 久久精品欧美日韩精品| 久久综合视频网站| 久久久久中文字幕| 日产精品99久久久久久| 色诱久久av| 久久久久久久尹人综合网亚洲| 久久久久无码国产精品不卡| 日本道色综合久久影院| 亚洲国产精品无码成人片久久| 久久WWW免费人成—看片| 国产精品九九九久久九九| 人妻无码精品久久亚瑟影视 | 国产精品无码久久四虎| 久久综合国产乱子伦精品免费| 欧洲国产伦久久久久久久| 99久久精品国产综合一区| 91久久精一区二区三区大全| 午夜精品久久久久久99热| 欧美性猛交xxxx免费看久久久| 国产精品欧美亚洲韩国日本久久 | 国产精品成人99久久久久91gav| 狠狠综合久久AV一区二区三区| 亚洲综合精品香蕉久久网97| 久久亚洲AV成人无码电影| 亚洲va久久久久| 色99久久久久高潮综合影院| 久久精品国产99久久香蕉| 久久高清一级毛片| 国产免费福利体检区久久| 久久久久久国产精品美女| 久久天天躁狠狠躁夜夜2020老熟妇| 久久久久国产| 青青久久精品国产免费看 |