http://bbs.csdn.net/topics/390407796?page=1
想在对话框的picture(IDC_STATIC_BACK)控件上画出多个矩形,8排12列共96个
我现在只能画出一个 请问各位大侠,怎么画出多个?应该用什么方法,是不是要用循环啊 CWnd * pWnd = GetDlgItem(IDC_STATIC_BACK); if(pWnd != NULL && ::IsWindow((pWnd->m_hWnd))) { CRect rcPic; pWnd->GetWindowRect(rcPic); ScreenToClient(rcPic); CClientDC dc(this); HBRUSH hBrush=CreateSolidBrush(RGB(122,122,122)); CBrush brush(RGB(122,122,122)); CRect rect(20,20,40,40); rect.OffsetRect(rcPic.left,rcPic.top); dc.Rectangle(rect); dc.FillRect(&rect,&brush); } |
对我有用[0] 丢个板砖[0] 引用 | 举报 |
回复次数:54
编辑 删除
管理
|
#1 得分:0
回复于: 2013-03-28 17:40:59
自己顶下,求指导啊
|
|
天天爱答题 任性送C币
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#2 得分:0
回复于: 2013-03-28 17:43:29
dc.Rectangle(rect);
循环用这个函数 注意这个函数会 The interior of the rectangle is filled using the current brush. |
|
CSDN学院讲师招募,诚邀您加入!
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#3 得分:0
回复于: 2013-03-28 18:41:22
for (int i=0;i<11;i++)
{ rect.left+=25; //rect.top=40; rect.right+=25; //rect.bottom+=40; rect.OffsetRect(rcPic.left,rcPic.top); dc.Rectangle(rect); dc.FillRect(&rect,&brush); } 我这样先循环一排,但是没效果,出来的一条灰色的,矩形没分开 |
|
社区问答第15期:Cocos2d-JS开发之旅——从HTML 5到原生手机游戏
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#4 得分:0
回复于: 2013-03-28 19:02:03
你先把dc.FillRect(&rect,&brush);去掉看看矩形是否都有画出来.
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#5 得分:0
回复于: 2013-03-28 20:11:52
不知道你这个rcPic干嘛用,可能它的宽度就小于你绘制的矩形宽度,自然就连起来了。
rect.left+=25; //rect.top=40; rect.right+=25; //rect.bottom+=40; 全部去掉 rect.OffsetRect(rcPic.left,rcPic.top); 改成: rect.OffsetRect(25,0); 看看效果。 用到的函数好好看看API说明。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#6 得分:0
回复于: 2013-03-29 08:59:32
是我OffsetRect用的不对,按你说的出来效果了,感谢!
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#8 得分:0
回复于: 2013-03-29 12:59:59
你要对所有的矩形进行点击判断,一般的做法先要把所有矩形的信息保存起来,比如用一个数组保存所有矩形对象,这样在鼠标点击消息中可以去判断点击的是哪一个矩形;如果把矩形去看作一个对象,为了方便后续可能要扩充处理功能,可以用一个类包装一下,矩形只是类里面的一个属性。这样点击的时候判断点击的目标,刷新界面,而你所有的绘图操作都应该放在一个地方,就是和绘制矩形一个地方,对话框的OnPaint,视图的OnDraw。其实我一般在对话框Onpaint中也去调用OnDraw(自己添加),这样和视图一致了。
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#9 得分:0
回复于: 2013-03-29 13:18:52
我的思路是当点击radio控件时,把它的文本保存到m_strIcon中,当鼠标点击矩形位置时,获得当前矩形的中心点坐标,然后在这个点的位置输出文本。我觉得这样简单,但是不知道是不是可行,有可能鼠标点下的时候并不知道是哪个矩形
按你说的话,我要把96个矩形的信息全部保存到数据里,那我是要在画矩形的for循环里面加保存矩形的代码吧 引用 8 楼 Mackz 的回复: 你要对所有的矩形进行点击判断,一般的做法先要把所有矩形的信息保存起来,比如用一个数组保存所有矩形对象,这样在鼠标点击消息中可以去判断点击的是哪一个矩形;如果把矩形去看作一个对象,为了方便后续可能要扩充处理功能,可以用一个类包装一下,矩形只是类里面的一个属性。这样点击的时候判断点击的目标,刷新界面,而你所有的绘图操作都应该放在一个地方,就是和绘制矩形一个地方,对话框的OnP…… |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#10 得分:10
回复于: 2013-03-29 13:36:48
“矩形”只是一种形状,编程的人要搞清楚什么是数据,矩形的坐标、大小、外观等才是数据,使用CRect类或者RECT结构保存举行的大小位置只是一种方便的手段。
所以,数据是数据,表现是表现,数据在哪里设置、初始化、修改甚至序列化(读写文件、数据库)和在哪里表现(绘图)是没有关系的,而且最好不要有关系。 就你的情况而言,可以在其它地方先把所有的矩形(或封装矩形的对象)初始化好,比如用一个数组(如果数量固定);如果需要根据客户区大小调整位置,那就在窗口大小改变的消息(WM_SIZE)中去修改矩形的坐标和大小。而绘制的地方,比如OnDraw中,只需要根据确定的数据去画出来。你要画的字符串也一样,在需要的地方确定位置(鼠标消息中),在需要的地方确定内容(Radio消息),然后刷新界面(Invalidate),绘图的地方只要判断数据是否有效然后绘制就是了。 我说这么多是希望你理解后面的原理。如果需要再给代码。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#11 得分:0
回复于: 2013-03-29 13:37:36
一个原则就是数据和表现分离,绘图的地方不要有修改数据的操作,操作数据的地方不要有绘图。
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#12 得分:0
回复于: 2013-03-29 13:55:22
能给代码我参考下么,按你说的我还是没想太懂,画图的知识才学3天
引用 10 楼 Mackz 的回复: “矩形”只是一种形状,编程的人要搞清楚什么是数据,矩形的坐标、大小、外观等才是数据,使用CRect类或者RECT结构保存举行的大小位置只是一种方便的手段。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#13 得分:0
回复于: 2013-03-29 14:11:27
这个其实和画图知识关系不大,就是些程序设计的基本原理。等会儿啊,先过一遍帖子。
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#14 得分:0
回复于: 2013-03-29 14:21:28
恩,编程得细心,还得思路清晰,还得明白原理,想学好挺不容易的,多跟高手交流我觉得会进步的快些 引用 13 楼 Mackz 的回复:
这个其实和画图知识关系不大,就是些程序设计的基本原理。等会儿啊,先过一遍帖子。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#15 得分:0
回复于: 2013-03-29 15:05:57
开始咯。首先为了便于管理绘图工作,我把所有绘图的事儿交给一个控件类:CCanvasCtrl,从CWnd继承,用来作为画图区域(绘图板)。等下哈。
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#17 得分:0
回复于: 2013-03-29 15:39:17
第二个类:
CanvasContext.h
这个更懒,连实现文件都没有。因为它就是为了给CCanvasCtrl类提供一个绘图用的数据接口,真正的事情要从CCanvasContext类继承一个自己的CMyData类来实现。 |
|||
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#18 得分:0
回复于: 2013-03-29 15:41:08
真是大牛啊,我什么时候能这样呢 引用 16 楼 Mackz 的回复:
一个类设计完啦: |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#19 得分:0
回复于: 2013-03-29 16:29:25
引用 17 楼 Mackz 的回复:
第二个类:来学习 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#20 得分:10
回复于: 2013-03-29 17:03:51
好了,真正的数据类:
MyData.h
MyData.cpp
前面忘了一个细节补上:
|
|||||||
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#21 得分:0
回复于: 2013-03-29 17:20:14
现在实现对话框上的控件,忘了说了,我是建了个对话框工程。添加几个变量:
消息映射是这样的:
注意IDC_RADIO1到IDC_RADIO4编号要连续。 在对话框OnInitDialog()中初始化我们的画布:
还有按钮消息函数:
![]() |
|||||||||
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#22 得分:0
回复于: 2013-03-29 17:26:29
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#23 得分:0
回复于: 2013-03-29 17:28:07
高手就是高手啊,这也太速度了,够我消化好久的
您能把程序发给我么,[email protected] 我慢慢看看,然后加到我自己的程序里面试试 辛苦了 ![]() 现在实现对话框上的控件,忘了说了,我是建了个对话框工程。添加几个变量: |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#24 得分:0
回复于: 2013-03-29 17:29:33
好厉害,小妹佩服的五体投地,我好好看看您写的程序 引用 22 楼 Mackz 的回复:
对了,字体背景透明,在void CMyData::OnDraw(CDC* pDC)加一行pDC->SetBkMode(TRANSPARENT);就行,效果图: |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#25 得分:0
回复于: 2013-03-29 19:00:29
程序剩下的就是框架了,真没什么东西,就是个对话框程序。不过我做着玩的,有些乱七八糟。在一个我是2012的,不知道你能不能用。
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#26 得分:0
回复于: 2013-03-29 19:26:10
大侠,我在添加 CCanvasContext这个类的时候,在BASE CLASS中没有 CObject
那你把那三个类的.h和.cpp文件发给我,我试试 引用 25 楼 Mackz 的回复: 程序剩下的就是框架了,真没什么东西,就是个对话框程序。不过我做着玩的,有些乱七八糟。在一个我是2012的,不知道你能不能用。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#27 得分:0
回复于: 2013-03-29 19:27:10
我直接添加进工程里面,我自己添加你新建的三个类时会出现很多错误 引用 26 楼 xiaomangmang 的回复:
大侠,我在添加 CCanvasContext这个类的时候,在BASE CLASS中没有 CObject |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#28 得分:0
回复于: 2013-03-29 19:38:15
这个是不是传说中的自绘
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#29 得分:0
回复于: 2013-03-29 20:56:15
BaseClass没有CObject也没关系,我是习惯了,就建个基类好了。文件内容不都贴出来了么,你建几个空文件复制进去就是了。估计你还用VC6,就怕有些不兼容的。重在理解。
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#30 得分:0
回复于: 2013-03-29 21:01:56
引用 28 楼 goosdy 的回复:
这个是不是传说中的自绘从广义上来说,自己画图也可以叫自绘 ![]() |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#31 得分:0
回复于: 2013-03-30 08:43:52
恩,是在用vc6,我多试试,呵呵,谢谢大侠指点
![]() BaseClass没有CObject也没关系,我是习惯了,就建个基类好了。文件内容不都贴出来了么,你建几个空文件复制进去就是了。估计你还用VC6,就怕有些不兼容的。重在理解。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#32 得分:0
回复于: 2013-03-30 17:27:41
大侠,我想点击别的radio的时候,我之前在其他矩形上显示的文字还存在,你现在的代码好像是只能有一个矩形的显示变化,我想的是能同时标记多个矩形,这应该怎么修改呢? 引用 29 楼 Mackz 的回复:
BaseClass没有CObject也没关系,我是习惯了,就建个基类好了。文件内容不都贴出来了么,你建几个空文件复制进去就是了。估计你还用VC6,就怕有些不兼容的。重在理解。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#33 得分:0
回复于: 2013-03-30 18:10:49
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#34 得分:0
回复于: 2013-03-30 18:13:42
其实呢我前面已经说过了,就是把矩形包装到一个新的类里面。
算了,反正有空,给你再说一下,不过你要自己跟着改: 添加一个类用来作为你的数据类,比如……对了,你给个有意义的名字,我不喜欢随便命名。也就是说,你的矩形想代表什么? |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#35 得分:0
回复于: 2013-03-30 18:29:24
代表一个孔位,可以是recthole 引用 34 楼 Mackz 的回复:
其实呢我前面已经说过了,就是把矩形包装到一个新的类里面。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#36 得分:0
回复于: 2013-03-30 18:30:09
恩,是我原来没说清楚,嘿嘿 引用 33 楼 Mackz 的回复:
早知道你有这需求,可是你原来不是这么说滴所以我把变量命名为m_Objs而不是m_Rects |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#37 得分:0
回复于: 2013-03-30 18:33:14
可不可以再加个功能,就是我点击矩形,显示文本,再点击这个矩形,文本消失,矩形还是原来的样子,这样的话是不是要在ONLBUTTONDOWN中加个IF语句判断下呢 引用 34 楼 Mackz 的回复:
其实呢我前面已经说过了,就是把矩形包装到一个新的类里面。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#38 得分:0
回复于: 2013-03-30 18:37:38
我也来学习学习
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#39 得分:0
回复于: 2013-03-30 18:38:54
咱还是先实现同时显示的功能把,然后再考虑我说的这个 引用 37 楼 xiaomangmang 的回复:
可不可以再加个功能,就是我点击矩形,显示文本,再点击这个矩形,文本消失,矩形还是原来的样子,这样的话是不是要在ONLBUTTONDOWN中加个IF语句判断下呢引用 34 楼 Mackz 的回复:其实呢我前面已经说过了,就是把矩形包装到一个新的类里面。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#40 得分:0
回复于: 2013-03-30 18:39:44
算了,我建了个CTerminal类:
|
|||||
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#41 得分:0
回复于: 2013-03-30 18:51:27
修改一下CMyData类:
头文件
cpp
|
|||||
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#42 得分:0
回复于: 2013-03-30 18:52:17
更正前面一个错误:
|
|||
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#43 得分:0
回复于: 2013-03-30 19:35:41
我来插一段吧,是不是回复不了了
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#44 得分:0
回复于: 2013-03-30 19:41:50
唉,太急,这样更好一些:
另外原来忘了一点东西,修改CMyData添加一个函数:
cpp:
以及对话框类:
![]() 最后一个功能,点击矩形文字能添加/去除,给CTerminal类添加两个函数: Terminal.h
Terminal.cpp:
MyData.cpp
|
|||||||||||||||
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#45 得分:0
回复于: 2013-03-30 19:45:01
高手就是高手啊
![]() ![]() 唉,太急,这样更好一些: |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#46 得分:0
回复于: 2013-03-30 19:45:45
好了,现在你再想增加功能,就可以在CTerminal和CMyData两个类里面做手脚。CCanvasCtrl绘图的部分是不用动的,这就是界面和实现分离,而CTerminal只管绘制自己(Draw)。
|
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#47 得分:0
回复于: 2013-03-30 20:16:24
恩,好的,这么交流啊下来,自己再动手做,感觉学了好多知识,辛苦啦! 引用 46 楼 Mackz 的回复:
好了,现在你再想增加功能,就可以在CTerminal和CMyData两个类里面做手脚。CCanvasCtrl绘图的部分是不用动的,这就是界面和实现分离,而CTerminal只管绘制自己(Draw)。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#48 得分:0
回复于: 2013-03-31 13:42:08
我在程序里加入CTerminal的时候,在我当前对话框类中添加CArray<CTerminal, CTerminal&> m_Objs;这句,提示没有声明CTerminal类,所以m_Objs都调用不了CTerminal中的函数,这时候我就分析你的程序,把能实现功能的代码试着加入我的对话框类中,可能是我加的不对,还是只能同时显示一个矩形变化,所以想问你是哪句代码实现的同时显示? 引用 46 楼 Mackz 的回复:
好了,现在你再想增加功能,就可以在CTerminal和CMyData两个类里面做手脚。CCanvasCtrl绘图的部分是不用动的,这就是界面和实现分离,而CTerminal只管绘制自己(Draw)。 |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#49 得分:0
回复于: 2013-03-31 14:08:49
而且,第一个矩形是失效的,点击没变化 引用 48 楼 xiaomangmang 的回复:
我在程序里加入CTerminal的时候,在我当前对话框类中添加CArray<CTerminal, CTerminal&> m_Objs;这句,提示没有声明CTerminal类,所以m_Objs都调用不了CTerminal中的函数,这时候我就分析你的程序,把能实现功能的代码试着加入我的对话框类中,可能是我加的不对,还是只能同时显示一个矩形变化,所以想问你是哪句代码实…… |
|
对我有用[0] 丢个板砖[0] 引用 | 举报 |
编辑 删除
管理
|
#50 得分:0
回复于: 2013-03-31 16:35:52
就少了一句,添加Terminal.h头文件到MyData.cpp或者.h中,放cpp的话要放在MyData.h前面。
我的方法是这样(其实前面都提过):用一个Terminal类包装每个矩形对象,里面有坐标(CRect)、内容(CString)两个属性,而这些对象是通过CMyData类来管理,CMyData类是CCanvasCtrl类的数据上下文实例。 这样窗口刷新的时候,CCanvasCtrl刷新,调用数据上下文实例(CMyData)的绘图函数(OnDraw),再调用管理的CTerminal对象数组中每个对象的Draw函数去绘制自己。 CCanvasCtrl创建的时候,会触发OnSize消息,同样循上面说的路径去设置每个矩形大小。 CCanvalCtrl上点击鼠标的时候,同样循上面的路径找到每个矩形进行命中判断,在哪个区域内,就记录下那个编号,作为选中标记,所以这个和其他控件焦点一样,每次只能选一个。 在RadioButton点击消息中,把按钮文字设置到激活的那个对象中,因为每个对象都有自己的m_Text属性,所以都可以保存。 对象有自己的属性,负责维护自己的属性(数据),负责绘制自己(表现);界面只管处理消息,把消息转交给合适的对象去处理,逻辑比较清楚。 |