如何提供编辑控件中的自定义 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 文件的应用程序中。该函数可修改和自定义,使其根据应用程序的需要。
多行

警告:本文已自动翻译

属性

文章 ID: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
反馈