Cómo proporcionar una función de Wordbreak personalizada en controles de edición

Seleccione idioma Seleccione idioma
Id. de artículo: 109551 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Una aplicación envía el mensaje EM_SETWORDBREAKPROC a un control de edición para reemplazar la función de ajuste de línea predeterminada con una función de ajuste de línea definido por la aplicación. La función de ajuste de línea predeterminada saltos de una línea en un control de edición multilínea (MLE) en un carácter de espacio. Si una aplicación necesita cambiar esta funcionalidad (es decir, para interrumpir en algún carácter distinto de un espacio), a continuación, la aplicación debe proporcionar su propia función de ajuste de línea (wordbreak).

Más información

Una función de ajuste de línea examina un búfer de texto (que contiene el texto se envíe a la presentación), busca la primera palabra que no cabe en la línea de presentación actual. La función de ajuste de línea coloca esta palabra al principio de la línea siguiente en la pantalla.

Una función de ajuste de línea define el punto en que Windows debe interrumpir una línea de texto para controles de edición multilínea, normalmente en un carácter de espacio que separa dos palabras. Puede cambiarse para que la línea de un MLE pueda rota en cualquier carácter. Para obtener más información sobre el mensaje EM_SETWORDBREAKPROC, consulte Platform SDK.

A continuación es código de ejemplo que muestra cómo un salto de línea en un control de edición de múltiples líneas en el "~" carácter de (tilde) (por ejemplo) en lugar de espacio normal ("") caracteres.

El código de ejemplo se supone que el control de edición es un control de edición multilínea y que es un control secundario en un cuadro de diálogo.

Código de ejemplo

   //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;


    }
  }

				
La función de ajuste de línea (wordbreak) anterior debe exportarse en el archivo .def de la aplicación. La función puede modificarse y personalizar según para necesidades de la aplicación.

Propiedades

Id. de artículo: 109551 - Última revisión: lunes, 11 de julio de 2005 - Versión: 2.2
La información de este artículo se refiere a:
  • Microsoft Platform Software Development Kit-January 2000 Edition
Palabras clave: 
kbmt kbctrl kbeditctrl kbhowto KB109551 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 109551

Enviar comentarios

 

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