ダイアログにリッチエディットボックスを貼り付けています。
文字が入力されるたびにUPDATEメッセージを受け取りたいのですが。
下記注釈の意味がわからず困っています。OnInitDialog()に何かを書くということは判るのですが。ヘルプでも見つけることが出来ませんでした。
どうかこの私でも判るよう教えてください。よろしくお願いいたします。m(_ _)m

void CCtypeDlg::OnUpdateRichedit()
{
// TODO: これが RICHEDIT コントロールの場合、コントロールは、lParam マスク
// 内での論理和の ENM_UPDATE フラグ付きで EM_SETEVENTMASK
// メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー
// ライドしない限りこの通知を送りません。
// TODO: この位置にコントロール通知ハンドラ・・・

このQ&Aに関連する最新のQ&A

A 回答 (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?ur …
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/08/24 09:15

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QGdiplus::Graphics::DrawPath()でのDT_CALCRECTに相当するもの。

表題の通りなのですが、Gdiplus::Graphics::DrawPath()を用いた描画結果の
描画範囲の矩形を取得するにはどのようにしたらいいのでしょうか?
DrawText()時にDT_CALCRECTを指定した場合と同じように、DrawPath()を
した場合の正確な矩形が知りたいのです。

環境はxp sp3のVC9になります。
よろしくお願いします。

Aベストアンサー

GraphicsPathオブジェクトの GetBoudsで取得できるのでは?

path.AddString( "Sample Text", this->Font->FontFamily,
  (int)FontStyle::Regular, 24.0f, Point( 0,0),
  StringFormat::GenericDefault );
RectangleF rcf = path.GetBounds();
といった具合で

Qboost::archive::xml_oarchiveについて

boostのコンパイルが通りません。調べられるだけ調べたのですが、原因として表示されるmake_nvpを利用しても、boost::STATIC_ASSERTION_FAILUREが発生します。わかる方ご教授お願いします。


#define BOOST_LIB_NAME boost_serialization
#include <boost/config/auto_link.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <fstream>

class FooData
{
private:
int Data;

friend class boost::serialization::access;
template <class Archive>
void serialization(Archive& ar, const unsigned int version)
{
ar & boost::serialization::make_nvp("Data",Data)
}
};

void main(void)
{
FooData data;
//アーカイブ作成
std::ofstream ofs("output.txt");
boost::archive::xml_oarchive oa(ofs);
// ファイル書き出し
oa << (const FooData&)data;
ofs.close();
}

boostのコンパイルが通りません。調べられるだけ調べたのですが、原因として表示されるmake_nvpを利用しても、boost::STATIC_ASSERTION_FAILUREが発生します。わかる方ご教授お願いします。


#define BOOST_LIB_NAME boost_serialization
#include <boost/config/auto_link.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <fstream>

class FooData
{
...続きを読む

Aベストアンサー

 まず serialization()を実装していますが、この場合 serialize()を実装して下さい。

 次に serialization()内の '&'をしている行に ';'がありません。

 それから最後に、ファイル書き出しの行を
oa << boost::serialization::make_nvp("foodata", data);

 として下さい。
 これでコンパイルは通るはずです。

QLV_ITEM構造体のメンバlParamについて

リストビューのカラムをクリックすると、落ちてしまいます。
やりたい事は、カラムをクリックするとソートするようにしたいです。
下記の(8)でLV_ITEM構造体のポインタを取得した時に
メンバlParamの値は空のまま(0)の為?
落ちてしまうのです。
どのようにしたら、値を取得できるのでしょうか??

一部ですが、問題のあるところだけ下記に明記します。
#説明上、番号を振りました。
#下記の処理は、CListCtrlクラスを継承したCxxxxクラスの関数です。
************(ここから)******************
(1)LV_ITEM lvItem;
(2)int iTemNo;

(3)for(int i = 0; i < this->GetItemCount(); i++)
(4){
(5) lvItem.iItem = i;
(6) lvItem.iSubItem = 0;
(7) lvItem.mask = LVIF_PARAM;
(8) this->GetItem(&lvItem);
(9) LPITEMPARAM lpItemParam = (LPITEMPARAM)lvItem.lParam;
(10) iTemNo = i;
(11) this->SetItem(&lvItem);
(12)}
************(ここまで)******************

環境は、Win98、MFCで作成しています。

(8)ではGetItemの戻り値で確認したら、
正常に構造体を取得できているかと思うのですが、
lParamの値は、空なんです・・・・。
また、他に必要な情報は、ございますでしょうか?
よろしくお願いします。

リストビューのカラムをクリックすると、落ちてしまいます。
やりたい事は、カラムをクリックするとソートするようにしたいです。
下記の(8)でLV_ITEM構造体のポインタを取得した時に
メンバlParamの値は空のまま(0)の為?
落ちてしまうのです。
どのようにしたら、値を取得できるのでしょうか??

一部ですが、問題のあるところだけ下記に明記します。
#説明上、番号を振りました。
#下記の処理は、CListCtrlクラスを継承したCxxxxクラスの関数です。
************(ここから)******************...続きを読む

Aベストアンサー

参考になりますかねぇ。因みに私はとっても参考になりましたけど。

参考URLから「MFCトピック集」→「リストビュー(リストコントロール)」へ。
それとlParam値を設定してアイテムを追加していると思いますが、
CListCtrlクラス中なら<this>というのは必要なのですか?

下記サイトに多くのサンプルがありますので、参考にしてみてはどうでしょうか?
http://www.codeproject.com/

参考URL:http://www.athomejp.com/goldfish/

QhDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWn

hDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWnd)の違いについて

表題について,お伺いします。
ビットマップをダイアログに表示するソースコードを
書いてますが,参考書やさまざまなHPでは,
ウィンドウハンドルをゲットする際に

hDC=::GetDC(m_hWnd) ○
↑と書かれております。

hDC=GetDC(m_hWnd)  ×
↑はなぜだめなのでしょう。

 ●このスコープ演算子::は何の為につけているのですか?

::が無いとエラーになるので必要みたいですが・・

Aベストアンサー

どういうエラー(リンクエラー、コンパイルエラー)なのかがわからないので、
あくまで憶測ですが、
Windows.hで定義されているGetDC()の他に、
別のスコープに(例えばクラスのメソッドとして)、
GetDC()が定義されているのではないでしょうか?

上記の状態でスコープ演算子がないときには、
同じクラス(スコープ)にあるGetDC()を先に呼ぶことになるので、
目的のWindows.hのGetDC()を呼ぶことができないのだと思います。

参考URL:http://wisdom.sakura.ne.jp/programming/cpp/cpp7.html

QウィンドウのないActiveXコントロールへのメッセージ通知方法

 内部的にWinsock2を使用して別のサーバアプリケーションと通信を行うActiveXコントロールを作成しています。サーバからのデータ受信を非同期で行うため、WSAAsyncSelect()関数を使用して指定したウィンドウにWinsockからイベントメッセージ(メッセージIDはWM_USER+1を使用)を通知させます。
コントロールをウィンドウなしのアクティベーション使用で開発しているので、WSAAsyncSelect()のメッセージ通知対象ウィンドウがコントロール内にありません。
コンテナによりコントロール充てにメッセージを送ってくれるということなので、コンテナのウィンドウハンドルを取得し、WSAAsyncSelect()のメッセージ通知対象ウィンドウに設定しました。が、コントロールのOnMessageWindowless()にWM_USER+1のイベントは来ていないようです。
私が試したウィンドウハンドルは、次のコードで取得できるものです。
1. AfxGetMainWnd()->m_hWnd
2. CWnd::GetActiveWindow()->m_hWnd (CWndは使用するなとありましたが)

 取得するウィンドウハンドルが間違っているのでしょうか?それとも、コンテナアプリケーションはWM_USERメッセージをコントロールに送ることができないのでしょうか?もしくは、コンテナにWM_USER+1のメッセージはコントロールへ、という設定をしてやる必要があるのでしょうか?

 なお、なぜウィンドウありのコントロールにしないかと申しますと、ウィンドウありだとコンテナ(IEを想定)に乗った直後にウィンドウが生成されず、自分のウィンドウハンドルを取得しようとするとNULLが返ってしまうからです。ユーザがマウスで一度クリックすればOKなのですが・・・オブジェクト生成時に自動的にウィンドウを生成する方法がわかりませんでした。もしこちらが分かればウィンドウありで行くこともできますので、分かる方いらっしゃいましたらお願いいたします。

 内部的にWinsock2を使用して別のサーバアプリケーションと通信を行うActiveXコントロールを作成しています。サーバからのデータ受信を非同期で行うため、WSAAsyncSelect()関数を使用して指定したウィンドウにWinsockからイベントメッセージ(メッセージIDはWM_USER+1を使用)を通知させます。
コントロールをウィンドウなしのアクティベーション使用で開発しているので、WSAAsyncSelect()のメッセージ通知対象ウィンドウがコントロール内にありません。
コンテナによりコントロール充てにメッセージを送ってく...続きを読む

Aベストアンサー

一応通知方法はあります。

ウィンドウハンドルの取得も
1.AfxGetMainWnd()->m_hWnd
2.CWnd::GetActiveWnd()->m_hWnd
ということをしなくても、ウィンドウあり
(ディフォルト)であれば、使用する前に
ひとつ関数(コンストラクタはダメ)を
呼んでやれば、きちんとm_hWndがNULL以外の
値になるはずです。
#私はいつもこの方法でウィンドウハンドルを
#取得しています。コンストラクタでは、
#どうやってもNULLになります。

ただし、この方法だと、どうしてもOCXを
使う側が一度呼び出さなければならないため、
Initialize処理としての関数呼び出しが必要に
なりますので、若干不便でしょう。

後は、不可視にしておいて、上から確実に
呼んでもらえるようにしておけば、大丈夫なはず。

どういった風にActiveXを使いたいのか
分かりませんが、一応通知することは可能
だということは分かってください。

ではでは☆


人気Q&Aランキング

おすすめ情報