• ベストアンサー

WNDPROC をクラスのメンバにもちたいです

ツリーコントロールをクラスにラップしたいのですが、 クラス内のメンバで WNDPROC PrevProc; とすると、 error C2597: 静的でないメンバ 'TreeControlClass::PrevProc' への参照が正しくありません。 というエラーが表示されます。 どうにかできないでしょうか? クラスの外に変数宣言するしかダメでしょうか? よろしくお願いします。 Visual C++.NETで開発 #include<Commctrl.h> class TreeControlClass { private: HWND TreeWnd; WNDPROC PrevProc; public: void WindowCreate(HWND ParentWnd,RECT Rect) { DWORD Style; Style=WS_VISIBLE|WS_CHILD|WS_BORDER|TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT; int x,y,width,height; x=Rect.left; y=Rect.top; width=Rect.right-Rect.left; height=Rect.bottom-Rect.top; TreeWnd=CreateWindow(WC_TREEVIEW,"",Style,x,y,width,height,ParentWnd,NULL,NULL,NULL); PrevProc=(WNDPROC)GetWindowLong(TreeWnd,GWL_WNDPROC); SetWindowLong(TreeWnd,GWL_WNDPROC,(LONG)TreeProc); return; } void WindowDestroy() { SetWindowLong(TreeWnd,GWL_WNDPROC,(LONG)PrevProc); DestroyWindow(TreeWnd); return; } static LRESULT CALLBACK int TreeProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { default: return (CallWindowProc(PrevProc, hWnd, message, wParam, lParam)); } } };

質問者が選んだベストアンサー

  • ベストアンサー
  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.3

#1 です。 だから、実体を用意しなきゃダメなんですよ。 WNDPROC TreeControlClass::PrevProc = NULL; の一行が必要です。

HokUebun
質問者

お礼

お騒がせしました。 SetProp関数を使用して無事にクラス化することができました。 こういうときに使うのかと思いました。 ありがとうございました。 http://techtips.belution.com/ja/vc/0009/ を参考にしました。

HokUebun
質問者

補足

回答ありがとうございます。 static WNDPROC PrevProc = NULL; WNDPROC PrevProc = NULL; とクラス内部のprivate:でどちらも宣言しましたが、 error C2864: 'PrevProc' : const 静的整数データ メンバ以外をクラスまたは構造体内で初期化することはできません。 というエラーになりました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.4

もう解決されていますが、一言言っておきます。 #3の補足。 クラスの中でstatic宣言している場合は、外で実体を宣言しないとダメなのです。 class TreeControlClass { private: static WNDPROC PrevProc; : } WNDPROC TreeControlClass::PrevProc = NULL; という風にしないとねっ 分かりましたか?

HokUebun
質問者

お礼

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

HokUebun
質問者

補足

回答ありがとうございます。 分かりました。 みなさん、ありがとうございました。

すると、全ての回答が全文表示されます。
  • nitscape
  • ベストアンサー率30% (275/909)
回答No.2

以下のようにしてはどうでしょうか? class TreeControlClass;/// TreeControlClass* g_pTreeControlClass;/// class TreeControlClass { private: HWND TreeWnd; WNDPROC PrevProc; public: void WindowCreate(HWND ParentWnd,RECT Rect) { DWORD Style; Style=WS_VISIBLE|WS_CHILD|WS_BORDER|TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT; int x,y,width,height; x=Rect.left; y=Rect.top; width=Rect.right-Rect.left; height=Rect.bottom-Rect.top; TreeWnd=CreateWindow(WC_TREEVIEW,"",Style,x,y,width,height,ParentWnd,NULL,NULL,NULL); PrevProc=(WNDPROC)GetWindowLong(TreeWnd,GWL_WNDPROC); g_pTreeControlClass = this;///// SetWindowLong(TreeWnd,GWL_WNDPROC,(LONG)TreeProc); return; } void WindowDestroy() { SetWindowLong(TreeWnd,GWL_WNDPROC,(LONG)PrevProc); DestroyWindow(TreeWnd); return; } //関数追加 LRESULT TreeProc_(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { //ここで処理 return (CallWindowProc(PrevProc, hWnd, message, wParam, lParam)); } static LRESULT TreeProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)//変更 { return g_pTreeControlClass->TreeProc_(hWnd,message,wParam,lParam); //変更 } };

HokUebun
質問者

お礼

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

HokUebun
質問者

補足

回答ありがとうございます。 クラスの外での宣言は必要になるのですね。 クラス内部で情報を保持することはできないでしょうか?

すると、全ての回答が全文表示されます。
  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

PrevProcをstaticにしちゃだめなのかい?

HokUebun
質問者

お礼

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

HokUebun
質問者

補足

回答ありがとうございます。 staticにすると main.obj : error LNK2001: 外部シンボル ""private: static long (__stdcall* TreeControlClass::PrevProc)(struct HWND__ *,unsigned int,unsigned int,long)" (?PrevProc@TreeControlClass@@0P6GJPAUHWND__@@IIJ@ZA)" は未解決です。 Debug/Diary.exe : fatal error LNK1120: 外部参照 1 が未解決です。 というエラーが表示されます。

すると、全ての回答が全文表示されます。

関連するQ&A