如何提供編輯控制項中的自訂 wordbreak 函式

文章翻譯 文章翻譯
文章編號: 109551 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

應用程式會將 EM_SETWORDBREAKPROC 訊息傳送給編輯控制項的應用程式定義的自動換行函式以取代預設的自動換行函式。預設的自動換行函式中斷空格字元的多行編輯控制項 (MLE) 中一條線。如果應用程式需要變更這項功能 (也就是中斷空格以外的其他部份字元),然後應用程式必須提供自己的自動換行 (wordbreak) 函式。

其他相關資訊

自動換行函式會掃描文字緩衝區 (其中包含要傳送到顯示的文字),尋找第一個單字不適合放在目前的顯示行。自動換行函式會將這個字放在顯示下一行的開頭。

自動換行函式會定義的點的 Windows 應該對多行編輯控制項的文字行通常是在中斷空格字元,用來分隔兩個字。這可以被變更,使一個 MLE 中的某一行可以是中斷任何字元。如需有關 EM_SETWORDBREAKPROC 訊息的詳細資訊,請參閱平台 SDK。

下面是範例程式碼,示範如何在多行編輯控制項中會中斷行"~"(波狀符號) 字元 (例如),而非一般的空間 ("") 字元。

範例程式碼會假設此編輯控制項是多行編輯控制項,而它是在對話方塊中的子控制項。

範例程式碼

   //Prototype the application-defined wordbreakproc.
   int CALLBACK WordBreakProc(LPSTR, int, int, int) ;

   //Install wordbreakproc in the WM_INITDIALOG case.
     case WM_INITDIALOG:

/* 
   For 16 bit applications use the following line to setup your
   CALLBACK function.

       lpWrdBrkProc = MakeProcInstance(WordBreakProc, hInst);

It is not neccessary to use MakeProcInstance in 32-bit applications.
*/ 


       //Send the EM_SETWORDBREAKPROC message to the edit control
       //to install the new wordbreak procedure.
        SendDlgItemMessage(hDlg, ID_EDIT, EM_SETWORDBREAKPROC, 0,
                           (LPARAM)(EDITWORDBREAKPROC)lpWrdBrkProc) ;
        return (TRUE);

   int FAR PASCAL WordBreakProc(LPSTR lpszEditText, int ichCurrent,
                                int cchEditText, int wActionCode)
   {

      char FAR *lpCurrentChar;
      int  nIndex;
      int  nLastAction;

      switch (wActionCode) {

        case WB_ISDELIMITER:

        // Windows sends this code so that the wordbreak function can
        // check to see if the current character is the delimiter.
        // If so, return TRUE. This will cause a line break at the ~
        // character.

         if ( lpszEditText[ichCurrent] == '~' )
            return TRUE;
         else
            return FALSE;

         break;

        // Because we have replaced the default wordbreak procedure, our
        // wordbreak procedure must provide the other standard features in
        // edit controls.

       case WB_LEFT:

        // Windows sends this code when the user enters CTRL+LEFT ARROW.
        // The wordbreak function should scan the text buffer for the
        // beginning of the word from the current position and move the
        // caret to the beginning of the word.

            {
               BOOL bCharFound = FALSE;

               lpCurrentChar = lpszEditText + ichCurrent;
               nIndex = ichCurrent;

               while (nIndex > 0  &&
                     (*(lpCurrentChar-1) != '~' &&
                      *(lpCurrentChar-1) != 0x0A) ||
                     !bCharFound )

              {
                  lpCurrentChar = AnsiPrev(lpszEditText ,lpCurrentChar);
                  nIndex--;

                  if (*(lpCurrentChar) != '~' &&  *(lpCurrentChar) != 0x0A)

                     // We have found the last char in the word. Continue
                     // looking backwards till we find the first char of
                     // the word.
                    {
                      bCharFound = TRUE;

                      // We will consider a CR the start of a word.
                      if (*(lpCurrentChar) == 0x0D)
                          break;
                    }

               }
               return nIndex;

            }
         break;


        case WB_RIGHT:

        //Windows sends this code when the user enters CTRL+RIGHT ARROW.
        //The wordbreak function should scan the text buffer for the
        //beginning of the word from the current position and move the
        //caret to the end of the word.

         for (lpCurrentChar = lpszEditText+ichCurrent, nIndex = ichCurrent;
              nIndex < cchEditText;
              nIndex++, lpCurrentChar=AnsiNext(lpCurrentChar))

          if ( *lpCurrentChar == '~' ) {
         lpCurrentChar=AnsiNext(lpCurrentChar);
            nIndex++;

            while ( *lpCurrentChar == '~' ) {
              lpCurrentChar=AnsiNext(lpCurrentChar);
              nIndex++;
             }

            return nIndex;
          }

          return cchEditText;
          break;


    }
  }

				
上述的自動換行 (wordbreak) 函式必須以應用程式的.DEF 檔匯出。函式可以修改,並自訂根據為應用程式的需求。

屬性

文章編號: 109551 - 上次校閱: 2005年7月11日 - 版次: 2.2
這篇文章中的資訊適用於:
  • Microsoft Platform Software Development Kit-January 2000 Edition
關鍵字:?
kbmt kbctrl kbeditctrl kbhowto KB109551 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:109551
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com