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

C++のclassを、ウインドウプロシージャに渡して、制御したいのですが、上手にいきません。
具体的には、ウインドウプロシージャのWM_CREATEで
SetWindowLongPtr(hWnd,DWLP_USER,(LONG_PTR)&Common_Class);としてもビルドは通るのですが、
逆に値を取り出す時に、Common_Class=(CommonClass)GetWindowLongPtr(hWnd,GWLP_USERDATA);
などとしても、型変換がうまくいかずに、エラーとなってしまいます。
Setはうまくいっているようなのですが、getできないという悩みです。
Common_Class=GetClassLongPtr(hWnd,GCL_CBCLSEXTRA);
: error C2679: 二項演算子 '=' : 型
'DWORD' の右オペランドを扱う演算子が見つかりません (または変換できません)。

どうしたら、classを用いてウインドウプロシージャで制御できるようになるのでしょうか?s


class CommonClass
{



};

int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
CommonClass Common_Class;//ポインタでは宣言していない。

};

~略~
hWnd=CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance,&Common_Class);

ウインドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
//CreateWindow関数で作っているため、初期化は、WM_INITDIALOGではなくWM_CREATEで行う。
case WM_CREATE:
lpcs = (LPCREATESTRUCT)lParam;
memcpy(&Common_Class,lpcs->lpCreateParams,sizeof(CommonClass));

#ifdef _WIN64
SetWindowLongPtr(hWnd,DWLP_USER,(LONG_PTR)&Common_Class);
#else
SetWindowLong(hWnd,DWL_USER,(LONG)&Common_Class);
#endif

case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);

#ifdef _WIN64
Common_Class=(CommonClass)GetWindowLongPtr(hWnd,GWLP_USERDATA);
#else

Common_Class=GetClassLongPtr(hWnd,GCL_CBCLSEXTRA);

#endif

A 回答 (2件)

型が違う点については回答1でいいとして、



> SetWindowLong(hWnd,DWL_USER,(LONG)&Common_Class);
> Common_Class=GetClassLongPtr(hWnd,GCL_CBCLSEXTRA);

SetWindowLongで「(ダイアログ)ウインドウ」のユーザー領域に値を設定してるんですよね。
なぜ、GetClassLongPtrで、しかもGCL_CBCLSEXTRA(クラスに関連付けられた拡張クラスメモリのサイズをバイト単位で取得します)を指定して値を取得しようとしてるんですか?
    • good
    • 0

> SetWindowLongPtr(hWnd,DWLP_USER,(LONG_PTR)&Common_Class);


setはポインタでセットしていて

> Common_Class=GetClassLongPtr(hWnd,GCL_CBCLSEXTRA);
getは実体をとってこようとしている。
そこに矛盾があるのに気づいていますか?

クラスデータを利用する場合は
CommonClass* pCommonClass = (CommonClass*)GetClassLongPtr(hWnd,GCL_CBCLSEXTRA);
として、クラスメンバは
pCommonClass->xxx
としてアクセスすれはいいはずです。
    • good
    • 0

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