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

ツリーコントロールをクラスにラップしたいのですが、
クラス内のメンバで
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));
}
}
};

A 回答 (4件)

#1 です。


だから、実体を用意しなきゃダメなんですよ。

WNDPROC TreeControlClass::PrevProc = NULL;

の一行が必要です。

この回答への補足

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

補足日時:2005/02/07 20:30
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/08 00:16

もう解決されていますが、一言言っておきます。


#3の補足。

クラスの中でstatic宣言している場合は、外で実体を宣言しないとダメなのです。

class TreeControlClass
{
private:
static WNDPROC PrevProc;
:
}

WNDPROC TreeControlClass::PrevProc = NULL;

という風にしないとねっ
分かりましたか?

この回答への補足

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

補足日時:2005/02/08 11:15
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/08 19:52

以下のようにしてはどうでしょうか?



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)//変更
{
returng_pTreeControlClass->TreeProc_(hWnd,message,wParam,lParam); //変更
}
};

この回答への補足

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

補足日時:2005/02/07 20:27
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/08 19:51

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

この回答への補足

回答ありがとうございます。
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 が未解決です。
というエラーが表示されます。

補足日時:2005/02/07 20:00
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/08 19:51

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