14

これはかなり簡単なようです。私は私のクラスを持っています:

class Simple
{
public:
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
         ...
    }
};

そして私のWinMain

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR commandLine, int cmdShow)
{
    Simple *simple = new Simple();
    ...

    wndClass.lpfnWndProc = simple->WndProc;
    ...
 }

私が試してみると、次のようになります。

error C2440: '=' :cannot convert from 'LRESULT (__stdcall Simple::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'

クラスに参加できない理由はありますWndProcか?それは本当に役に立ちそうです。

4

3 に答える 3

31

C++ では、メンバー関数とフリー関数の扱いが異なります。メンバー関数はthisポインターにアクセスする必要があり、通常は最初の隠しパラメーターとして渡されます。したがって、n 引数のメンバー関数は (n+1) 引数のない関数に最も似ています。つまり、your を呼び出そうとするコードWndProcは、間違った数の引数を渡します。

ただし、ポインターを削除するメンバー関数WndProcとして宣言することはできます。このコードは動作するはずです:staticthis

class Simple
{
public:
    static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
         ...
    }
};

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR commandLine, int cmdShow)
{
    Simple *simple = new Simple();
    ...

    wndClass.lpfnWndProc = simple->WndProc;
    ...
 }

もちろん、これはクラスのフィールドに直接アクセスできないことを意味します。おそらくSetWindowLongPtr. それが完了したら、次のように記述してレシーバー オブジェクト ポインターを回復できます。

class Simple
{
public:
    static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
         Simple* me = reinterpret_cast<Simple*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
         if (me) return me->realWndProc(hwnd, msg, wParam, lParam);
         return DefWindowProc(hwnd, msg, wParam, lParam);
    }
private:
    LRESULT CALLBACK realWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
         // Yay!  I'm a member function!
    }
};

お役に立てれば!

于 2013-06-20T19:13:12.783 に答える
1

メンバ関数へのポインタには暗黙の最初のパラメータ がthis含まれているため、「フリー」関数へのポインタとは異なる署名があります。http://www.parashift.com/c++-faq-lite/fnptr-vs-memfnptr-types.htmlを参照してください。

于 2013-06-20T19:13:44.520 に答える
0
// Header  
class Foo   
{  
public:
  Foo();   

  ~Foo();  

  static LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);

private:
  LRESULT CALLBACK MyWinProc(HWND, UINT, WPARAM, LPARAM);

  static Foo *m_pInstance;
}

// Implementation

#include "Foo.h"

Foo * Foo::m_pInstance = NULL;

Foo::Foo()
{  
  m_pInstance = this;   
}  

Foo::~Foo()
{
}

LRESULT CALLBACK Foo::WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  
{  
  return m_pInstance->MyWinProc(hWnd, message, wParam, lParam);  
}  

LRESULT CALLBACK Foo::MyWinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  
{  
  return DefWindowProc(hWnd, message, wParam, lParam);  
}  
于 2014-11-05T22:51:24.087 に答える