MFC两个或以上的类的参数传递的大问题和CButton类的一个小问题
是这样的,学校最近要做C++小课题,我的项目是一个军棋的小软件(项目名为MilitaryChess)。我使用了mfc单文档类项目,棋子为动态创建,即重载CButton类,...
是这样的,学校最近要做C++小课题,我的项目是一个军棋的小软件(项目名为MilitaryChess)。我使用了mfc单文档类项目,棋子为动态创建,即重载CButton类,类名为CChessButton和CMapButton(分别对应棋子和棋盘上的点),然后在CMilitaryChessView类中增加CChessButton的指针,以动态创建棋子(在CMilitaryChessView类中重载OnCreate函数)。目前做到开局前摆棋的阶段,想法是这样的:在CMilitaryChessView的类声明之前加入静态/全局指针CChessButton * pCChessButton,在CChessButton中添加点击的消息响应函数(如cgsd2004大所言使用消息反射),每点击一次就将pCChessButton这个指针指向被点击的按钮,然后返回false,返回给主窗口,即CMilitaryChessView类中继续处理,判断实现是否有棋子被点击过,如果是,则移动窗口,否则不动。
问题就在这里,声明的pCChessButton指针无效(用static关键字则两个类中的指针互不相关,用extern关键字则编译提示“无法解析的外部符号”),我已经不知道该怎么办了,写了通宵啊……试过增加定义一个常数类用于存放,无效;也试过增加头文件保存,无效…………555……
下面说下那个小问题:
我的想法是把棋盘上的按钮设为透明,把棋子设为总在最前,但是实现不了。总是两个问题:第一:就算棋子盖住了棋盘上的按钮,棋盘按钮还是会被点击到,并且会把棋子盖住,这样就在棋子上形成了很难看的“疤”,所以我就想,要么把棋子设为透明(加载图标似乎不管用)或者把棋子设为总在最前。
我的问题有点儿复杂啊……感谢各路大神耐心看完,小菜鸟在此谢过了!!!最近已经因为这个快要疯掉了……唉… 展开
问题就在这里,声明的pCChessButton指针无效(用static关键字则两个类中的指针互不相关,用extern关键字则编译提示“无法解析的外部符号”),我已经不知道该怎么办了,写了通宵啊……试过增加定义一个常数类用于存放,无效;也试过增加头文件保存,无效…………555……
下面说下那个小问题:
我的想法是把棋盘上的按钮设为透明,把棋子设为总在最前,但是实现不了。总是两个问题:第一:就算棋子盖住了棋盘上的按钮,棋盘按钮还是会被点击到,并且会把棋子盖住,这样就在棋子上形成了很难看的“疤”,所以我就想,要么把棋子设为透明(加载图标似乎不管用)或者把棋子设为总在最前。
我的问题有点儿复杂啊……感谢各路大神耐心看完,小菜鸟在此谢过了!!!最近已经因为这个快要疯掉了……唉… 展开
5个回答
展开全部
我的建议如下:
1.由于军棋棋子数量并不是很多,且最大数量是固定的,建议你使用数组来定义棋子。能避开手动分配内存,则尽量避开。
2.“被点击的棋子”在整个棋盘是唯一的,则它应该被定义为全局变量,而不应该是static变量。此全局变量最好存放在CPP文件中,而不是H头文件中。在用到该变量的地方,使用extern声明。否则,你应该考虑传递该指针。
3.棋盘不应该是一个按钮,一个图片控件足够了。其实棋子也不应该是按钮。
4.消息反射,那是JAVA之类的语言玩的东西,C++中就别考虑这个了。
1.由于军棋棋子数量并不是很多,且最大数量是固定的,建议你使用数组来定义棋子。能避开手动分配内存,则尽量避开。
2.“被点击的棋子”在整个棋盘是唯一的,则它应该被定义为全局变量,而不应该是static变量。此全局变量最好存放在CPP文件中,而不是H头文件中。在用到该变量的地方,使用extern声明。否则,你应该考虑传递该指针。
3.棋盘不应该是一个按钮,一个图片控件足够了。其实棋子也不应该是按钮。
4.消息反射,那是JAVA之类的语言玩的东西,C++中就别考虑这个了。
展开全部
我这里提点建议吧,看了下大概知道了你的意思。
1.棋盘上的透明按钮,可以这样做,这些透明按钮的点击WM_LBUTTONDOWN消息全部发送到VIEW里面,,可以使用POSTMESSAGE,并且最好带参数,这样在视图中可以判断它是棋盘上的空位置。应该不难做,这样就方面多了,
2,CChessButton这个类对应的所有按钮,同理,也把WM_LBUTTONDOWN消息都发送到VIEW里面。同样使用POSTMESSAGE,并带上参数,这样视图可以判断这个是棋子。
3.剩下的,如果已经点击了棋子,且现在点击的棋盘位置为空(或者说,透明按钮)就移动按钮。
最后,关于你的棋子指针的问题,
直接定义在视图中完全可以呀,为什么要定义全局?
如果你一定要使用全局的这个指针,你最好发上来,这个指针的定义,声明位置分别在哪!
好,有什么可以交流,就说到这吧。希望对你有帮助
1.棋盘上的透明按钮,可以这样做,这些透明按钮的点击WM_LBUTTONDOWN消息全部发送到VIEW里面,,可以使用POSTMESSAGE,并且最好带参数,这样在视图中可以判断它是棋盘上的空位置。应该不难做,这样就方面多了,
2,CChessButton这个类对应的所有按钮,同理,也把WM_LBUTTONDOWN消息都发送到VIEW里面。同样使用POSTMESSAGE,并带上参数,这样视图可以判断这个是棋子。
3.剩下的,如果已经点击了棋子,且现在点击的棋盘位置为空(或者说,透明按钮)就移动按钮。
最后,关于你的棋子指针的问题,
直接定义在视图中完全可以呀,为什么要定义全局?
如果你一定要使用全局的这个指针,你最好发上来,这个指针的定义,声明位置分别在哪!
好,有什么可以交流,就说到这吧。希望对你有帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
mark。个人觉得你的思路还不是很明确,动态创建的代价是比较大的,建议先理清思路。
有问题欢迎交流
有问题欢迎交流
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
CButton 的Style提供了许多类型,如一般按钮\单选\复选等 在Create时指定
样子不一样 都是CButton类
样子不一样 都是CButton类
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你为什么需要声明全局变量?如果你一定要可以这么弄,在WinAPP的cpp文件里面生明变量,比如CChessButton * pCChessButton,然后紧接着声明一个全局函数比如
CChessButton* GetChessButtonPtr(void) {return pCChessButton;}
这样就可以了,和MFC的AfxGetApp的做法一样。
我认为更好的方法是在直接生命在View里面呀。你在View里面建立的按钮,你在CChessButton里面访问CButton::GetParent()就得到了View的指针,然后就可以访问你在View里面的pChessButton了。
如果你要一个变量,使得整个程序都可以访问到,你可以在App里面声明或者在MainFrame里面声明,
若在App声明了一个指针pCChessButton,那么在程序任何地方都可以这么访问
((CChessApp*)AfxGetApp())->pChessButton
如果在MainFrame里面生命,就这么调用
((CMainFrame*)AfxGetMainWnd())->pChessButton
CChessButton* GetChessButtonPtr(void) {return pCChessButton;}
这样就可以了,和MFC的AfxGetApp的做法一样。
我认为更好的方法是在直接生命在View里面呀。你在View里面建立的按钮,你在CChessButton里面访问CButton::GetParent()就得到了View的指针,然后就可以访问你在View里面的pChessButton了。
如果你要一个变量,使得整个程序都可以访问到,你可以在App里面声明或者在MainFrame里面声明,
若在App声明了一个指针pCChessButton,那么在程序任何地方都可以这么访问
((CChessApp*)AfxGetApp())->pChessButton
如果在MainFrame里面生命,就这么调用
((CMainFrame*)AfxGetMainWnd())->pChessButton
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询