![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
いつもお世話になっております。
構築環境VC++2003MFCにて、リッチエディットを利用した、
2つの文章を比較するプログラムを作成しています。
リッチエディットに表示された2つの文章に対し、比較した結果間違いが発見された場合には、間違いが発見された行の背景色を別の色(自分のソースでは赤)にしたいと考えています。
現在、背景色は変わるのですが、うまく行単位に指定することができません。
自分が考えた方法は2種類あり、ひとつは1行1行の総文字数を固定し、固定した文字数に背景色変更箇所を指定する方法setSel(総文字数,1行分(固定)足した総文字数))数を図り、もうひとつは1行ごとに文字数を加算、間違いが見つかった段階で、setSel(それまでの総文字数,1行分(可変)足した総文字数)を行うというものです。
1つ目の案に関しては、文字数が可変であるため、2つのテキストで背景色の指定位置がずれてしまう、さらに行単位にはなっていないという問題が発生しました。
2つめの案に関しても、ほぼ同じ問題が発生しました。
どちらの案を利用しても、行単位での背景色変更はできませんでした。
もし、この問題に対し代替案、解決案をお持ちの方いらっしゃいましたら、ご助力をよろしくお願い致します。
また、コード中の//で表したものは、1つめの案を実行した際のものです。
以下に、私がコーディングしたものを記載します。
______________________________________________________________
char LineText[200];/*ライン毎の文字列取得*/
char LineText2[200];
//size_t LineTextSize;/*ライン毎の文字数取得*/
//size_t LineTextSize2;
int LineTextSize =200;
int LineTextSize2 =200;
int ALLText = 0;/*総文字数*/
int ALLText2 = 0;
int LineCount = m_richEditCtrl.GetLineCount();/*総行数の取得*/
int LineCount2 = m_richEditCtrl2.GetLineCount();
CHARFORMAT2 cf[1];
UpdateData(FALSE);
cf[0].cbSize = sizeof(cf[0]);
cf[0].dwMask = CFM_COLOR | CFM_BACKCOLOR ;
cf[0].dwEffects = 0;
cf[0].crBackColor = RGB(150, 0, 0);
if(!LineCount==LineCount2){
AfxMessageBox("行数が違います\n確認を行ってください");
}
for(int i = 0; i < LineCount; i++){
m_richEditCtrl.GetLine(i,LineText);
m_richEditCtrl2.GetLine(i,LineText2);
//LineTextSize = strlen(LineText);
//LineTextSize2 = strlen(LineText2);
if(strcmp(LineText,LineText2)){
m_richEditCtrl.SetSel(ALLText,ALLText+LineTextSize);
m_richEditCtrl2.SetSel(ALLText2,ALLText2+LineTextSize2);
m_richEditCtrl.SetSelectionCharFormat(cf[0]);
m_richEditCtrl2.SetSelectionCharFormat(cf[0]);
}
ALLText = ALLText + LineTextSize;
ALLText2 = ALLText2 + LineTextSize2;
}
No.1ベストアンサー
- 回答日時:
GetLineIndexでその行頭のインデックスと次行インデックスを取得して
SetSelを掛け、GetSelTextで取得して比較
または richEdit1などのテキスト内容をTokenizeで切り出して比較
GetLineIndexでその行頭、次行のインデックスを取得してSetSel
といった具合のほうがいいようです
リッチエディットコントロールが内部で保持しているの文字はUnicodeではないかと思います
App側がANSIだとこの辺りで文字インデックスの差が出てきてしまうような気がします
# AppをUnicodeにしても変な動作がありましたが …
以下にサンプルを掲示します
文字列の区切りが "\r\n" だとして
// コントロール変数の更新
UpdateData( TRUE );
int nPos[2] = {0};
CString sLine[2];
int nS, nE;
nS = nE = 0;
for( int n = 0; n < LineCount; n++ ) {
// LFの位置を見つける
sLine[0] = m_ritchEdit.Tokenize( _T("\n"), nPos[0] );
sLine[1] = m_ritchEdit2.Tokenize( _T("\n"), nPos[1] );
// 切り出した文字列の比較
if ( sLIne[0] != sLIne[1] ) {
// 行頭を取得
nS = m_ritchEditCtrl.LineIndex( n );
// 行末を取得
nE = m_ritchEditCtrl.LineIndex( n + 1 ) - 1;
m_ritchEditCtrl.SetSel( nS, nE );
m_ritchEditCtrl.SetSelectionCharFormat( cf[0] );
nS = m_ritchEditCtrl2.LineIndex( n );
nE = m_ritchEditCtrl2.LineIndex( n + 1 ) - 1;
m_ritchEditCtrl2.SetSel( nS, nE );
m_ritchEditCtrl2.SetSelectionCharFormat( cf[0] );
}
}
といった具合でうまくいくと思います …
ご助力ありがとうございました。
おかげさまで、バッチリできました。
こういう方法があることも初めて知って、とても勉強になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Visual Basic(VBA) エクセルから、パワーポイントのスライドを複数作成する。 1 2022/07/08 09:40
- Excel(エクセル) こんなことできますか?例えば、sheetに貼り付けた図形のタイトルを、セルA1の文字で表示する。 5 2022/04/22 15:25
- Excel(エクセル) エクセルの数式について教えてください。 2 2023/03/04 09:54
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
std::set<int> で、ある値が何...
-
「指定されたキャストは有効で...
-
C言語 エラーの原因がわからな...
-
C言語の配列をC++のvectorに高...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
(int *)の意味
-
【C++】関数ポインタの使い方
-
数字列を3桁ごとにカンマで区切...
-
if と配列の組み合わせ
-
C言語に関する質問です フィボ...
-
リッチテキストへの行ごとの背...
-
比較回数と交換回数表示について
-
インライン展開されているか確...
-
ヒープ木の格納 【プログラミ...
-
C言語に関する質問です
-
配列に順列を入れ、その順列を...
-
C言語でシグマで総和を求める関...
-
(マルチスレッド)_beginthrea...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
c++でテンプレートのコードでわ...
-
(int *)の意味
-
ラップ関数とはどんなものですか?
-
数字列を3桁ごとにカンマで区切...
-
c言語のリダイレクトによる円...
-
比較回数と交換回数表示について
-
実数の整数部,小数部の取得
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
PowerShellがうまくいかない
-
c言語の配列を使ってサイコロを...
-
課題でつまってます・・・
-
C言語のサイコロシミュレート
-
エラー 添字が付けられた値が、...
おすすめ情報