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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オブジェクト型の変数が定義さ...
-
CreateObjectとはどういう意味...
-
C# panel内のコントロールの使...
-
エディットコントロールのイベ...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
個々の関数について継承してい...
-
C++では構造体がメンバ関数をも...
-
VB.NETで、DLLを頂いたんですが...
-
クラスのアドレスを引数として...
-
MFCアプリのコマンドラインでパ...
-
MessageBoxを継承したい
-
OnInitDialog()の関数の組み込み方
-
form1 から form2 へのデータの...
-
イベントにAddHandlerされてい...
-
IncludeではなくClassで宣言す...
-
(UWSC) 「#32770」の意味わかり...
-
スプラッシュコントロールの挿...
-
ユーザーフォームのVBAエラー
-
C# フォームのShow()のオーバー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CreateObjectとはどういう意味...
-
オブジェクト型の変数が定義さ...
-
メモリリークが発生するのはど...
-
コンストラクタ内でのthisポインタ
-
クラス内にWin32APIのコールバ...
-
C#でのUNZIP32.DLLの利用方法が...
-
C# panel内のコントロールの使...
-
関数で値渡しと参照渡しではど...
-
VB6では、Applicationは未定義...
-
ボタンを押すとラベルの文字を...
-
イベントドリブンとオブジェク...
-
【VC++6.0(MFC)】「Out of memo...
-
メモリ解放について、ご教授く...
-
デザイナ時のエラー「オブジェ...
-
オブジェクトをどこでdisposeす...
-
Visual studio c# android オブ...
-
UMLでの「オブジェクト」と「イ...
-
SetとNothingの存在意味?
-
C#でのコンパイル時のエラー
-
オブジェクトの廃棄
おすすめ情報