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

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

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 - 最後檢閱時間:01/11/2015 00:50:08 - 修訂: 2.2

  • Microsoft Platform Software Development Kit-January 2000 Edition
  • kbnosurvey kbarchive kbmt kbctrl kbeditctrl kbhowto KB109551 KbMtzh
意見反應