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

このQ&Aのポイント
  • 現在、リッチテキストを利用し、文字列を画面に行ごとに挿入、任意の行に対し背景色をつける処理を構築しようとしていますが、うまくいきません。
  • CHARFORMAT2構造体を利用し、コントロール変数に対して背景色を変更しようとするとエラーが起こります。
  • コントロール変数に対してアドレスが割り当てられておらず、参照元がないという状態です。
回答を見る
  • ベストアンサー

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

お世話になっております。 現在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]); }

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

その子ダイアログにOnInitDialogメンバー関数は実装されていますか? ここで CDialog::OnInitDialog() を呼び出してダイアログの初期化を行うはずです その際に DoDataExcahngeが呼ばれてメンバー変数とコントロールを結びつけるはずです void OCRGetPr::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_RICHEDIT22, richEdit1); の CDialog::DoDataExchange(pDX); にブレークポイントを置いて実行し このダイアログを表示した際に F10キーで DDX_Control(pDX, IDC_RICHEDIT22, richEditCtrl); になるまで送り F11でDDX_Controlの中をチャックして見ましょう

yukke33
質問者

お礼

重ね重ねありがとうございました。 ご指摘頂いた箇所にて、間違いを発見することができました。 エラーが起きた原因は、OnInitDialog()が呼び出され、ダイアログが作成される前にコントロール変数に値を代入していたために、参照する実体がない、というものでした。 ひとりで考えていたらもう1,2日は悩むところでした。 ありがとうございました。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

同じようなコードで実験してみましたがご質問のような現象は起きません エラー表示って Debug Assaertion ですか? 表示されるメッセージがあるならそれを省略せずに投稿してみましょう MFCのウィザードでDialogベースでアプリを構築 DLGにRichEdit2.0を2個挿入 コントロール変数、CString変数を追加 InitInstanceの冒頭で AfxInitRitchEdit() を実行 コマンドボタンを追加 これのClickイベントで ご質問のようなコードを実行 といった手順です

yukke33
質問者

補足

ご回答ありがとうございます。 大変失礼致しました。 お察しのとおり、エラーは Debug Assaertion でした。 また、エラーが起きる箇所は前述の通りでしたが、 エラーのさらに具体的な位置は、wincore.cpp内の、hWnd?のようです。 また、説明不足で大変申し訳ありません。 今回作成しているものは、親ダイアログからボタンを押すと、子ダイアログに遷移する仕様となっていて、今回お見せしたコードは子ダイアログのコードになります。 作成方法は、リソースタグでDialog→リソースの追加にてダイアログを選択しております。

関連するQ&A

  • 新ダイアログの初期化

    DoModalなどで新ダイアログを呼び出しているのですが その新ダイアログの初期設定ができません。例えばリストビューなどで m_list.InsertColumn(0,"名前",LVCFMT_CENTER,100); などをしたいのですが 新ダイアログのクラス:NewClass #include ・ ・ ・ #endif CNewClass::CNewClass(CWnd* pParent) : CDaialog(CNewClass::IDD,pParent) { } void CNewClass::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(・・) ・ ・ END_MESSAGE_MAP() がかかれているんですがどこに書けばいいんでしょうか? 一番上の関数だと思ってそこに書いたらDebug AssertionFailed! とでます。そのInsertColumnを入れなければエラーはでません。 ということは入れる場所に問題があるのかとおもいました。 解決方法を教えて下さい。

  • テキストファイルの各行の文字列を、コンボBoxに表示させたい

    テキストファイルの各行の文字列を、コンボBoxに表示させたい 現在VC++ MFCの勉強をしております。(MFCに拘ってはおりません) 下のテキストファイル"D:\data.txt" (Shift_JIS)から (内容) 田中さん 斉藤さん 吉田さん CFile の Read で一行ずつ読み込んで、CStringArrayを使って コンボBox に Insert したいと思っています。 下記のコードについてですが。 BOOL CAddDialog::OnInitDialog() { CDialog::OnInitDialog(); // TODO: ここに初期化を追加してください TCHAR* pszFileName = L"d:\\data.txt"; CFileException fileException; CFile cFile; int ret; char buffLine[256] ; CStringArray cStrComboArr ; // リスト ret = cFile.Open( pszFileName , CFile::modeRead | CFile::shareDenyNone , &fileException ); if ( ret == false ) { AfxMessageBox( L"ファイルが読込めません。" ); return 1; } while ( (ret = cFile.Read( &buffLine , 256 )) != 0 ) { cStrComboArr.Add( buffLine ); /* ここでビルドエラー */ } cFile.Close(); // コンボboxに入れる CComboBoxEx* pCombo = (CComboBoxEx*) GetDlgItem( IDC_COMBOBOXEX1 ); COMBOBOXEXITEM cbi ; cbi.mask = CBEIF_TEXT; for ( int i = 0; i < cStrComboArr.GetCount(); i++ ) { cbi.iItem = i; cbi.pszText = (LPTSTR)(LPCTSTR) cStrComboArr.ElementAt(i) ; // 「'CString' から 'LPWSTR' に変換できません」から。 cbi.cchTextMax = 256; pCombo->InsertItem( &cbi ); } return TRUE; // return TRUE unless you set the focus to a control // 例外 : OCX プロパティ ページは必ず FALSE を返します。 } cStrComboArr.Add( buffLine ); の部分でエラー表示は、 「INT_PTR CStringArray::Add(LPCTSTR)' : 1 番目の引数を 'char [256]' から 'LPCTSTR' に変換できません。」です。 根本的にやり方が間違っているのか、もう少しのところなのか、 ズバッとご指摘いただけないでしょうか。 宜しくお願いします。 OS : Vista Home Premium VS 2008 pro

  • リッチエディットのUPDATEメッセージ受け取り方

    ダイアログにリッチエディットボックスを貼り付けています。 文字が入力されるたびにUPDATEメッセージを受け取りたいのですが。 下記注釈の意味がわからず困っています。OnInitDialog()に何かを書くということは判るのですが。ヘルプでも見つけることが出来ませんでした。 どうかこの私でも判るよう教えてください。よろしくお願いいたします。m(_ _)m void CCtypeDlg::OnUpdateRichedit() { // TODO: これが RICHEDIT コントロールの場合、コントロールは、lParam マスク // 内での論理和の ENM_UPDATE フラグ付きで EM_SETEVENTMASK // メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー // ライドしない限りこの通知を送りません。 // TODO: この位置にコントロール通知ハンドラ・・・

  • 変数の代入について

    ダイアログベースで、ダイアログ1からダイアログ2を開きダイアログ1のエディットボックスのデータをダイアログ2に表示する下記コードを教わりました。 変更後のようにしても問題ないと思いましたが、'dlg' は定義されていない識別子です。とエラーが出ます。 どうしてなのかお教えていただきたいのですが、 よろしくお願いします。 <変更前> CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); <変更後> void CSubDlg::OnPaint() { m_strText = dlg.strText; ちなみにdlgはウィザードが作ったコードで、 CMainDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); ダイアログ1のことだと思うのですが。。。。 ************************** メインダイアログとしてCMainDlgを例にしますが、かなり割愛します。 このダイアログには、Editが貼り付けられているとします。Editコントロールに割り当てたIDをIDC_EDIT_INPUTだと仮定します。 DDXとかのデータ変換を使う方法もありますが、ここでは単にデータを取得します。 // // OKボタンが押された時の処理 // void CMainDlg::OnOK() { // データの取得 CString strText; GetDlgItemText(IDC_EDIT_INPUT, strText); CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); } class CSubDlg : pbulic CDialog { public: CString m_strText; // 親から渡される文字列を格納する変数 ・ ・ ・ ・ ・ }; あとは、CSubDlgのOnPaintでテキストを描画します。 void CSubDlg::OnPaint() { // テキストをクライアント領域の中央に描画 CRect rect; GetClientRect(rect); CPaintDC dc(this); dc.TextOut(m_strText, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }

  • 仮想リストコントロールの表示

    お世話になります、fujitomoです。 今回ご意見を頂きたいと思い、質問させて頂きましたのはVCでの仮想リストコントロールにデータを表示する件に関してです。 具体的に申し上げますと、 あるデータが記述されたcsvファイルがあり、そのcsvファイルのある位置から200件のデータを仮想リストコントロールに表示させたいと思っています。 そこで、私が考えたアプリケーションの作りとして、初めにcsvファイルからデータを読み込んでCStringの二次元配列に各セルのデータを保存します。 そしてLVN_GETDISPINFOを受ける関数を作成し、そこでリストコントロールにCStringの二次元配列の値を当てはめていこうと思っています。つまり、関数内でリストの項目とCStringの二次元配列を1対1に対応させています。 しかしここで、LVN_GETDISPINFOを受ける関数は常にCStringの二次元配列の1行目から見てしまい、例えば、リストコントロールに100行目からのデータを表示させたいと思い、LVN_GETDISPINFOを受ける関数内でリストコントロールに表示させる開始行を指定したとしても0~99行目までが空白となって表示されてしまいます。目的の動作としては100行目からの200行をリストに表示させたいと思っているのでこれではダメです。 仮想リストコントロールを使うのは初めてで、どのように使うのが定石なのか分からない為悩んでいるのですが、私の目的の動作を達成させるためには表示させたい200行分のデータをその都度CStringの二次元配列に格納し、その配列とリストの項目をLVN_GETDISOINFOを受ける関数内で対応させるべきなのでしょうか? 文章だけではかなり分かりづらいと思うので、大雑把にですがソースを載せます。 //メンバ変数 CString data[gyo][row] //データを保存するCString二次元配列 CListCtrl m_list; //リストコントロールのコントロール変数 int start; //リスト表示行 //ダイアログの初めに BOOL C***Dlg::OnInitDialog() { CDialog::OnInitDialog(); Read_File(); //csvファイルをCStringの二次元配列に保存 m_list.SetItem(200);//200件表示に設定 return TRUE; } LRESULT C***Dlg::DefWindowProc(UINT message,WPARAM wParam,LPARAM lParam) { switch(message) case WM_NOFITY: return OnGetListInfo(lParam); } return CDialog::DefWindowProc; } LRESULT C***Dlg::OnGetListInfo(LPARAM lParam) { LPNMHDR lpnmh = (LPNMHDR)lParam; CWnd* hwndListView = GetDlgItem(IDC_LIST1); LV_DISPINFO* lpDInfo; switch(lpnmh->code){ case LVN_GETDISPINFO: lpDInfo = (LV_DISPINFO*)lParam; if(lpDInfo->iItem.mask & LVIF_TEXT){ if(lpDInfo->item.iItem >= start){     switch(lpDInfo->item.iSubItem){ case 0: _tcscpy_s(lpDInfo->item.pszText,256, data[lpDinfo->item.iItem][lpDinfo->item.iSubItem]; break; } } } break; } return 0; } といったソースとなっています。 ご意見を宜しくお願い致します。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。 ご回答をお待ちしております。

  • BCC5.5とBCCFormを使用し、実行ファイルを作成したが、実行できません。

    当方、只今C言語でWin32APIを呼び出し、Windowsアプリを開発中です。 そこで質問なのですが、以下の手順で作業した場合、抽出される実行ファイルが実行できません。 どなたかお分かりになる方、助言の方よろしくお願いします。 1.名前、住所をリッチテキストに入力し、OKボタンを押下後、メッセージボックス  にて”○○さんの住所は○○です”と表示されるソースコードを"bcc32 -W source.cpp"でコンパイル。 2.BCCFormで作成したリソースファイルを"brc32 dialog.rc source.exe"で結合。 3.source.exeを実行するが、動作しない。 ちなみに環境はWindowsXPSP3です。 下記にまず、ソースコードを表示します。 /* ソース */ /* ファイル名 source.cpp */ #if 1 /* ダイアログボックスを出す */ #include <windows.h> #include "Resdialog.h" BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { DialogBox(hCurInst, "MYDLG", NULL, (DLGPROC)MyDlgProc); return 0; } BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { char szBuf[128], szBuf1[64], szBuf2[64]; switch(msg){ case WM_COMMAND: switch (LOWORD(wp)){ case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDOK: GetDlgItemText(hDlg, IDC_RICHEDIT102, szBuf1, (int)sizeof(szBuf1)); GetDlgItemText(hDlg, IDC_RICHEDIT103, szBuf2, (int)sizeof(szBuf2)); wsprintf(szBuf, "あなたの住所は%sで、氏名は%sです", szBuf1, szBuf2); MessageBox(hDlg, szBuf, "ダイアログボックス", MB_OK); return TRUE; } return FALSE; } return FALSE; } #endif そして、リソーススクリプトです。 /* リソーススクリプト */ /* ファイル名 dialog.rc */ //----------------------------------------- // BCCForm Ver 2.41 // An Easy Resource Editor for BCC // Copyright (c) February 2002 by ysama //----------------------------------------- #include "Resdialog.h" //---------------------------------- // ダイアログ (MYDLG) //---------------------------------- MYDLG DIALOG DISCARDABLE 0, 0, 270, 117 EXSTYLE WS_EX_DLGMODALFRAME STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT CAPTION "Form" FONT 8, "MS 明朝" { CONTROL "名前", IDC_LABEL100, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 10, 46, 18 CONTROL "住所", IDC_LABEL101, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 41, 47, 17 CONTROL "", IDC_RICHEDIT102, "RICHEDIT", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 88, 8, 159, 25 CONTROL "", IDC_RICHEDIT103, "RICHEDIT", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 88, 40, 160, 24 CONTROL "OK", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 49, 85, 61, 18 CONTROL "Cancell", IDCANCELL, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 165, 84, 56, 18 } そして、リソースヘッダです。 /* リソースヘッダ */ /* ファイル名Resdialog.h */ //----------------------------------------- // BCCForm Ver 2.41 // Header File for Resource Script File // Copyright (c) February 2002 by ysama //----------------------------------------- //--------------------- // ダイアログリソース //--------------------- // ダイアログ MYDLG #define IDC_LABEL100 100 #define IDC_LABEL101 101 #define IDC_RICHEDIT102 102 #define IDC_RICHEDIT103 103 #define IDCANCELL 105 //--------------------- // メニューリソース //--------------------- //--------------------- // イメージリソース //--------------------- //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //-------------------- //------------------ // ヴァージョン情報 //------------------ 上記のようになってます。 どうかご教授の方、宜しくお願いします。

  • BCC5.5でコンパイル、BCCFormで作成した実行ファイルが実行できません。

    当方、只今C言語でWin32APIを呼び出し、Windowsアプリを開発中です。 そこで質問なのですが、以下の手順で作業した場合、抽出される実行ファイルが実行できません。 どなたかお分かりになる方、助言の方よろしくお願いします。 1.名前、住所をリッチテキストに入力し、OKボタンを押下後、メッセージボックス  にて”○○さんの住所は○○です”と表示されるソースコードを"bcc32 -W source.cpp"でコンパイル。 2.BCCFormで作成したリソースファイルを"brc32 dialog.rc source.exe"で結合。 3.source.exeを実行するが、動作しない。 ちなみに環境はWindowsXPSP3です。 下記にまず、ソースコードを表示します。 /* ソース */ /* ファイル名 source.cpp */ #if 1 /* ダイアログボックスを出す */ #include <windows.h> #include "Resdialog.h" BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { DialogBox(hCurInst, "MYDLG", NULL, (DLGPROC)MyDlgProc); return 0; } BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { char szBuf[128], szBuf1[64], szBuf2[64]; switch(msg){ case WM_COMMAND: switch (LOWORD(wp)){ case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDOK: GetDlgItemText(hDlg, IDC_RICHEDIT102, szBuf1, (int)sizeof(szBuf1)); GetDlgItemText(hDlg, IDC_RICHEDIT103, szBuf2, (int)sizeof(szBuf2)); wsprintf(szBuf, "あなたの住所は%sで、氏名は%sです", szBuf1, szBuf2); MessageBox(hDlg, szBuf, "ダイアログボックス", MB_OK); return TRUE; } return FALSE; } return FALSE; } #endif そして、リソーススクリプトです。 /* リソーススクリプト */ /* ファイル名 dialog.rc */ //----------------------------------------- // BCCForm Ver 2.41 // An Easy Resource Editor for BCC // Copyright (c) February 2002 by ysama //----------------------------------------- #include "Resdialog.h" //---------------------------------- // ダイアログ (MYDLG) //---------------------------------- MYDLG DIALOG DISCARDABLE 0, 0, 270, 117 EXSTYLE WS_EX_DLGMODALFRAME STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT CAPTION "Form" FONT 8, "MS 明朝" { CONTROL "名前", IDC_LABEL100, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 10, 46, 18 CONTROL "住所", IDC_LABEL101, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 41, 47, 17 CONTROL "", IDC_RICHEDIT102, "RICHEDIT", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 88, 8, 159, 25 CONTROL "", IDC_RICHEDIT103, "RICHEDIT", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 88, 40, 160, 24 CONTROL "OK", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 49, 85, 61, 18 CONTROL "Cancell", IDCANCELL, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 165, 84, 56, 18 } そして、リソースヘッダです。 /* リソースヘッダ */ /* ファイル名Resdialog.h */ //----------------------------------------- // BCCForm Ver 2.41 // Header File for Resource Script File // Copyright (c) February 2002 by ysama //----------------------------------------- //--------------------- // ダイアログリソース //--------------------- // ダイアログ MYDLG #define IDC_LABEL100 100 #define IDC_LABEL101 101 #define IDC_RICHEDIT102 102 #define IDC_RICHEDIT103 103 #define IDCANCELL 105 //--------------------- // メニューリソース //--------------------- //--------------------- // イメージリソース //--------------------- //--------------------- // ストリングテーブル //--------------------- //-------------------- // アクセラレーター //--------------------

  • access vbaで前景色を指定したい

    ラベルの前景色をテーブルに設定した値で指定したいのですが、 テーブルにはどのように値を登録し、コードではどう記述したらいいのでしょうか? *****希望するコーディング***** フィールドの値を取得 DIM colorNo AS long colorNo = tbl!COLORNO ラベルコントロール名.ForeColor = colorNo  ←このように変数にしたい ****************************** ラベルコントロール名.ForeColor = RGB(255, 0, 0) で通るのですが、RGB(255, 0, 0)の部分を変数にしたいのです。 RGB(255, 0, 0)を設定するテーブルはテキスト型なので、 直接テーブルに、値を"RGB(255, 0, 0)"と登録すると型変換になりました。 ご教授お願いします。

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

    いつもお世話になっております。 構築環境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; }

  • リッチエディットのやり方が解りません

    リッチエディットのやり方が解りません  相談するのは2回目です。今回は書籍『猫でもわかるWindowsプログラミング』について不明な点があるので、相談に伺いしました。当方の環境はBCC Developerなのですが、第14章のデスクトップアクセサリのプログラムをすべて打ち込んだのに実行できないのです。エラーメッセージと該当箇所は以下の通りです。 (1)エラーメッセージ Error desktop01t.rc 52 27: Expecting control window style ** error 20018 ** deleting Debug\desktop01t.res (2)該当箇所(リソース) 38|MYDLG DIALOGEX 0, 0, 131, 218 39|STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | 40| WS_POPUP | WS_CAPTION | WS_SYSMENU 41|CAPTION "予定表" 42|FONT 9, "MS ゴシック", 400, 0//, 0x80 43|BEGIN 44| EDITTEXT IDC_EDIT1,7,121,117,14,ES_AUTOHSCROLL 45| EDITTEXT IDC_EDIT2,7,135,117,14,ES_AUTOHSCROLL 46| EDITTEXT IDC_EDIT3,7,149,117,14,ES_AUTOHSCROLL 47| EDITTEXT IDC_EDIT4,7,163,117,14,ES_AUTOHSCROLL 48| EDITTEXT IDC_EDIT5,7,177,117,14,ES_AUTOHSCROLL 49| DEFPUSHBUTTON "記入",IDOK,7,197,50,14 50| PUSHBUTTON "閉じる",IDCANCEL,74,197,50,14 51| CONTROL "",IDC_MONTHCALENDER1, 52| "SysMonthCal32",MCS_NOTODAY | 53| MCS_NOTODAYCIRCLE | WS_TABSTOP,7,7,117,89 54| LTEXT "",IDC_MYSTATIC,7,103,83,11 55| PUSHBUTTON "本日",IDC_TODAY,98,100,26,19 56|END  情報を漁ってみて<a href="http://questionbox.jp.msn.com/qa5414346.html ">richedit.hを追加すべきという情報</a>を見つけたのでプログラムの方で、 #include <windows.h> #include <windowsx.h> #include <commctrl.h> #include <richedit.h> #include "resource.h" としたのですがエラー内容は変わりません。そもそもBCC Developerではライブラリファイルしかリンクできないので、必要とされるriched32.dllを手動で無い方法でプログラムに取り込む方法が解らないのです。手動であればサイトの方の<a href="http://www.kumei.ne.jp/c_lang/sdk2/sdk_122.htm">「猫でも」の第122章</a>が該当するようですが、riched32.dllは提供されているダイナミックリンクライブラリなので方法があると思うのです。どうか取り込み方のご教授をお願いいたします。なおライブラリファイルしかリンクできないと思ったので、当初はriched20.libをリンクしてエラーを出しておりました。

専門家に質問してみよう