游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4175|回复: 8

关于WndProc这个函数..

[复制链接]

10

主题

73

帖子

75

积分

注册会员

Rank: 2

积分
75
发表于 2006-10-27 22:35:00 | 显示全部楼层 |阅读模式
static LRESULT CALLBACK tr_Window::t_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
        case WM_ACTIVATE:
                if(LOWORD(wParam)==WA_ACTIVE)
                        t_bActive=true;
                else
                        t_bActive=false;
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
}

tr_Window是我封装窗口的类,里面有个变量t_bActive标记程序是否激活.
但是编译报错:error C2597: illegal reference to non-static member 'tr_Window::t_bActive'
我把t_bActive改成static的.后报错:error LNK2001: 无法解析的外部符号 "private: static bool tr_Window::t_bActive"

高人们? 先预付一拜

18

主题

92

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2006-10-27 22:46:00 | 显示全部楼层

Re:关于WndProc这个函数..

class里的static成员变量,要在类外定义和初始化
你在cpp文件里再写一下XXX  XXX::XXX = XXX;就行了

10

主题

73

帖子

75

积分

注册会员

Rank: 2

积分
75
 楼主| 发表于 2006-10-27 23:02:00 | 显示全部楼层

Re:关于WndProc这个函数..

XXX  XXX::XXX = XXX  ?
这是什么东西?
t_bActive是那个类的私有变量啊?
WndProc好像必须加static...我看MSDN上就是这个加的.如果WndProc不能直接使用本类的变量,那还怎么封装啊

15

主题

129

帖子

129

积分

注册会员

Rank: 2

积分
129
QQ
发表于 2006-10-27 23:50:00 | 显示全部楼层

Re:关于WndProc这个函数..

我看好像是这样
但是编译报错:error C2597: illegal reference to non-static member 'tr_Window::t_bActive'
是因为static要使用static的变量
我把t_bActive改成static的.后报错:error LNK2001: 无法解析的外部符
你在类里面改了static t_bActive,那是声明不是定义。static变量要在cpp里面定义一次
XXX  XXX::XXX = XXX  
XXX是类型
XXX::XXX 是 tr_Window::t_bActive
=XXX 是指给它赋值
ps 有些类型是不用赋值,因为可以使用默认的值.
如: static int tr_Window::num;

15

主题

129

帖子

129

积分

注册会员

Rank: 2

积分
129
QQ
发表于 2006-10-27 23:51:00 | 显示全部楼层

Re:关于WndProc这个函数..

WndProc好像必须加static???这是为啥,我却不知道。难道是因为不想使用对象进行调用?

7

主题

67

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2006-10-29 21:04:00 | 显示全部楼层

Re:关于WndProc这个函数..

to LZ:
静态成员函数内,不能直接访问类的成员。所以不能直接访问t_bActive。
你需要一个对象实例的指针来访问t_bActive。
可以建立一个全局的tr_Window对象实例。
tr_Window g_win;
在WndProc函数内用 g_win.t_bActive 来访问。

to ddoq2008:
不是WndProc必须加static,而是,当你传递一个回调函数指针给系统时,普通的成员函数,如果在对象没有实例化时候是无效的。所以如果WndProc函数是某个类的成员函数,则必须声明成静态的。

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-10-30 10:16:00 | 显示全部楼层

Re:关于WndProc这个函数..

楼上的说的都对了
补充几点供理解
1. window在create时需要传一个指向消息处理函数的"普通函数指针"
2. static member function可理解为所有class的instance共享的,它没有this指针,所以看不到non-static member value

4

主题

66

帖子

66

积分

注册会员

Rank: 2

积分
66
发表于 2006-10-30 11:17:00 | 显示全部楼层

Re:关于WndProc这个函数..

楼上的全部正解.结案.........

10

主题

73

帖子

75

积分

注册会员

Rank: 2

积分
75
 楼主| 发表于 2006-11-9 22:03:00 | 显示全部楼层

Re:关于WndProc这个函数..

相当感谢所有参与讨论的朋友们
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 19:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表