| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3777 人关注过本帖, 6 人收藏
标题:Windows 控制台下的绘图方法
只看楼主 加入收藏
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
回复 9楼 TonyDeng
Tony大哥,看了几本都没有十分明白 动态生成的概念。

或许我没有看到后面有关DOC/VIEW的解析吧!

你是过来人,能否讲解一下呢!!!

我不知道要怎么思考。虽然编译器不知道我们要处理什么什么数据,但只要IDE把我们需要框架搭好
然后我再手动修改 添加就可以了。
百度一些文章还是似懂非懂的样子。。

用心做一件事情就这么简单
2012-03-28 00:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你指的是MFC中动态生成控件的那些东西?

授人以渔,不授人以鱼。
2012-03-28 01:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用moonnight在2012-3-27 18:52:33的发言:

发现现在还看不懂。。。。

都是很基本的C代码呀,除了使用了C++的初始化和变量声明语法之外,没有用C++的其余特性。这个程序是完全公开代码的,没有我自编的函数或库,在普通的Windows编译器下编译,应能通过。如果是那些函数你没见过,那就是Windows的API函数,结合运行结果猜就是了。而且最好的办法,是可以动手修改代码,验证自己的猜测是否正确——事实上我也是这样猜那些API函数的确切用法的。

对一门语言的若干细节有不了解的地方,这很正常,只要肯动手做实验(计算机编程最好的地方是能够让你无限制地实验,其他行业可不能这样),总能摸得到底细。C语言(以及将来的C++类库)有那么多函数、类和数据结构,其总量比Windows API多得多,谁也不可能完全熟悉和掌握,只能是自己用到什么就学什么,能用即可,要全部精通是不可能的,也没必要。毕竟人是活的,总不可能被语言憋死,不懂成语、典故,也不会影响你用大白话表达意思,最多没什么文采罢了,但总能表达意思,完成任务。比如,我就总查不到C标准库中圆周率的宏定义,又不想自己写那个不太精确适用的3.1415926(在CLR类库倒真有这个宏,叫M_PI,但我现在并不用CLR版本写这个程序,故没用),就只能取巧用反正弦函数求出圆周率代入运算了,这样做,总不值得被很精通语言细节的人耻笑,也没什么可笑的,将来某日知道了,把它改回来,也就可以了。程序不可能十全十美的,总要修改、维护,把它当自己的孩子,生出来就要不断培育它成长,直至小程序成为一个具备一定功能的产品——以前求伯君他们,也是从一些很小的程序开始写出其成名作的,求伯君就是从一个打印驱动模块开始写出其中文处理系统和文字编辑器,都是因为对自己的作品倾注心血而来。总之,不要因为老师打了个勾,就完事了,那样学习,是不行的,又不是幼儿园,比赛谁得的红花多。

[ 本帖最后由 TonyDeng 于 2012-3-28 02:43 编辑 ]

授人以渔,不授人以鱼。
2012-03-28 02:20
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:3 
回复 8楼 C_596322153
句柄就是系统为你打开的每一个窗口随机分配的一串编号,同样的窗口打开再关闭,再打开它的句柄就不一样了。
2012-03-28 02:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
MFC我没用过,但一理通,百理明,从其他语言的用法,也可以知道基本的原理,根据原理,去追索资料,总能找到。

所谓“动态生成控件”,无非是在程序运行时向某个“容器”(Container类型的控件)添加控件,窗体(Form)就是一个最基本的容器,表格(Grid)也是,这是一类可以向其中添加物件的容器。凡是这类容器,必然有一个追加对象(AddObject)的方法,比如某个Form的实体ID叫Form1,那么通常调用Form1.AddObject()方法,就是向这个容器添加参数中指定的控件实体,因此关键是在哪个容器中发出AddObject()指令,你想向哪个容器加控件,就把这个容器的动态添加控件的方法找出来(一定有的,因为这是该控件设计的必需品)。在Visual FoxPro中这是AddObject方法,在 C#中这是.AddControl()方法。通过Add操作,所谓动态生成的控件ID,就是把从祖先到父亲及自己的ID串连起来,标识出有继承关系的ID,构成一条控件链,供操作系统查寻使用,Windows自己维护这种对象数据库。

以上是运行时的动态生成原理,在可视化的设计模式IDE中,是IDE执行这种Add操作,把控件动态添加到对应的地方,这时,它向你隐瞒了真实的代码步骤,因此,很多依靠可视化(Visual)编写程序的人,就很难了解在没有IDE环境下如何仅靠代码动态添加控件,从而产生“面向对象编程就是用鼠标拖拖拉拉”的错觉。事实上,我用Visual FoxPro编程,就从来不使用这种可视化编程模式,所有控件都是在代码中生成的,因此很清楚这类东西的运作机制。用这样的经验,在上也看到同样的做法,故此基本上可以确定MFC也必定是这样。事实上,无论Visual FoxPro,还是和C#、MFC,在根本底层上,都是微软的那一套运行时库,它们编程出来后所执行的效果,全部是同一个控件类产生的(比如Form控件,Visual FoxPro是很古老的产品,但现在用它的Form控件生成的窗体,却呈现出Win7窗体的半透明标题栏和边框模式,可见实际执行的就是Windows当前版本的控件)。所以,在底层原理上,必定是相通的。

