Microsoft アカウントでサインイン
サインインするか、アカウントを作成します。
こんにちは、
Select a different account.
複数のアカウントがあります
サインインに使用するアカウントを選択してください。

この資料では、RichEdit コントロールへの EditWordBreak プロシージャの実装方法を示すサンプル コードを紹介します。RichEdit コントロールでは、入力された文字を単語区切りとして扱うことができるかどうかを判定したり、さまざまな状況で単語の開始位置と終了位置を見つけたりするために、EditWordBreak プロシージャが使用されます。

概要

EditWordBreak プロシージャは、指定されたコマンドに応じてごく単純な単語区切り情報を返します。次の例は、EditWordBreak プロシージャの実装方法を示しています。

#define WB_CLASS_WHITESPACE 0x00
#define WB_CLASS_LINEBREAK 0x01
#define WB_CLASS_DELIMITER 0x02
#define WB_CLASS_NORMALCHAR 0x03


TCHAR whitespace[]=TEXT(" \t") ;
TCHAR linebreakers[]=TEXT("\r\n") ;
TCHAR delimiters[]=TEXT("[]();:,.\"'") ;

BOOL isInDelimiterList(TCHAR c)
{
return (_tcschr((LPCTSTR)delimiters,c) != NULL || _tcschr((LPCTSTR)whitespace,c) != NULL || _tcschr((LPCTSTR)linebreakers,c) != NULL) ;
}



int CALLBACK EditWordBreakProcEx(LPTSTR pchText, int ichCurrent, int cch, int code)
{
int lRet = 0 ;
int i=0 ;
BOOL found = FALSE ;
int initial_pos = ichCurrent ;

switch (code)
{
case WB_LEFT:
{//Finds the beginning of a word to the left of the specified position.
while(!isInDelimiterList(pchText[ichCurrent]) && ichCurrent>0) ichCurrent-- ;
if(ichCurrent>0)
lRet = ichCurrent +1 ;
else
lRet = -1 ;
}
break ;
case WB_RIGHT:
{
//Finds the beginning of a word to the right of the specified position.
while(!isInDelimiterList(pchText[ichCurrent]) && ichCurrent<cch) ichCurrent ;
if(ichCurrent>0)
lRet = ichCurrent -1 ;
else
lRet = -1 ;
}
break ;
case WB_ISDELIMITER:
{//Checks whether the character at the specified position is a delimiter.
if(_tcschr((LPCTSTR)delimiters,*pchText) != NULL)
{
lRet = TRUE ;
}
}
break ;
case WB_CLASSIFY:
{ //Retrieves the character class and word break flags of the character at the specified position.
if(_tcschr((LPCTSTR)whitespace,*pchText) != NULL)
{
lRet = WBF_ISWHITE | WB_CLASS_WHITESPACE ;
}
else if(_tcschr((LPCTSTR)delimiters,*pchText) != NULL)
{
lRet = WBF_BREAKAFTER | WB_CLASS_DELIMITER ;
}
else if(_tcschr((LPCTSTR)linebreakers,*pchText) != NULL)
{
lRet = WBF_BREAKLINE | WB_CLASS_DELIMITER ;
}
else
{
lRet = WB_CLASS_NORMALCHAR ;
}
}
break ;
case WB_MOVEWORDLEFT:
// Finds the next character that begins a word before the specified position.
{
ichCurrent-- ;
while(isInDelimiterList(pchText[ichCurrent])) ichCurrent-- ;
while(ichCurrent<cch && !found && ichCurrent>=0)
{
found = isInDelimiterList(pchText[ichCurrent]) ;
if(found && ichCurrent>=0)
{
lRet = ichCurrent+1 ;
}
else
{
lRet = -1 ;//This ensures failure unless something is found. //Thus, if the supplied string, is exhausted,
//we will be called with the next bunch //of characters.
ichCurrent -- ;
}
}
return lRet ;
}
break ;
case WB_MOVEWORDRIGHT:
//Finds the next character that begins a word after the specified position.
{
if(!isInDelimiterList(pchText[ichCurrent]))
while(!isInDelimiterList(pchText[ichCurrent])&&ichCurrent <cch) ichCurrent++ ;
while(isInDelimiterList(pchText[ichCurrent]&&ichCurrent <cch)) ichCurrent++ ;
if(ichCurrent<cch)
lRet = ichCurrent +1 ;
else
lRet = -1 ;
return lRet ;

}
break ;
case WB_LEFTBREAK:
//Finds the end-of-word delimiter to the left of the specified position.
{
while(!isInDelimiterList(pchText[ichCurrent]) && ichCurrent>0) ichCurrent-- ;
if(ichCurrent>0)
lRet = ichCurrent ;
else
lRet = -1 ;
}
break ;
case WB_RIGHTBREAK:
{//Finds the end-of-word delimiter to the left of the specified position.
while(!isInDelimiterList(pchText[ichCurrent]) && ichCurrent<cch) ichCurrent ;
if(ichCurrent>0)
lRet = ichCurrent ;
else
lRet = -1 ;
}
break ;
}
return lRet ;
}

詳細

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 273139 (最終更新日 2001-02-04) をもとに作成したものです。


この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

関連情報

ヘルプを表示

スキルを磨く
トレーニングの探索
新機能を最初に入手
Microsoft Insider に参加する

この情報は役に立ちましたか?

言語の品質にどの程度満足していますか?
どのような要因がお客様の操作性に影響しましたか?

ご意見をいただきありがとうございます。

×