Win32窗口创建问题?

bjw1989 2011-02-23 08:18:37
//定义窗口基本的信息
class kWindow
{
protected:
HWND m_kHwnd; //窗口句柄
WNDCLASS m_kWc;//窗口结构类
MSG m_kMsg; //消息

public:
kWindow(void);
~kWindow(void);

//以参数创建窗口
bool Create(HINSTANCE hInatance,//应用程序句柄
LPSTR sWindowName, //窗口名称
int nWidth = CW_USEDEFAULT, //系统自动设置默认窗口宽度
int nHeight = CW_USEDEFAULT,
DWORD sStyle = WS_OVERLAPPEDWINDOW | WS_VISIBLE); //默认窗口样式

void Show(int nShow);//显示窗口

LRESULT CALLBACK WndProc(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam);//消息处理函数 void Run(void); //程序主循环接口
virtual void Frame(void) = 0; //游戏图像渲染
};


bool kWindow::Create(HINSTANCE hInatance, LPSTR sWindowName,
int nWidth /* = CW_USEDEFAULT */, int nHeight /* = CW_USEDEFAULT */,
DWORD sStyle /* = WS_OVERLAPPEDWINDOW | WS_VISIBLE */)
{
m_kWc.cbClsExtra = NULL;
m_kWc.cbWndExtra = NULL;
m_kWc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
m_kWc.hCursor = LoadCursor(NULL, IDC_ARROW);
m_kWc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
m_kWc.hInstance = hInatance;
m_kWc.lpfnWndProc = WndProc; m_kWc.lpszClassName = "窗口框架";
m_kWc.lpszMenuName = NULL;
m_kWc.style = NULL;

if(RegisterClass(&m_kWc))
{
m_kHwnd = CreateWindow("窗口框架",sWindowName,sStyle,CW_USEDEFAULT,CW_USEDEFAULT,nWidth,nHeight,NULL,NULL,hInatance,NULL);
SetWindowText(m_kHwnd,sWindowName);
}

if(!m_kHwnd)
return false;

return true;
}


以下是错误:
错误 1 error C3867: “kWindow::WndProc”: 函数调用缺少参数列表;请使用“&kWindow::WndProc”创建指向成员的指针 e:\游戏编程\练习\框架类库例子\框架类库\kwindow.cpp 23 框架类库
错误 2 error C2440: “=”: 无法从“LRESULT (__stdcall kWindow::* )(HWND,UINT,WPARAM,LPARAM)”转换为“WNDPROC” e:\游戏编程\练习\框架类库例子\框架类库\kwindow.cpp 23 框架类库

编译器VS 2008.
如果消息处理函数前设为静态函数,在vc 6.0里能运行成功
...全文
205 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveanybody 2011-02-24
  • 打赏
  • 举报
回复
你的回调函数应该写成 m_kWc.lpfnWndProc = kWindow::WndProc;
pengzhixi 2011-02-24
  • 打赏
  • 举报
回复
作为回调函数最好是设置为静态或全局的。
辰岡墨竹 2011-02-24
  • 打赏
  • 举报
回复
人家的意思就是不行,因为你的类非静态成员比如
class A {
void foo(x);
}
编译时会变成
class A {
void foo(A *this, x);
}
这样会导致和WndProc规定的参数列表不匹配。
Windows里回调过程和线程函数都必须是非类成员或类静态成员。
bjw1989 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pause_break 的回复:]
WndProc是一个回调函数,是提供给窗口调用的函数。这个函数不能是类的成员函数,除非把它定义成静态成员函数,因为如果它是类的非静态成员函数,它的参数列表会多一个this指针。
[/Quote]

如果是类的非静态成员函数,能写样例么
Pause_break 2011-02-23
  • 打赏
  • 举报
回复
WndProc是一个回调函数,是提供给窗口调用的函数。这个函数不能是类的成员函数,除非把它定义成静态成员函数,因为如果它是类的非静态成员函数,它的参数列表会多一个this指针。
bjw1989 2011-02-23
  • 打赏
  • 举报
回复
在VS 2008里运行不成功,但是在vc 6.0可以
??
xwfde 2011-02-23
  • 打赏
  • 举报
回复
窗口过程函数必须是全局函数,必须定义为静态,微软要求的没办法。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