你按照这样的思路,在MFC文档中查找看看,必定有相关资料。关键之处无非是两点:首先要确定你只能向容器性质的控件中动态添加控件,你可以把TextBox添加到Grid中,但无法在TextBox中再添加一个TextBox,把控件的性质搞清楚;其次是找到容器类添加子类的方法(Grid控件中必定有,而TextBox控件中肯定没有),看文档。动态生成的控件,一定是用new方法在堆上申请的一个对象,然后把这个对象的句柄返回给你,添加在它的父类的孩子清单上。

其实,在传统C++中写面向对象的控制台程序,也是用这种思路识别对象树,就如链表的原理一样,总有一个指向父项的标识和指向后裔的标识,不管那是不是可视化的对象,只要有包容关系,就一定要设计这样的字段,因为这是逻辑的要求,闭着眼睛都把它先写下来,至于用不用得到、如何用,以后再说,缺了必需品,以后伤筋动骨的可能性就越大,只要你挂着这么一个“未使用”的东西,随时都会提醒你有什么未做完,自然会想办法把它做了。因此设计初期就要审慎,对常用的类,要通过大量的小程序应用来测试,稳定下来之后才能应用于大系统。花两三年的时间,积累这么一套自己的工具库,你以后编程就轻松多了。把精力和时间花在这方面,好过就题做题。不想把组件代码的功能扩展到最大适用范围的,那是没打算以后从事这行当的,没意识就是没资质、不适合,以后做重复代码的疲劳,很快就会把你的兴趣消磨净尽——不要把兴趣当职业,这是社会上很流行的忠告了。

【题外话,以我对Visual FoxPro的理解,在本机程序范畴,它强大到足以应付一切可能的需要,除了不能在Web浏览器上运行自己的代码,它可以把IE的内核作为控件嵌在自己的界面上故可以浏览网页,它有API接口可以做到与系统最底层密切合作,而使用却比VC轻松得多,故此我说不需要用C/C++编写Windows程序,不必要花那些精力。在内部机制上,我现在已经看出C#有VFP的影子,除了提供更多更新的功能,在基本原理上竟然是那么相似。好像从什么地方看到,似乎微软把VFP开发团队的核心人员调到C#开发部了。以下是我用VFP提取的点阵字模的图案,如果用C实现这样的效果,耗费的精力要多很多(连空行算也只有130行),因为以前就是要从现成的点阵字库中切割偏旁部首组合GB2312编码中没有的汉字传输到LED显示屏中显示,要看到字模的数据影像才好做功课,曾经写过那样的东西。为了节省内存,在英文DOS下,就是用这样的东西显示中文的,这就是CCDOS的原理。在现在,如果要在控制台下显示特殊的字体,而系统又没有对应的等宽字体库,就可以用同样的办法做,不必总是单调的宋体字。】

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 TonyDeng 于 2012-3-28 04:27 编辑 ]

授人以渔,不授人以鱼。
2012-03-28 03:06
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
回复 12楼 TonyDeng
我看那个原理解析.
C++  没有动态生成。
MFC 自己实现了。
应该别的完全面向对象语言应该也有这个。
我不知道具体动态生成有什么作用,我现在看来是多余。所以不能明白。
貌似处理未知数据 或者对象


用心做一件事情就这么简单
2012-03-28 13:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
动态生成,就是如链表那样动态分配数据点的,因为事先不可能知道实际需要多少个数据,而只能动态变化。动态控件是从类蓝图中生成的,与我们平时用malloc(5*sizeof(int))生成5个int数据一样,支持面向对象的语言也能在运行时通过new动态生成一些数据实体。当你写一个Grid控件,里面的栏(Column)数目要根据运行情况动态变化时,比如此一时刻需要10栏,彼一时刻要从中插入1栏、或删掉其中1栏,就要能够动态生成新的Column控件来呈现数据,这是无法在设计时预先分配好的。有些时候,要设计大量的同类控件(比如15楼那个图的256个小方格),是不可能在IDE中手动添加的,也要用动态生成来构造。

授人以渔,不授人以鱼。
2012-03-28 13:22
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
回复 17楼 TonyDeng
谢谢,TonyDeng 明白了。
从链表和 你举那个国字 我明白了

用心做一件事情就这么简单
2012-03-28 13:31
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:3 
学习一下,呵呵。

我们都在路上。。。。。
2012-03-28 14:45
michaelc
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2012-4-5
收藏
得分:0 
为什么在我的机器上面运行会有好多ERROR AND WARNING出现
2012-04-05 17:30
快速回复:Windows 控制台下的绘图方法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.062317 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved