Win32APIをC++で作成しようとしているのですが、途中どのようにしたらいいのか分からないのでここで質問させていただきました。
Win32をC++で作成するためクラス内にウィンドウの登録、設定の関数を用意したのはいいのですが、CALLBACK関数を含めて実行しようとするとウィンドウの登録の際に、エラーが起きるようです。
/*//////////////////////////////////////////
ウィンドウ・クラスの登録
//////////////////////////////////////////*/
ATOM windCreate::InitApp(void)
{
(省略)
wc.lpfnWndProc = WndProc; //ここでエラー
(省略)
return RegisterClassEx(&wc);
}
エラー内容は下記の通りです。
error C2440: '=' : 'LRESULT (__stdcall windCreate::* )(HWND,UINT,WPARAM,LPARAM)' から 'WNDPROC' に変換できません。
クラスの宣言は以下の通りです。
class windCreate{
// WinMain インスタンスハンドルへのアクセス
public:
HINSTANCE hInst;
private:
WNDCLASSEX wc;
LPSTR szClassName;
HWND hWnd;
RECT w_rect;
SIZE window_size;
public:
ATOM InitApp(void);
BOOL InitInstance(int nCmdLine);
//ここがシステムから呼び出されるコールバック関数 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
---------(以下省略)---------
};
ウィンドウからのメッセージ受取を行う関数なんですが、どうしたら
エラーなく実行できるのでしょうか?
No.2ベストアンサー
- 回答日時:
static がついているかどうかでどのようにアクセスが変わるかを考えればわかると思いますが....
static なメンバ関数と static でないメンバ関数とでは呼び出し方が異なります. つまり, static なメンバ関数は呼び出すときにそのクラスのオブジェクトを必要としませんが, static でないメンバ関数を呼び出すためにはそのクラスのオブジェクトを必要とします.
ところが, Windows のコールバック関数では「どのオブジェクトに対して呼び出すのか」を指定することができないため, コールバック関数として static でないメンバ関数を与えることができません. これに対し static なメンバ関数ではオブジェクトを必要としないので, コールバック関数として使うことができます.
成程、そういうことでしたか。static 静的にすればオブジェクトどうし、値が共有されるというのは分かっていたんですが。staticにして宣言すればオブジェクトあるなしに呼び出せるんですね。
教えていただいてどうも有難うございました。
No.1
- 回答日時:
こんにちは。
class windCreate{
//↓publicでstaticなメンバ関数にしないといけません。
static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
};
この回答への補足
static を付けて、ビルドを試みると巧く行きました。
腑に落ちないので補足として質問するのですが、どうしてstaticを付けると巧く行くのでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オブジェクト型の変数が定義さ...
-
クラス内にWin32APIのコールバ...
-
C# panel内のコントロールの使...
-
CreateObjectとはどういう意味...
-
デザイナ時のエラー「オブジェ...
-
c# nullは空集合として扱かって...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
ダイアログ表示時にチェックボ...
-
MFCのCListCtrlでスクロールを検出
-
MFCのドラッグ&ドロップについて
-
【C++】相互参照
-
イベントにAddHandlerされてい...
-
(UWSC) 「#32770」の意味わかり...
-
OnInitDialog()の関数の組み込み方
-
ConsoleApplicationから別プロ...
-
privateなメンバ関数をテストす...
-
継承を重ねた場合のコストはど...
-
【ASP.NET】 独自で作成したク...
-
このコンパイルエラーの意味に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CreateObjectとはどういう意味...
-
オブジェクト型の変数が定義さ...
-
ボタンを押すとラベルの文字を...
-
C# panel内のコントロールの使...
-
コンストラクタ内でのthisポインタ
-
クラス内にWin32APIのコールバ...
-
メモリリークが発生するのはど...
-
【VC++6.0(MFC)】「Out of memo...
-
関数で値渡しと参照渡しではど...
-
オブジェクトをどこでdisposeす...
-
C++の連想配列の使い方
-
すべてのページにServer.Create...
-
VB6では、Applicationは未定義...
-
チュートリアル : オブジェクト...
-
SetとNothingの存在意味?
-
Visual studio c# android オブ...
-
【VC++.NET】コンストラクタと...
-
C#でExcelを起動したい
-
ゆかりネットで東北ずん子exを...
-
ADODB.Connectionはインターフ...
おすすめ情報