
いつもお世話になっております。
構築環境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ランキング
-
c言語マップ探査ゲーム プログ...
-
C言語をお願いします
-
ヒープ木の格納 【プログラミ...
-
C言語での引数の省略方法
-
C++/Cこういうことは可能でしょ...
-
【C++】関数ポインタの使い方
-
return 1L
-
公約数のプログラム。
-
C++ グラフ作成
-
NULLの場合のint変数への代入
-
【C言語】関数へのポインタ渡し
-
cinの区切り文字の書き方
-
c言語
-
C言語 行列の和
-
C言語で、数値の桁数を求めるに...
-
VB.NETからC++のdll連携(double)
-
深さ優先探索について・・・
-
C#でmCnの求め方について 階乗...
-
C言語のアルゴリズム、マージソ...
-
入力を待たずにstdinの監視をし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
(int *)の意味
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
windows-findstrの正規表現を使...
-
C言語で分からないところがあり...
-
int型の変数値をバイト列として...
-
PowerShellがうまくいかない
-
C言語での奇数の和
-
「{ } で囲むだけ」は正しい?
-
std::set<int> で、ある値が何...
-
実数の整数部,小数部の取得
-
エラー 添字が付けられた値が、...
-
int16_t の _t は何?
おすすめ情報