• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:リッチテキストへの行ごとの背景色指定について)

リッチテキストへの行ごとの背景色指定について

このQ&Aのポイント
  • リッチテキストへの行ごとの背景色指定についての問題に対する代替案や解決案を求めています。
  • 現在、リッチテキストで表示された2つの文章を比較し、間違いが発見された場合に行ごとに背景色を変更したいと考えています。
  • しかし、行単位での背景色の指定方法について問題があり、ずれや重なりが発生しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答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] );   } } といった具合でうまくいくと思います …

yukke33
質問者

お礼

ご助力ありがとうございました。 おかげさまで、バッチリできました。 こういう方法があることも初めて知って、とても勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • リッチテキストを利用した文字列の画面表示、コントロール変数のアドレス割り当てについて

    お世話になっております。 現在VC++2003,MFCにてプログラミングを行っています。 現在、リッチテキストを利用し、文字列を画面に行ごとに挿入、任意の行に対し背景色をつける処理を構築しようとしているのですが、うまくいきません。 CString型の文字列だけであれば画面表示可能なのですが、CHARFORMAT2構造体を利用し、コントロール変数に対して背景色を変更しようとするとエラーが起こります。 エラーの原因は、コントロール変数に対してアドレスが割り当てられておらず、参照元がない、と怒られているようです(richEditCtrl.SetSel(1,5);の段階でエラーが起きます。) CString型と同じように変数の宣言をしているのにどうして?という状態です。 自分の宣言方法がまずいのか、そもそも自分の考えていること自体が間違っているのか、検討がつかずに困っています。 どなたかお力を貸していただけませんでしょうか? よろしくお願いいたします。 以下は私が記載したコードです。 ________________________________________________________________ void OCRGetPr::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_RICHEDIT22, richEdit1); DDX_Text(pDX, IDC_RICHEDIT21, richEdit2); DDX_Control(pDX, IDC_RICHEDIT22, richEditCtrl); DDX_Control(pDX, IDC_RICHEDIT21, richEditCtrl2); } BEGIN_MESSAGE_MAP(OCRGetPr, CDialog) END_MESSAGE_MAP() // OCRGetPr メッセージ ハンドラ void OCRGetPr::DoOCR(CString Text1[],int finLength1) { for(int checkNum = 0; checkNum < finLength1 ; checkNum++){ richEdit1.Append(Text1[checkNum]+"\n"); CHARFORMAT2 cf[1]; UpdateData(FALSE); richEditCtrl.SetSel(1,5);//値はテスト用のため適当 cf[0].cbSize = sizeof(cf[0]); cf[0].dwMask = CFM_COLOR | CFM_BACKCOLOR | CFM_SIZE; cf[0].dwEffects = 0; cf[0].yHeight = 300; cf[0].crTextColor = RGB(255, 0, 0); cf[0].crBackColor = RGB( 0, 255, 0); richEditCtrl.SetSelectionCharFormat(cf[0]); }

  • 空白文字について

    C言語の初心者です。 今、VC 6.0の環境で電卓を作っています。 エディットボックスに数値を入力して計算させるプログラムなのですが エディットボックスにスペースを入力されても計算出来るようにしたいのですが解りません。 NULL文字をチェックすればよいのか、それとも「isspece」の関数を使って空白文字を調べればよいか解りません。プラス「+」、マイナス「-」の符合が入力されても計算出来るようには行えたのですが、どうしても空白(スペース)を入力された場合が、うまくいきません。 作成途中のソースコードです。ご指導お願いします。 // OnButton1() ///////////////////////////////////////////////////////////////////// void CKasanDlg::OnButton1() { adding(); char num1[128],num3[128]; int i,length=strlen(&num1[0]); int numk,numl=0; m_num3.GetLine( 0, num3 ); numk = sscanf( num3, "%d", &numl ); for( i=0; i<length; i++ ){ isdigit( (int) num1[i] ); } if(( numk == -1 )){ MessageBox("数値を入力してください。"); // メッセージボックス } } // 足算 (num) ///////////////////////////////////////////////////////////////// void CKasanDlg::adding() { char num1[128],num2[128]; int number1=0, number2=0,sum=0; CString ans; int nums,numa; int i=0, m=0, add1=0,add2=0; m_num3.SetSel( 0,-1 ); m_num3.Clear(); m_num1.GetLine( 0, num1 ); int length1 ; if(( num1[ 0 ] == '-' ) || ( num1[ 0 ] == '+' )){ length1 = strlen ( &num1[1] ); for( i=0; i<length1; i++ ){ add1 = isdigit( (int)num1[i+1] ); if( add1 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・左側)"); break; } } } else{ length1 = strlen ( &num1[0] ); for( i=0; i<length1; i++ ){ add1 = isdigit( (int)num1[i] ); if( add1 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・左側)"); break; } } } m_num2.GetLine( 0, num2 ); int length2; if(( num2[ 0 ] == '-' ) || ( num2[ 0 ] == '+' ) || ( num2[ 0 ] == ' ' )){ length2 = strlen ( &num2[1] ); for( m=0; m<length2; m++ ){ add2 = isdigit( (int)num2[m+1] ); if( add2 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・右側)"); break; } } } else{ length2 = strlen (&num2[0]); for( m=0; m<length2; m++ ){ add2= isdigit((int)num2[m]); if( add2 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・右側)"); break; } } } if((add1 == 0 ) && ( add2 == 0)){ return ; } if((add1 == 0 ) && ( add2 != 0)){ return ; } if((add1 != 0 ) && ( add2 == 0)){ return ; } nums = sscanf( num1, "%d", &number1 ); numa = sscanf( num2, "%d", &number2 ); if(( nums == 1) && ( numa == 1)){ sum = number1 + number2; ans.Format( "%d",sum ); m_num3.SetSel( 0, -1 ); m_num3.Clear(); m_num3.ReplaceSel( ans ); } } ///////////////////////////////////////////////////////////////////////////////

  • 入力されたテキストの行の中から最も文字数の多い行を表示するプログラム

    学校の課題なのですが、どうにも正しくプログラムできません もしお分かりになる方がいらっしゃったらご回答よろしくお願いします 条件、注意書きはほとんど書いた通りです 申し訳ありませんが早めのご回答お願いいたします #include <stdio.h> #define MAXLINE 1000 int getl(char s[], int lim){           不明箇所 } void copy(char to[], char from[]) { int i;  i=0;  while ((to[i] = from[i]) != '/0') ++i; } int main() { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max=0; while((len = getl(line,MAXLINE)) > 0) if(len > max){            不明箇所 } if(max > 0) printf("%d: %s", max, longest); return(0); } getl  標準入力から1文字ずつ読み込み、配列の先頭から順に格納する     読み込んだ文字が改行(/n)なら行末。/nを格納した次の要素に/0を格納     読み込んだ文字数(改行コード含む)を関数の値(戻り値にする) char s[]  読み込んだ文字を格納する文字配列       行末に達したら直後に/0 int lim  仮引数s[]の要素数。読み込む行の文字数がlimの値を超えるとそこで行の入力を打ち切る len  getlで読み込んだ行の文字数 line  getlで読み込んだ行を格納 longest  一番長かった行を保持 max  一番長かった行の文字数を保持 while  作成する関数の戻り値がEOFでない限り繰り返す      今読み込んだ行がこれまで一番長かった行より長い場合にはmaxを更新し、読み込んだ行をcopyでlongest[]にコピーしておく mainの最後でmax>0ならば(有効な行を読み込んでいたら)最も長い行を%sで表示 例 入力 123      12345      12   出力 12345    

  • 行が壊れました。1行の長さが2048文字を越えています。

    11行目の""の中の文字数を増やしたいのですが、そのまま増やすと「行が壊れました。1行の長さが2048文字を越えています。」といったメッセージが出てきてしまいます。 ""の中を改行するとエラーになってしまいます。 できることなら""の中を何万文字と増やしていきたいです。 実行結果が欲しいだけなのですが…。 ほとんどこういったものを使ったことがないので、簡単に解決できるのかできないのかすらわかりません。ちなみにMicrosoft Visual c++ 6.0を使用しています。 どうかよろしくお願いします。 [1] #include<stdio.h> [2] #include<string.h> [3] #include <time.h> [4] [5] [6] char *search(char *,char *); [7] [8] int main(void) [9] { [10] [11] static char text[]="あいうえお"; [12] char *p,*key="pen"; [13] [14] clock_t start,end; [15] start = clock(); [16] [17] [18] [19] p=search(text,key); [20] while (p!=NULL) [21] { [22] printf("%s\n",p); [23] p=search(p+strlen(key),key); [24] } [25] end = clock(); [26] printf("%.5f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC); [27] return 0; [28] } [29] [30] char *search(char *text,char *key) [31] { [32] int m,n; [33] char *p; [34] [35] m=strlen(text); [36] n=strlen(key); [37] for(p=text;p<=text+m-n;p++) [38] { [39] if(strncmp(p,key,n)==0) [40] return(p); [41] } [42] return(NULL); [43] }

  • DataGridで特定行に対する背景色の設定

    お世話になります。 vb6で開発中なのですが、DataGridの行単位での背景色設定について質問させて下さい。 DataGridにはOracleで生成したViewをレコードソースに設定し、それを表示しているのですが、あるカラムの値が指定文字列を含む場合は、その行の背景色を変更して表示したいと考えております。 こういった事は可能でしょうか? 可能であれば、どのような方法が取れるかご教授願いたいです。 よろしくお願いいたします。

  • 列にある指定文字のその行の指定文字の合計数

    ExcelでセルH1文字"う"がA列の文字とマッチした文字"う"の行B3:F3の文字"A"のみを合計しセルI1に数値3をつづいてH2文字に対してI2にA列文字"こ"の行"A"の合計数を入力したくI列に入れる関数をどなたか解る方宜しくお願いします。

  • 行列の行の入換え

    | -1 -1 -2 -1 10 | | -1 -2 -1 10 -1 | | -2 -1 10 -1 -1 | | -1 10 -1 -1 -2 | | 10 -1 -1 -2 -1 | この行列を次の順序で並び替えたいのですが 1.第1列にある要素の中で絶対値の最大値がある行を探し,その行と第1行を入れ換える. 2.第2列にある要素の中で絶対値の最大値がある行を第2行以下から探し,その行と第2行を入れ換える. 3.これを左上から右下へ順次移動して,行の入れ換えを行う. #include<stdio.h> #include<math.h> #define N 5 #define M 5 int main(){ float a[N][M]={{-1.0,-1.0,-2.0,-1.0,10.0},{-1.0,-2.0,-1.0,10.0,-1.0},{-2.0,-1.0,10.0,-1.0,-1.0}, {-1.0,10.0,-1.0,-1.0,-2.0},{10.0,-1.0,-1.0,-2.0,-1.0}}; float nmax; int i,j,k=0,s,imax; for(j=0; j<M; j++){ nmax = a[0][j]; imax = 0; for(i=1; i<N; i++){ if(fabs(nmax) < fabs(a[i][j])){ nmax = a[i][j]; imax = i; } } for(j=0; j<M; j++){ s=a[k][j]; a[k][j]=a[imax][j]; a[imax][j]=s; } k++; } for(i=0; i<N; i++){ for(j=0; j<M; j++){ printf("%5.1f ",a[i][j]); } printf("\n"); } return(0); } このように作成したのですが、1行目と5行目しかいれかわりません。 なぜでしょうか??

  • プログラム

    文字列を逆順にする関数を作ってるのですがうまくできません。 void reverse(char *str, int count=0) { int i; char *s="momonga"; s+=strlen(s); count=strlen(s); for(i=count; i<0; i--, str++, s--){ *str++=*s++; } } int main() { char s1[20]; int c; reverse(s1,c); printf("%momongaを逆順にすると%sで文字数が%dです",s1,c); return 0; } このプログラムの間違ってる所をおしえてください。

  • 外部CSVをサイトに読み込み表示できるでしょうか?また値によって背景色を変えるということは可能でしょうか?

    外部にあるCSVをサイトに読み込んで表示するということは可能でしょうか? またCSVを行単位で読み込み、その値によって背景色を自動で変えるということは可能でしょうか? JavaScript初心者です。どうかご指導宜しくお願いいたします。m<_ _>m CSV例 ------------------------ 1行目 +10 2行目 -15 3行目 +5 4行目 0 表示例 ------------------------- http://farm4.static.flickr.com/3266/3116370342_2d0374218e_m.jpg 値(+): 背景(青) 値(-): 背景(赤) 値(0): 背景(黒)

  • ポインタ勉強中です。しかも実行するとおかしいです。

    <本に載ってたソース> #include<stdio.h> #include<string.h> int main() { char msg[20]; char *str=NULL; int i; int cnt; str=&msg[0]; printf("文字を入力してください"); scanf("%s",&str); cnt=strlen(msg); str=msg+cnt; for(i=cnt;i>=0;i--){ printf("%c",*(str--)); } printf("\n"); return 0; } char *str=NULL;は、ポインタstrを空にするということでしょうか? いつもながらstrlenとsizeofが混じります。 sizeofがバイトの大きさで、strlenが、文字数でしたっけ?