mfc问题求助

在mfc中怎样将窗口设置为不可改变大小,另外如何才能做出下面的效果?比如我想写一个象棋游戏,将鼠标点到棋子上并按住时,鼠标变成这个棋子并可以移动;只要说出大概流程就行,不... 在mfc中怎样将窗口设置为不可改变大小,另外如何才能做出下面的效果? 比如我想写一个象棋游戏,将鼠标点到棋子上并按住时,鼠标变成这个棋子并可以移动;只要说出大概流程就行,不一定要详细代码,谢谢…… 展开
 我来答
匿名用户
2013-11-08
展开全部
1、窗口不可改变大小,可以重载PreCreateWindow函数,并修改cs.style的值,就是修改窗口属性。一般情况下,设置为:cs.style = WS_CAPTION | WS_BORDER | WS_MINIMIZEBOX; 即可,下列是一些属性值,可以有选择的设置:#define WS_OVERLAPPED 0x00000000L //默认的风格。
#define WS_POPUP 0x80000000L //弹出式
#define WS_CHILD 0x40000000L //子窗口
#define WS_MINIMIZE 0x20000000L //创建后最小化
#define WS_VISIBLE 0x10000000L //可见
#define WS_DISABLED 0x08000000L //被禁止的
#define WS_MAXIMIZE 0x01000000L //最大化
#define WS_CAPTION 0x00C00000L /* WS_BORDER | WS_DLGFRAME */
#define WS_BORDER 0x00800000L // 具有边框
#define WS_DLGFRAME 0x00400000L //具有对话框风格
#define WS_VSCROLL 0x00200000L //具有纵向的滚动条
#define WS_HSCROLL 0x00100000L //具有横向的滚动条
#define WS_SYSMENU 0x00080000L //具有系统菜单
#define WS_THICKFRAME 0x00040000L //具有可以调整大小的边框
#define WS_GROUP 0x00020000L //成组
#define WS_TABSTOP 0x00010000L //按TAB时可以获得焦点#define WS_MINIMIZEBOX 0x00020000L //具有最小化按钮
#define WS_MAXIMIZEBOX 0x00010000L //具有最大化按钮
#define WS_TILED WS_OVERLAPPED
#define WS_ICONIC WS_MINIMIZE
#define WS_SIZEBOX WS_THICKFRAME
#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW 2、想要拖动图片,可以这么做。比如拖动棋子: 首先,定义一个棋子类。 class CChess { public: explicit CChess(DWORD dwChessman ); // 构造一个棋子,参数标识是何棋子。比如 1 = 兵,2=车。 virtual ~CChess(); protected: DWORD m_dwChess; // 标识该棋子是什么棋子,比如“兵=1,车=2,将=3..... 等 ” CPoint m_pt; // 标识该棋子位于棋盘的位置。 public: virtual void DrawChess( CDC * pDC ); // 用于将棋子画到棋盘。 virtual BOOL CanMoveTo( const CPoint& pt ); //判断该棋子是否可以被移动到某一点。因为各个棋子的走法不一样。 // ..........其他的函数。。 } 在视图的OnDraw里面,首先绘制棋盘,然后对棋盘上的所有棋子都进行绘制。 重载OnLButtonDown函数: 首先判断所点击的点下面是否存在棋子,然后判断这个棋子是否是己方的,因为你不能移动对方的棋子。 如果存在己方的棋子,那就开始拖动。 if( 用户点击处下面有棋子 && 该棋子是己方棋子) 开始拖动 else 默认处理。 重载OnLButtonUp函数: 首先判断是否有棋子正在被拖动,如果没有就直接返回。 否则,判断鼠标抬起的点下面是否是一个有效的棋盘位置,如果是,则进一步判断所拖动的棋子是否可以落到该位置。如果可以,则停止拖动。并且将所拖动的棋子重新设置位置到该处,然后重绘视图。 if( 正在拖动 ) { if( 鼠标抬起处的点是棋盘上的有效点 && 正在被拖动的棋子->CanMoveTo( 该点 ) { 停止拖动(); 正在被拖动的棋子->SetPoint( 该点); ReDrawWindow(); } else 默认操作并返回(不停止拖动) } else 默认处理 处理鼠标移动的消息WM_MOUSEMOVE: if( 正在拖动 ) { 在上一次鼠标移动的位置出画棋盘(擦除棋子图像); 在鼠标移动的新位置处画被拖动的棋子。 记录目前的鼠标位置。(上次鼠标移动的位置 = 现在的位置 ) } else 默认处理
匿名用户
2013-11-08
展开全部
树状控件还是很复杂的.你说的运行时添加完全可以实现的,先获取当前选择项目的HTREEITEM,然后InsertItem就可以了。不过下次执行的时候还能显示前一次项目可以使用一个简单的数据库读写。数据库可以使用access,就两个字段,一个value,保存Item的具体内容,还有一个ParentID,由你自己维护,比如根节点是0,然后二级节点分别001,002.。。等等,001的子节点001001,001002.。。。然后读入的时候按照节点ID分别插入。好像有点复杂啊,呵呵
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式