VC6制作五子棋问题

天之骄子呃 2014-09-06 12:31:28
在开发过程中遇到几个函数不明白 请各位大神解释下:
1、
 CDC *pDC=GetDC();

CDC Dc;

if(Dc.CreateCompatibleDC(pDC)==FALSE)

AfxMessageBox("Can't create DC");


这段代码去掉之后 点击鼠标之后老是重新画棋盘了一样很乱 而且鼠标点击位置不出现棋子 而是其它地方出现棋子 这是为什么?

2、 pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY); 这里面参数都是什么意思?看msdn不是很明白
...全文
160 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
天之骄子呃 2014-09-06
  • 打赏
  • 举报
回复
引用 2 楼 bojie5744 的回复:
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY); 主要参数为(画布的左上角X坐标,画布的左上角Y坐标,画布的宽度,画布的高度,内存画布地址,内存画布的左上角X坐标,内存画布的左上角Y坐标)
引用 1 楼 caozhy 的回复:
(1)你贴的代码不完整,这些代码是写在哪里的都没交代。 (2)简单来说就是往棋盘上绘制棋子。前面两个参数是棋子的坐标,然后的两个参数是棋子的大小,再往后是dc(你可以理解为画布),最后参数是从哪里复制,实现将棋子图片放在srccopy中了。
[code=c] //画背景 CBrush brush1; brush1.CreateSolidBrush(RGB(192,192,192)); CClientDC dc(this); dc.SelectObject(&brush1); dc.Rectangle(0,0,450,500); //画棋盘框线 CPen pen; CPen *oldpen; pen.CreatePen(PS_SOLID,1,RGB(0,0,0)); oldpen=dc.SelectObject(&pen); int i=0; for(i;i<19;i++) { dc.MoveTo(40+i*20,40); dc.LineTo(40+i*20,400); } for(i=0;i<19;i++) { dc.MoveTo(40,40+i*20); dc.LineTo(400,40+i*20); } //重画时显示存在的棋子 { int m,n;m=n=0; for(n;n<19;n++) { for(m;m<19;m++) { if(wzq[n][m]==1) { //显示白棋 dc.SelectObject(m_bmwhite); pDC->BitBlt(n*20+32,m*20+32,160,160,&dc,0,0,SRCCOPY); } if(wzq[n][m]==-1) { //显示黑棋 dc.SelectObject(m_bmblack); pDC->BitBlt(n*20+32,m*20+32,160,160,&dc,0,0,SRCCOPY); } } } }
1、这是画棋盘(19行19列)和棋盘框线以及重画(不懂。。什么时候重画?)时显示棋子的代码 。 ①您说的画布和内存画布是什么意思?有什么区别呢? ②BitBlt(n*20+32,m*20+32,160,160,&dc,0,0,SRCCOPY);前两个是画布坐标 不是棋子坐标吗?两者有何区别? ③后面两个宽度160是画布尺寸不太理解。 ④您说再后面两个0,0您说是内存画布左顶点坐标 是整个单文档视图的左上方顶点坐标呢还是指视图内所画棋盘左上方顶点 ⑤除了pDC->BitBlt(n*20+32,m*20+32,160,160,&dc,0,0,SRCCOPY);这种指针写法外 有用dc类的写法吗? ⑥我们上课讲的是用CClientDC dc(this)来绘图, CClientDC 和DC 一样吗?能一直用CClinetDC来写吗?比如 CDC *pDC=GetDC(); CDC Dc; if(Dc.CreateCompatibleDC(pDC)==FALSE) AfxMessageBox("Can't create DC"); 这段代码是什么意思? 拜托大神了~[/code]
天之骄子呃 2014-09-06
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
(1)你贴的代码不完整,这些代码是写在哪里的都没交代。 (2)简单来说就是往棋盘上绘制棋子。前面两个参数是棋子的坐标,然后的两个参数是棋子的大小,再往后是dc(你可以理解为画布),最后参数是从哪里复制,实现将棋子图片放在srccopy中了。
	//画背景
	CBrush brush1;
	brush1.CreateSolidBrush(RGB(192,192,192));
	
	CClientDC dc(this);
	dc.SelectObject(&brush1);
	dc.Rectangle(0,0,450,500);
	
	//画棋盘框线
	CPen pen;
	CPen *oldpen;

	pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
	oldpen=dc.SelectObject(&pen);
	int i=0;
	for(i;i<19;i++)
	{
		dc.MoveTo(40+i*20,40);
		dc.LineTo(40+i*20,400);
	
	}

	for(i=0;i<19;i++)
	{
		dc.MoveTo(40,40+i*20);
		dc.LineTo(400,40+i*20);
	
	}
	
	//重画时显示存在的棋子
	{		
		int m,n;m=n=0;
			for(n;n<19;n++)
			{
				for(m;m<19;m++)
				{
					if(wzq[n][m]==1)
					{
						//显示白棋
						dc.SelectObject(m_bmwhite);
					pDC->BitBlt(n*20+32,m*20+32,160,160,&dc,0,0,SRCCOPY);

					}
					if(wzq[n][m]==-1)
					{
						//显示黑棋
						dc.SelectObject(m_bmblack);
					pDC->BitBlt(n*20+32,m*20+32,160,160,&dc,0,0,SRCCOPY);
					}		
				}
			}
	}

1、这是画棋盘(19行19列)和棋盘框线以及重画(不懂。。什么时候重画?)时显示棋子的代码 。①BitBlt(n*20+32,m*20+32,160,160,&dc,0,0,SRCCOPY);这个代码前两个参数为什么是那样呢 已知棋盘尺寸为18x18 ②后面两个宽度160是棋子宽度?宽度不是尺寸的18? ③再后面两个0,0您说是画布左顶点坐标 是整个单文档视图的左上方顶点呢还是指棋盘左上方顶点 ④除了pDC->BitBlt(n*20+32,m*20+32,160,160,&dc,0,0,SRCCOPY);这种指针写法外 有用dc类的写法吗? ⑤我们上课讲的是用CClientDC dc(this)来绘图, CClientDC 和DC 一样吗?能一直用CClinetDC来写吗?比如 CDC *pDC=GetDC(); CDC Dc; if(Dc.CreateCompatibleDC(pDC)==FALSE) AfxMessageBox("Can't create DC"); 这段代码是什么意思? 拜托大神了~
  • 打赏
  • 举报
回复
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY); 主要参数为(画布的左上角X坐标,画布的左上角Y坐标,画布的宽度,画布的高度,内存画布地址,内存画布的左上角X坐标,内存画布的左上角Y坐标)
想上天的鱼丶 2014-09-06
  • 打赏
  • 举报
回复
1.首先,你应该知道MFC里画图是不能直接在DC中画的,要在内存DC中画,然后再把画好的复制到DC上。DC就相当于画室,要想在画室里画画,先要找一个画布(内存DC),在画布上画好了之后,再把画布拿到画室中去。 2.在画图中的坐标是以左上角作为原点,向左 为x轴,向下为y轴。所以,画图时坐标需要设置好。 3..CreateCompatibleDC该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。通过GetDc()获取的HDC直接与相关设备沟通,而本函数创建的DC,则是与内存中的一个表面相关联。 4.CClientDC是CDC派生类。都可以用。
threenewbee 2014-09-06
  • 打赏
  • 举报
回复
(1)你贴的代码不完整,这些代码是写在哪里的都没交代。 (2)简单来说就是往棋盘上绘制棋子。前面两个参数是棋子的坐标,然后的两个参数是棋子的大小,再往后是dc(你可以理解为画布),最后参数是从哪里复制,实现将棋子图片放在srccopy中了。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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