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
No.2ベストアンサー
- 回答日時:
型が違う点については回答1でいいとして、
> SetWindowLong(hWnd,DWL_USER,(LONG)&Common_Class);
> Common_Class=GetClassLongPtr(hWnd,GCL_CBCLSEXTRA);
SetWindowLongで「(ダイアログ)ウインドウ」のユーザー領域に値を設定してるんですよね。
なぜ、GetClassLongPtrで、しかもGCL_CBCLSEXTRA(クラスに関連付けられた拡張クラスメモリのサイズをバイト単位で取得します)を指定して値を取得しようとしてるんですか?
No.1
- 回答日時:
> 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
としてアクセスすれはいいはずです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby No route matches [GET] "/posts/5/destroy" 1 2022/03/24 13:00
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- その他(IT・Webサービス) html cssについて 3 2023/05/13 12:48
- JavaScript 【Javascript】ボタンクリックで2つのclassに対し、それぞれ別のclassを追加したい 1 2022/07/29 20:52
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- PHP 掲示板を作成しておりアップロードファイルとメッセージを並べたいので、アドバイスお願い致します 2 2023/07/17 21:01
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがない?
-
FriendとPublicの違い。。。
-
ダイアログ表示時にチェックボ...
-
ボタンのオーナードローについて
-
エディットコントロールでEnter...
-
DataGridViewのセルに斜線を引...
-
C++ protectedにアクセス不可
-
C++のclassを、ウインドウプロ...
-
【ASP.NET】 独自で作成したク...
-
このコンパイルエラーの意味に...
-
MFCのCListCtrlでスクロールを検出
-
CMainFrameクラスの使い方
-
windowプログラム ピクチャー...
-
DLLからEXEのクラスを呼び出す...
-
正規表現 [^/]+ の意味を教えて
-
【C++】相互参照
-
(UWSC) 「#32770」の意味わかり...
-
OnPaintとOnDraw関数の違いにつ...
-
C#で通常のbuttonコントロール...
-
継承を重ねた場合のコストはど...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
ダイアログ表示時にチェックボ...
-
クラスのアドレスを引数として...
-
C++ protectedにアクセス不可
-
【ASP.NET】 独自で作成したク...
-
MFCアプリのコマンドラインでパ...
-
ダイアログクラスのコントロー...
-
エディットコントロールでEnter...
-
このコンパイルエラーの意味に...
-
CMainFrameクラスの使い方
-
イベントにAddHandlerされてい...
-
MFC モードレスDlgについて
-
MFCのCListCtrlでスクロールを検出
-
privateなメンバ関数をテストす...
-
[MFC] CWnd::MessageBoxの警告...
-
継承を重ねた場合のコストはど...
-
DataGridViewのセルに斜線を引...
-
ボタンのオーナードローについて
おすすめ情報