dポイントプレゼントキャンペーン実施中!

Borland C++5.5 FreeVersion XP SP3の環境でAPIの練習中なのですが。
WM_NOTIFYのメッセージクラッカーってできるのでしょうか?
windowsx.hのヘッダーを見ても見当たりません。
commctrl.hの中にそれらしきものがあるので試しに追加してもダメでした。
----------------------------------------------------------------------------
//====== WM_NOTIFY Macros =====================================================

#define HANDLE_WM_NOTIFY(hwnd, wParam, lParam, fn) \
(fn)((hwnd), (int)(wParam), (NMHDR FAR*)(lParam))
#define FORWARD_WM_NOTIFY(hwnd, idFrom, pnmhdr, fn) \
(LRESULT)(fn)((hwnd), WM_NOTIFY, (WPARAM)(int)(idFrom), (LPARAM)(NMHDR FAR*)(pnmhdr))
----------------------------------------------------------------------------
とあるので、次のように宣言をしたのですが
//プロトタイプ宣言
void Cls_OnTreeNotify(HWND,int,(NMHDR FAR*));
//メッセージクラッカー宣言
HANDLE_MSG(hWnd, WM_NOTIFY, Cls_OnTreeNotify);
//実際の定義
void Cls_OnTreeNotify(HWND hwnd, int idFrom, (NMHDR FAR*)pnmhdr )
{
}
でコンパイルしたのですが、次のようなコンパイルエラーが発生します。
"未定義のシンボル HWND"

追加した部分(WM_NOTIFY)以外のメッセージクラッカーはWM_PAINT,WM_CREATEは正常にコンパイルできます。
WM_NOTIFYのメッセージクラッカーはできるのでしょうか。
ご教授お願いします。

A 回答 (1件)

前回、テストしたコードに追加してみました。


# http://oshiete.goo.ne.jp/qa/6394239.html

ただし、こちらの環境はVC++2008EEですが…。

#include <windows.h>
#include <windowsx.h>
#include <COMMCTRL.h>
をインクルード。

プロトタイプは
int Cls_OnTreeNotify(HWND,int,NMHDR FAR*);
に、
WndProc()には
HANDLE_MSG(hWnd, WM_NOTIFY, Cls_OnTreeNotify);

実装は
int Cls_OnTreeNotify(HWND hwnd, int idFrom, NMHDR FAR* pnmhdr)
{
return 0;
}
で、コンパイルも実行もできています。
# すべての通知に対して0を返却しているので…動作おかしくなるかも知れませんけど。

「(NMHDR FAR*)」の括弧を削除しないと、VC++2008EEではコンパイルエラーとなっていました。
windowsx.hをインクルードしていないと、「error C3861: 'HANDLE_MSG': 識別子が見つかりませんでした」のエラーとなります。
    • good
    • 0
この回答へのお礼

Wr5さんありがとうございます。
当方でも、()を外しましたらエラーが取れました。
プロトタイプ宣言時・実装時に()を付与するとあまり良くないのですね。

LRESULT OnTreeNotify(HWND, int, NMHDR FAR*);
HANDLE_MSG(hWnd, WM_NOTIFY, OnTreeNotify);
LRESULT OnTreeNotify(HWND hwnd, int idFrom, NMHDR FAR* pnmh )
{
処理
return 0L; // 必須←戻り値をつけないとマウスカーソル及びTreeViewの処理の不具合発生
}

で、正常に動作することを確認しました。

お礼日時:2010/12/24 10:09

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