• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:リッチエディットのUPDATEメッセージ受け取り方)

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

birの回答

  • ベストアンサー
  • bir
  • ベストアンサー率44% (11/25)
回答No.1

TODOの日本語は難しいですね(^_^; 意味的には、 通知を受け取るために、RichEditコントロールに EM_SETEVENTMASK メッセージを投げなさい。 その際の lParam には ENM_UPDATE という値の論理和をとりましょう。 これを CDialog::OnInitDialog() 関数をオーバーライドしてそこに書きなさい。 というようなことでしょうか。 RichEditコントロールの通知メッセージはイベントマスクというもので管理されていて、それをうまく設定してやらないとメッセージが通知されないのですね。 コードではこんな感じになります。 dwEventMask = SendMessage(hRichEdit, EM_GETEVENTMASK, 0, 0); dwEventMask |= ENM_UPDATE; SendMessage(hRichEdit, EM_SETEVENTMASK, 0, (LPARAM)dwEventMask); RichEditコントロールに変数が割り当ててある場合はこんな感じでしょうか。 dwEventMask = m_ctlRichEdit.GetEventMask(); dwEventMask |= ENM_UPDATE; m_ctlRichEdit.SetEventMask(dwEventMask); MSDN onlineにいろいろ情報が載ってるのでそちらを参照してください。 日本語サイトは情報量が少ないので、英語サイトをオススメします。

参考URL:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/hh/winui/richedit_6qer.asp
ystk
質問者

お礼

おかげさまで解決しました。 イベントマスクかー。まだまだ知らないことが多すぎると痛感。 オンラインヘルプもこれからは活用したいと思います。 英語を読む努力も必要ですね。 いつもいつも私の拙い質問に丁寧な回答を頂き本当にありがとうございます。 m(_ _)m

関連するQ&A

  • エディットコントロールのイベントハンドラ

    開発環境 ・Windows XP (32bit) ・Visual C++ 2005 以下内容でCEditの派生クラスを作成したところ、 その派生クラスを使用するダイアログで EN_CHANGEイベントがキャッチ出来ませんでした。 どうすればキャッチ出来るようになるでしょうか? アドバイス頂けると大変ありがたいです。 ※エディットコントロールに文字を入力すると  以下(1)の処理には来るのですが、  以下(2)の処理には来ませんでした。 //------------------------------------------------ // EditEx.h //------------------------------------------------ // CEditの派生クラス class CEditEx : public CEdit { public:     CEditEx(void);     virtual ~CEditEx(void); //------------------------------------------------ // EditEx.cpp //------------------------------------------------ // CEditExクラス内でEN_CHANGEイベントを処理 BEGIN_MESSAGE_MAP(CEditEx, CEdit)     ON_CONTROL_REFLECT(EN_CHANGE, &CEditEx::OnEnChange) END_MESSAGE_MAP() // EN_CHANGEイベントハンドラ void CEditEx::OnEnChange(void) {     // (1) } //------------------------------------------------ // DialogEx.h //------------------------------------------------ // CEditExクラスをメンバに持つダイアログ class CDialogEx : public CDialog { private:     CEditEx m_Edit1; //------------------------------------------------ // DialogEx.cpp //------------------------------------------------ // CDialogExクラス内でもEN_CHANGEイベントを処理したい BEGIN_MESSAGE_MAP(CDialogEx, CDialog)     ON_EN_CHANGE(IDC_EDIT1, &CDialogEx::OnEnChangeEdit1) END_MESSAGE_MAP() // EN_CHANGEイベントハンドラ void CDialogEx::OnEnChangeEdit1(void) {     // (2) }

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

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

  • コントロールでのフォーカスの取得

    WNDOWSXP + VC++2010Express + SDKです。VC++ExpressなのでMFCなどは使えません。 ウィンドウのフォーカスの取得方法について質問します。 メインウィンドウにコントロールを3つ貼り付けます。 エディットコントロール2つと、自分で作成したコントロールが1つです。 自分で作成したコントロールのウィンドウプロシージャは仮に↓こんなものだとします。 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { if(message==WM_KEYDOWN) { if(wParam=='A'){ MessageBox(NULL,_T("A"),_T("KEYDOWN"),NULL); } return 0; } return DefWindowProc(hWnd, message, wParam, lParam); } プログラムを起動し、エディットコントロールAをクリックすると エディットコントロールAにフォーカスが移動します。 キーボードのAボタンを押下すると、エディットコントロールAに「a」と入力されます。 エディットコントロールB、自分で作成したコントロールは無反応です。 エディットコントロールBをクリックすると、エディットコントロールBにフォーカスが移動します。 キーボードのAボタンを押下すると、エディットコントロールBに「a」と入力されます。 エディットコントロールA、自分で作成したコントロールは無反応です。 次に、自分で作成したコントロールをクリックした場合、 フォーカスはエディットコントロールBにあります。キーイベントなども エディットコントロールBのみが反応します。 ここで、自分で作成したコントロールをクリックした場合に 自分で作成したコントロールがフォーカスを取得し、 キーイベントなどを独占的に受け取れるようにしたいのですが、方法がわかりません。 どなたか方法をご存知の方がいらっしゃいましたら、ご教授いただけないでしょうか。

  • ダイアログの上のテキストボックスの、初期値を設定する方法が分かりません・・・・

    VSC++2005です、 ダイアログの上のテキストボックスの初期値を設定する 方法が分かりません、 ダイアログが表示されたとき、 ダイアログに貼り付けてあるテキストボックスの初期値を 入力しておきたいのですが、うまくゆきません 下のようにしました、 ボタンをクリックして、ダイアログを表示させ ダイアログ上の エディットコントロールに、値を表示させるつもりですが、 void CXXXView::OnBnClickedButton2() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 Cfailsettei cf;  //ダイアログのクラスのインスタンス作成 cf.edit1.SetWindowTextA("yyy");   cf.edit2.SetWindowTextA("xxx"); //edit1、edit2は、エディットコントロールです cf.DoModal(); } エラーが起こってしまいます、 何故でしょうか? よろしくお願いします。

  • イベントハンドラが取得できない VC++ MFC

    おはようございます(><) VC++.NETで開発を行っています。 MFCを使って開発をしています。 CDialogを継承したCmyDialogでOnLButtonDownのイベントがとれません。 OnLButtonDownのイベントを使いたかったのですが 自動でイベントを設定するプロパティのメニュー(雷のマークみたいなもの)にイベントがなかったので 自分でCmyDialog::と書いたらリストの中に OnLButtonDown( UINT nFlags,CPoint point)がでたので 定義に追加、イベントの記述を追加しました。 雷マークで作ったイベントのコードには // TODO : ここにコントロール通知ハンドラ コードを追加します。 と自動で記述され、ブレイクポイントを設定するとそこで止まるのですが 私が記述したLButtonDownのイベントでは実行してもブレイクポイントで止まりません。 他のイベントと比べて違うのは BEGIN_MESSAGE_MAP(CmyDialog, CDialog)の中に ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnLvnColumnclickList1) のように イベントハンドラ名、リソース名?、イベント名 と自動で記述があります。 ここを追加すればいいのかなと思いましたが 左クリックに対応するイベントハンドラ名が分かりません。 問題解決に有効な情報をお持ちの方 お力をお貸しください。 よろしくお願いします(><)

  • Warning: initial dialog data is out of range. と言う警告について

    VC++ 6.0 MFC ダイアログベースです。 メインダイアログで、あるボタンをクリックすると、別のダイアログが開くと言う物を作っているのですが、 「F5キー」でデバックし、メインダイアログから別のダイアログを開くと、 Warning: initial dialog data is out of range. と言うメッセージがデバックのメッセージウィンドウにでていました。 これはどういった警告なのでしょうか?よろしくお願い致します。 また、どこを見る必要があるのでしょうか? (1)警告メッセージが出るのは selectingdlg->DoModal(); で出ていました。 (2)OnInitDialog()の中身を全部削除しても、(下記状態)同様の警告が出ました。 (3)最初のころはこのような警告はなく、最近になって見つけたのですが、何を追記した時かが自分でももお解らなくなってしまいました・・・。 よろしくお願い致します。 void CMainDlg::Onbutton1() {   selectingdlg->DoModal(); } BOOL CChildDlg::OnInitDialog() {   CDialog::OnInitDialog();   // TODO: この位置に初期化の補足処理を追加してください   return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります          // 例外: OCX プロパティ ページの戻り値は FALSE となります }

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

    リッチエディットのやり方が解りません  相談するのは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をリンクしてエラーを出しておりました。

  • OnTimerの使い方

    <環境> WIN98 VC++6.0 MFC  こんな感じで3秒経過するとメッセージボックスを表示していますが、 メッセージボックスのOKボタンを何度も押さないとメッセージボックスが 閉じない時が有ります。 (どうやらメッセージボックスが何個も作られている) どうしてなのでしょうか? BOOL CAbcDlg::OnInitDialog() { // TODO: 特別な初期化を行う時はこの場所に追加してください。 SetTimer(1, 1000, NULL); m_cnttime = 0; 略 void CAbcDlg::OnTimer(UINT nIDEvent) { m_cnttime++; if ( m_cnttime >= 3 ) { AfxMessageBox(""); KillTimer(nIDEvent); } CDialog::OnTimer(nIDEvent); }

  • VC++でコンボボックスに動的に値を表示させたいです。助けてください(^^;)

    コンボボックスをリソースヴューで作った後、それをダブルクリックしたら void CCommentDialog::OnEditchangeCombo1() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください } とでましたので void CCommentDialog::OnEditchangeCombo1() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください m_combo1.ResetContent(); for(i=0;i<2;i++) m_combo1.InsertString(-1,test_name[i]); } とした後、実行しましたがまったくtest_nameがコンボボックスに表示されませんでした。 しかたなく動的は諦めて、m_combo1.InsertString(-1,"abc"); と変更して実行してもなにもコンボボックスに表示されません。 開いても空なのです。 どうすれば良いでしょうか?

  • ちょっと質問を変えてみました。

    以前にテキストエディタを作成して、問題が発生したと質問をしたものですが、内容を少し変えて質問をさせていただきます。 現在MDIでのテキストエディタを作成中なのですが、このソフトに文字列検索機能をつけたいと考えています。 そして自分で一応はプログラムが組めていますが、一箇所だけ理解不能な部分が現れました。 例えば、エディットコントロールに、「goo  goo  goo」とこのように記述されているとします。 そのときに文字列検索で「goo」と検索した場合、自分のプログラムでは3回「次を検索」のボタンを押すと「最後まで検索しました」とメッセージボックスで表示されました。 またどんな文字列がエディットコントロールに記述されたとしても、検索文字を発見された個数分検索を行い最後にメッセージボックスが表示されます。 よって動作としては完璧なのですが、表示に問題が発生しました。 「次を検索」のボタンを押しても、検索対象文字列(エディットコントロールに記述されている文字列)が選択状態にならないのです。 以下に選択状態にするためのプログラムを記述します。 (1)クライアントウィンドウ内でZオーダーがトップ(一番手前に表示されている)のドキュメントウィンドウハンドルを取得。 (2)そのドキュメントウィンドウの子ウィンドウにあたるエディットコントロールハンドルを取得。 (3)そのエディットコントロールハンドルに向けてSendMessage(エディットコントロールハンドル, EM_SETSEL, 検索された文字列の先頭位置, 検索された文字列の最後の位置); を行う。 この手順により検索された文字列を選択状態にしているのですが、表示としては選択状態になりません。何が間違えているのでしょう? ちなみに表示はされないだけで、何かしら選択状態にはなっているのか?と疑問を持ったため、上の手順の後に下のプログラムを記述してみました。 SendMesssage(エディットコントロールハンドル, EM_GETSEL, (WPARAM)&Start, (LPARAM)&End); このプログラムを実行した場合、上で一応選択状態にした文字列(ディスプレイ上では選択状態には見えない)の開始位置と終了位置が正確にStartとEndに格納されました。 EM_GETSELは現在選択されている文字列の開始位置と終了位置を取得するメッセージであるためエディットコントロール内の検索された文字列は選択状態になっているといえます。 しかしディスプレイ上では選択状態として表示がされません。なぜ表示されないのでしょう? ちょっと大雑把に説明してしまいましたが、質問があれば返信を行いますので、よろしくお願いします。