CWnd::PostMessageがエラーとなるので質問させていただきます。
まずVC++6.0 MFCのダイアログベースでプロジェクトを作成します。
ダイアログはCMyDlgクラスとします。
generic CwndクラスCMyWndを新規作成してプロジェクトに追加します。
CMyWndクラス内に以下のコードを書いたところ、
PostMessageを受け取れませんでした。
///////////////////////////////////////////
//MyWnd.h
///////////////////////////////////////////
#define WM_READ WM_APP+100
/////////////////////////////////////////////
class CMyWnd : public CWnd
{
・・・
public:
void func();
protected:
//{{AFX_MSG(CBoard)
//}}AFX_MSG
afx_msg LRESULT OnRead(WPARAM,LPARAM);
DECLARE_MESSAGE_MAP()
・・・
}
///////////////////////////////////////////
//MyWnd.h
///////////////////////////////////////////
CWnd* pwnd; //グローバル
//メッセージマップ
BEGIN_MESSAGE_MAP(CBoard, CWnd)
//{{AFX_MSG_MAP(CBoard)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_READ, OnRead)
END_MESSAGE_MAP()
/////////////////////////////////////////////
//メッセージのポスト
void CMyWnd::func()
{
pwnd = (CWnd*)this; //←原因?
if( pwnd->PostMessage( WM_READ,0,0 ) == 0 )
{
#ifdef _DEBUG
afxDump << GetLastError = << GetLastError() << \n;
#endif
}
}
/////////////////////////////////////////////
//メッセージの受取り
LRESULT OnRead(WPARAM m, LPARAM l)
{
・・・//ここに処理がまわってこない
}
上記コードのfuncは、CMyDlgから呼び出して実行します。
上記のコードではPostMessageを使う必要性は特にありません。
説明を簡単にするためのコードです。
デバッグではGetLastError = 0x578となっており、
ウィンドウハンドルの値が無効と怒られました。
generic CWndクラス内ではthisポインタで
ウィンドウハンドルを取得できないのでしょうか?
それともCreate関数で、Createしてからでなければいけないのでしょうか?
尚、PostMessasgeに関わる部分をCMyDlgに移すと正常にポストできます。
generic CWnd ってなんですか?
VC++6なんてもうずいぶん見てないので推測で言いますが、ひょっとして、クラスの追加
ウィザードで「MFCクラス」じゃなくて「C++クラス」か何かで追加してます?
で、どうやって CMyWnd クラスのインスタンスを作っているんでしょうか?
func の中で m_hWnd を見て、正しくない値( NULL とか 0xcdcdcdcd とか)になってい
るとしたら、何か必要なステップが欠けています。
どのようにしてCMyWnd の変数を使っていますか?
ウィンドウハンドルに関連する操作を行うのであれば
>それともCreate関数で、Createしてからでなければいけないのでしょうか?
は当然必要です。
CWndというクラスはウインドウを抽象化したクラスですが、
ウインドウその物では有りません。
クラスのインスタンスを作成しただけではウインドウは生成されませんから
当然、ウインドウハンドルもまだ有りません。
実際にウインドウを生成する為にはCreateする必要があります。
また、既に表示されているウインドウと新に作ったクラスのインスタンスは
無関係で、別々のオブジェクトになります。
同じクラスのインスタンスを作成したからといって既に表示されている
ウインドウを指し示す状態にはなっていないので注意が必要です。
インスタンスを作成した直後はどのウインドウも指していない状態です。
Createする事でウインドウが生成され、そのウインドウを指し示す状態に
なります。
こういった考え方は基本的な部分になるのできちんと整理された書籍等で
勉強した方が良いかもしれません。
回答ありがとうございます。
>ウィンドウハンドルに関連する操作を行うのであれば
>>それともCreate関数で、Createしてからでなければいけないのでしょうか?
>は当然必要です。
Create関数については
CWnd::Create関数をオーバーライドして、
CMyDlg側から、
CMyWnd myWnd;
myWnd.Create( STATIC, ", WS_CHILD, CRect(0,0,10,10), this, NULL );
myWnd.func();
としていますが、ウィンドウハンドルは取得できていないようです。
Createするだけではなく、他の操作をする必要があるのでしょうか?
(Cwnd::Attatchとか?)
>func の中で m_hWnd を見て、正しくない値( NULL とか 0xcdcdcdcd とか)
>になっているとしたら、何か必要なステップが欠けています。
おっしゃる通りです。
どのようにすれば正しく取得できるのかが問題です。
PostMessageは後回しにして・・・
CMyWndは表示できていますか?
できていないなら、Createの戻り値などを調べてくみてください
PostMessageではなく、ウィンドウの振る舞いの問題のようなので、
そちらをもう少し調べてみます。
ありがとうございました。