generic CwndでPostMessageが投げられない – プログラミング – Home

通知
すべてクリア

[解決済] generic CwndでPostMessageが投げられない


AttA
 AttA
(@AttA)
ゲスト
結合: 14年前
投稿: 3
Topic starter  

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に移すと正常にポストできます。


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

generic CWnd ってなんですか?

VC++6なんてもうずいぶん見てないので推測で言いますが、ひょっとして、クラスの追加
ウィザードで「MFCクラス」じゃなくて「C++クラス」か何かで追加してます?
で、どうやって CMyWnd クラスのインスタンスを作っているんでしょうか?

func の中で m_hWnd を見て、正しくない値( NULL とか 0xcdcdcdcd とか)になってい
るとしたら、何か必要なステップが欠けています。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

どのようにしてCMyWnd の変数を使っていますか?

ウィンドウハンドルに関連する操作を行うのであれば
>それともCreate関数で、Createしてからでなければいけないのでしょうか?
は当然必要です。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

CWndというクラスはウインドウを抽象化したクラスですが、
ウインドウその物では有りません。
クラスのインスタンスを作成しただけではウインドウは生成されませんから
当然、ウインドウハンドルもまだ有りません。
実際にウインドウを生成する為にはCreateする必要があります。

また、既に表示されているウインドウと新に作ったクラスのインスタンスは
無関係で、別々のオブジェクトになります。
同じクラスのインスタンスを作成したからといって既に表示されている
ウインドウを指し示す状態にはなっていないので注意が必要です。
インスタンスを作成した直後はどのウインドウも指していない状態です。
Createする事でウインドウが生成され、そのウインドウを指し示す状態に
なります。

こういった考え方は基本的な部分になるのできちんと整理された書籍等で
勉強した方が良いかもしれません。


返信引用
AttA
 AttA
(@AttA)
ゲスト
結合: 14年前
投稿: 3
Topic starter  

回答ありがとうございます。

>ウィンドウハンドルに関連する操作を行うのであれば
>>それとも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 とか)
>になっているとしたら、何か必要なステップが欠けています。

おっしゃる通りです。
どのようにすれば正しく取得できるのかが問題です。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

PostMessageは後回しにして・・・

CMyWndは表示できていますか?

できていないなら、Createの戻り値などを調べてくみてください


返信引用
AttA
 AttA
(@AttA)
ゲスト
結合: 14年前
投稿: 3
Topic starter  

PostMessageではなく、ウィンドウの振る舞いの問題のようなので、
そちらをもう少し調べてみます。

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました