下班卡火热发行 20元/张
查看:9773 | 回复:180
发新话题
不看签名 不看头像 打印

[06-10] 主板,CMOS/BIOS,内存,光驱软驱常见故障diy维修指南

机器使用两根以上的内存条,内存条不是同一品牌同一型号,因为内存条的工作频率和存取速度不同而导致开机报警
2、开机报警,但主机能够正常启动
    开机有救护车的报警声,但显示器有图像显示,主机启动,能够进入系统
    ·CPU温度检测异常但未达到立即关机程度
    ·主机开关电源输出电压异常,偏高或偏低
    ·主板有缺陷,开机后有时偶尔会出现救护车的报警声,但有时却能够正常启动
    开机有间断的“嘀嘀”报警声,主机能够正常启动,显示器有图像显示,能够进入系统
3、开机不报警,主机能够正常启动,但无法进入桌面正常操作
    (1)、同样一台机器安装WIN98系统正常,操作也没有问题,但是却无法正确安装WINXP系统,在安装过程中突然死机,一般是在硬件检测时长时间停滞不前。
附件: 您所在的用户组无法下载或查看附件
注意:主板自带的防病毒开关如果打开时,在安装WINDOWS操作系统时会在安装过程中突然中止。这种CMOS设置造成的系统不能正常安装和内存问题造成的系统无法安装表现是有差别的,这需要我们在实际工作中注意。
附件: 您所在的用户组无法下载或查看附件
(2)、在安装过程中提示在光盘上找不到某DLL文件或其他文件,致使安装中断。这种情况经常出现,在排除不是因为我们使用光盘的原因和光驱读盘性能下降的情况后,就可以确定是内存的不稳定造成的,也可能是内存超频了。
附件: 您所在的用户组无法下载或查看附件
(3)、虽然能够进入桌面,但在操作过程中经常提示“非法操作”,出现蓝屏死机现象。
附件: 您所在的用户组无法下载或查看附件
(4)、无法安装WIN98,在安装过程中提示“CAB”压缩文件无法解压。这种故障我们在WIN98时代经常遇到,在我们输入SETUP回车后,系统马上就弹出提示信息,无法打开“CAB”压缩文件。遇到这种故障时,我们先要检查内存的参数设置是否正常,再检查内存条的安装是否正确,牢靠,内存条的金手指有无氧化现象。如果上述故障都排除了,那就是内存条出现了问题,一般都是内存芯片老化造成的。
    (5)、 系统能够加电自举,但是满屏异常乱字符或不规则字符图像等。
附件: 您所在的用户组无法下载或查看附件
(6)、能够正常启动,但一进入WIN98桌面就提示注册表错误,需要修复注册表。不过等你使用“SCANREG /RESTORE”命令修复注册表后,故障依旧。
附件: 您所在的用户组无法下载或查看附件
(7)、正常启动,但进入桌面后花屏,不过进入安全模式却正常。这种故障多见于集成显卡的机器,显卡共用主机内存,所以当内存出现问题时就会先表现在显示方面。
附件: 您所在的用户组无法下载或查看附件
4、开机不报警,主机也不启动
    内存芯片老化失效
    导致机器能够加电但不能完成自举过程,所以系统也无法开始自检。具体表现为按下主机电源开关后,主机的电源风扇开始工作,CPU风扇也工作,主机没有报警声,长时间显示器也没有图像出现。
    对于此类故障可以采用排除法,如果只有一条内存可以拔掉内存再加电试机观察机器是否有内存报警;如果有两条内存逐一替换测试就可以了。
    CMOS中内存的参数设置错误如果我们在CMOS设置中人为了改变了内存的读写参数,就可能出现机器重启后长时间显示器没有画面出现,也没有机器报警的声音,只有风扇转动的声音。对于此类故障的解决就需要我们打开机箱对CMOS进行放电,把CMOS的设置改变默认值就可以正常启动。
    更换内存条后,ESCD数据未及时更新
附件: 您所在的用户组无法下载或查看附件
在CMOS设置中PNP/PCI Congfigurations选择中的第一项就是“RESET Congiguration Data”,其可选项只有“Disable”和“Enable”两项,正常打开是为“Disable”选项。平时我们在进行装机和维修时一般也不注意此项的作用,而有部分机器如果我们不对此项操作,当我们改变了机器的硬件配置时系统就无法识别新的硬件,并且还会出现无法正常启动的故障。
    所以当我们添加了硬盘,光驱,内存或者是更换了上述硬件时,就需要进入CMOS设置把此项设为“Enable”,重新启动电脑,然后在计算机启动后就会完成右图所示的“Updating ESCD... Success”更新过程。同时,该项设置为“Enable”只是单次有效,启动后会自动的再变换为“Disable”。
    当然我们也可以不让ESCD管理系统的硬件资源,也可以清除CMOS信息来清除ESCD数据的配置信息。
5、系统能够正常安装也能够正常操作,但无规律出现异常
    (1)、无规律丢失某一系统文件,造成系统在使用一段时间后不能正常启动,只能重新安装操作系统。
附件: 您所在的用户组无法下载或查看附件
2)、桌面操作正常,但打印机不能正常打印,无论是更换打印机,还是更换数据线,打印机驱动程序都不能排除故障,最后更换内存条后问题解决。
    (3)、系统安装,操作都正常,但是偶尔系统会出现无规律的自动重启。开机数个小时后用手接触内存条表面,会明显感觉内存条的发热量大,表面烫手。
    (4)、使用一段时间后开机内存报警黑屏,只需要重新拔插一下内存故障就可以排除。但继续使用一段时间后同样的故障会再次出现。这类故障起初看起来是小问题,只要拔插一下内存就解决了,但是如果是每个月出现一次这样的故障,你还能认为这是小问题吗?此问题的根本原因是内存和主板的兼容性差,类似的有捷波P4XFA主板与茂矽PC266 CL2.5 128MDDR内存;捷波694AST2主板与茂矽 128M SDRAM内存;捷波P4MFM主板,茂矽SDRAM 256M内存都发生过类似的频繁开机报警的故障,但是拔插内存后运行一切正常。解决的方法是更换内存或主板。
    (5)、系统的安装操作都正常,但是连续开机几个小时后,会明显感觉系统的运行速度越来越慢,最后出现系统资源耗尽而死机。
附件: 您所在的用户组无法下载或查看附件
(6)、主机内灰尘过多,造成内存条散热不良,在机器使用一定时间后,因为内存发热量大而导致系统蹦溃。
    (7)、内存部分芯片损坏,导致硬盘出现坏块或无法格式化。
    (8)、系统在运行过程中随机性出现死机现象。此类故障一般是使用了两条或两条以上不同品牌不同型号不同速度的内存条造成的;也可能是内存质量不佳,内存的速度过高造成的。
    (9)、系统在使用过程中,会经常报注册表错误,提示用户恢复注册表。但恢复注册表或重装系统后,仍然出现同样的提示。这种故障一般是内存质量不佳或内存超频使用造成的。
    (10)、系统正常加电自检,但是进入桌面后会无规律出现60秒自动关机。对于60S自动关机,大家都是因为冲击波病毒后才了解的,其实这是当系统资源出现较严重错误时,系统为了安全退出而自动关闭当前操作的系统提示。当系统内存性能不稳定时,在运行过程中因为数据错误,导致系统无法正常计算运转,所以就自动关机退出。
附件: 您所在的用户组无法下载或查看附件
下面几个故障都是集成显卡共享主机内存产生的:
    (11)、能够正常安装系统也能够正常使用,但经常出现开机后自动进入安全模式,也就是普通电脑用户反映的“屏幕图标变大了,颜色也不正常”,退出后能够正常进入“Normal”操作。
    (12)、开机启动自检都正常,但是进入桌面后花屏,进入安全模式也花屏。
附件: 您所在的用户组无法下载或查看附件
(13)、正常启动,但只要移动鼠标屏幕的图像就剧烈抖动,仔细观察发现只要有应用程序在内存中运行就会出现窗口剧烈抖动。这种故障的原因是内存的性能不佳,机器同时使用的也是集成显卡,当机器内存有大量数据运算时,内存自身的内部干扰造成数据错误,才产生了窗口局部抖动的故障。
附件: 您所在的用户组无法下载或查看附件
解决的办法只有降频使用或更换内存。

    (14)、这种故障也是因为共享内存的集成显卡产生的,屏蔽图像正常,但是每一个字符和图像的边缘都有一个模糊的影子。更换CRT显示器和液晶显示器都有此故障。
附件: 您所在的用户组无法下载或查看附件
有的表现为使用CRT显示器屏幕图像正常,但是使用液晶显示器时就会出现整屏图像类似磁场干扰的闪烁,这可不是磁化呀。这类故障也是因为使用集成显卡共享主机内存(如华擎M266A主板)产生的,更换独立显卡后故障消失。
    三、一些其他故障
    这类问题多数都是人为判断错误,人为的操作不当,使用者经验不足,配置文件错误造成的故障,只要进行合理的设置就可以解决,无需更换内存条。

1、内存部分减少
    开机后,在WINDOWS中发现内存减少,主要是板载集成显卡共享内存后,造成在WINDOWS中检测内存不等于实际失物理内存。
2、系统在运行或加载大的软件后,系统提示内存不足
附件: 您所在的用户组无法下载或查看附件
这种故障一般是用户在长时间使用过程中,C盘的可用空间不足造成的。主要是用户没有及时清理C:\windows\temp目录下的临时文件,致使C盘的可用空间过少所致。
3、系统提示“系统资源耗尽,无可分配系统资源”
    系统运行速度非常慢,点击鼠标后需要几十秒或者上分钟后机器才有所动作。
4、增加内存后系统无法识别,或增加内存后系统无法正常工作,经常出现死机,重启,蓝屏现象
   内存知识介绍
1、内存的供电与接地
   SDRAM内存条为双面168针结构,其中电源线17根(有6,18,26,40,41,49,59,73,84,90,102,110,124,133,143,157,168),地线18根(如162,152,148,138,127,116,107,96,85,78,68,64,54,43,32,23,11,1),数据线64根,地址线14根,39和122线为BANK地址线。
2、内存BANK位置的差别
   DDR内存的第181,182,183针是用来判断哪个BANK插装有内存条的。
内存混插常见问题和解决方法


经常关注三大件市场变化的朋友都会发现,目前大容量的内存越来越便宜了,这让很多用户都有了升级内存的想法。纵观目前的内存市场,新掘起的品牌还真不少,在内存的频率上,如今DDR266、DDR33的内存已经慢慢淡出市场,主流DDR400价格方面与前者已经没有太大的差距。   
  
  
   

  很多老用户机器上搭配上都是DDR 266的内存,但由于已经无法购买到此频率的内存条,因此大部分朋友购买了DDR 400的内存,但由于这两种内存的频率不匹配,往往会遇到一些麻烦。另外很多用户在购买内存条后发现与机器上装的内存条型号不一致,这样也会造成各种问题,接下来对使用不同型号、规格的内存易发生的各种故障总结如下。
一、电脑无法正常开机
  这是使用不同规格的内存条一个普遍存在的问题,出现这种情况一般有三解决的途径:
  1、更换内存条。这是最为直接的方法。如果你是购买的一条更大容量高频率的内存条,你可以先将原来较小容量的内存取下,将新购买的内存条插入机器中,如果能够开机,则进入至主板的BIOS中将内存的频率降至主板的支持的内存频率值进行降频使用,这样一般不会造成浪费,而且稳定性较好,一般情况下也不会出现问题。(注意芯片组对内存频率的支持不同,便如较早的815系列芯片只能够支持DDR266的内存,因此如果购买的DDR400的内存就得降超使用。)
  另外一种方法是可以将老内存条插到主板内存插槽较靠前的位置,即两根插槽可插在内存插槽一的位置,这样偶尔可以使用电脑开机。
  2、使用单独一条使电脑能够开机,这时进入BIOS设置,将与内存有关的设置项依照低速内存的规格设置。比如:使用其中的一根内存(如果是DDR266和DDR400的内存混合使用,最好使用DDR266的内存),将计算机启动,进入BIOS设置,将内存的工作频率及反应时间调慢,以老内存可以稳定运行为准,关机后插入第二根内存即可使两条内存保持相同的工作频率。
二、电脑工作不稳定,经常死机
  计算机运行不稳定这类问题的出现主要是内存兼容性造成的,解决的基本思路是与上面大体相同。第一是更换内存的位置;第二,在BIOS中关闭内存由SPD自动配置的选项,改为手动配置。第三,如果主板带有I/O电压调节功能,可将电压适当调高,加强内存的稳定性。
  内存进入双通道时代后,不同型号的内存插在一起组建双通道更容量造成系统不稳定的现象,这是由于不同厂家的产品在设计时不尽采用的技术不同,而双通道对内存的要求相当的高,因此如果是在组建双通道时出现经常死机等不稳定现象时,可以不组建双通道功能来测试,如果没有问题则可以采用这种方式。
三、混插或升级内存条后内存容量识别不正确
  造成这种现象的原因一般有以下几种:
  第一种可能是主板芯片组自身的原因所造成的,一些老主板只支持256MB内存的容量(如英特尔i815系列最高只支持512MB的内存容量),超出的部分均不能识别和使用。当然还有一些情况是由于主板无法支持高位内存颗粒造成的,解决这类问题的惟一方法就是更换主板或者内存。另外在一些情况下通过调整内存的插入顺序也可以解决此问题,大家在遇到这类问题时可以亲自动手多试一下。
  内存混插不稳定的问题是一个老问题了。从当年的EDO到SDRAM再到DDR,这类的问题一直存在。因此虽然现在高频率的大容量内存虽然价格与低频率相差不大,但大家在购买时首先还是要从主板及旧内存的角度出发,注意看清主板支持内存的容量规格,并注意内存的品牌及型号,尽量做到与老内存一致。
  市场上的内存种类繁多,其兼容性能也不尽相同,大品牌的产品兼容性就做的相当出色,因此尽量购买一些大品牌的内存,比如金士顿、金邦等,它们的电气兼容性一般比较好,出现问题的几率要低一些。
  如果比较注重价格,可以购买一般内存,但要尽量选择宽PCB板的内存,这种内存的排阻并非像窄条那样是在PCB板内的,所以从稳定性和兼容性上来说要好一些,两者价格差别非常小。
内存技术常见问题解答


1. 内存的单面与双面,单Bank与双Bank的区别?
   
  
  
   
单面内存与双面内存的区别在于单面内存的内存芯片都在同一面上,而双面内存的内存芯片分布在两面。而单Bank与双Bank的区别就不同了。Bank从物理上理解为北桥芯片到内存的通道,通常每个通道为64bit。 一块主板的性能优劣主要取决于它的芯片组。不同的芯片组所支持的Bank是不同的。如Intel 82845系列芯片组支持4个Bank,而SiS的645系列芯片组则能支持6个Bank。如果主板只支持4个Bank,而我们却用6个Bank的话,那多余的2个Bank就白白地浪费了。双面不一定是双Bank,也有可能是单Bank,这一点要注意。
   2. 内存的2-2-3通常是什么意思?
这些电脑硬件文章经常出现的参数就是在主板的BIOS里面关于内存参数的设置了。通常说的2-2-3按顺序说的是tRP(Time of Row Precharge),tRCD(Time of RAS to CAS Delay)和CL(CAS Latency)。tRP为RAS预充电时间,数值越小越好;tRCD是RAS到CAS的延迟,数值越小越好;CL(CAS Latency)为CAS的延迟时间,这是纵向地址脉冲的反应时间,也是在一定频率下衡量支持不同规范的内存的重要标志之一。
   3.内存的双通道技术和单通道有什么不同?
什么是双通道DDR技术呢?需要说明的是,它并非我前面提到的D D R I I,而是一种可以让2条D D R内存共同使用,数据并行传输的技术。双通道DDR技术的优势在于,它可以让内存带宽在原来的基础上增加一倍,这对于P 4处理器的好处可谓不言而喻。400M H z 前端总线的P 4 A处理器和主板传输数据的带宽为3.2G B /s,而533 M Hz 前端总线的P4B处理器更是达到了4.3G B/s,而P4C处理器更是达到了800MHZ 前端总线从而需要6. 4 G的内存带宽。但是目前除了I850E支持的R ambus P C10 66规范外,根本没有内存可以满足处理器的需要,我们最常用的DDR333本身仅具有2.7G B/s的带宽。DDR400也只能提供3.2G /s的带宽。也就是说,如果我们搭建双通道DDR400的内存,理论上提供2倍DDR400的带宽。将从而根本的解决了CPU和内存之间的瓶颈问题。
4.DDR-Ⅱ和现在的DDR内存有什么不同?
DDR-II内存是相对于现在主流的DDR-I内存而言的,它们的工作时钟预计将为400MHz或更高。主流内存市场将从现在的DDR-400产品直接过渡到DDR-II。目前DDR-II内存将采用0.13微米工艺,将来会过度到90纳米,工作频率也会超过800MHZ。
都是内存插槽惹的祸 内存插槽损坏故障三例


内存可以说是一台电脑中故障最频繁的部件之一,由于内存故障的表现都比较直接,因此我们在维修时并不用花太多的时间去判断故障的出处,一般情况下只要更换一条新的内存条,如果机器能够顺利启动并能够稳定运行,即断定内存条出现了问题。   
  
  
   
目前市场中生产内存的厂商众多,价格也相对便宜了许多,出现内存故障后我们一般会选择更换新的内存条来解决。其实有些情况下,并不是内存本身出现了问题,而是由于主板的质量不过硬或是我们经常对内存条进行插拔,导致内存插槽变形而发生机器不能启动、频繁死机等故障,接下来笔者就在使用电脑中遇到的内存故障进行简单的总结,有遇到以下故障的朋友不妨按照笔者的方法亲自动手试试,也许会给你带你意想不到的惊喜。

一、电脑经常蓝屏死机,原来都是内存插槽惹的祸
  故障现象:一台2000的组装兼容机,具体配置如下:英特尔赛扬1.1GHz处理器(370针),金士顿256M DDR266内存,微星815PE主板,七彩虹MX400显卡,希捷40GB硬盘,三星DVD-ROM光驱,使用到现在没有出现过任何的问题。最近一段时间笔者发现这台电脑使用一段时间后机器经常出现蓝屏和死机的现象,导致电脑无法正常使用。死机以后重新按下电源开关有时不能够正常启动,机器报警提示内存有问题,将内存重新插拔后机器便能够正常启动,但使用一段时间后依旧会出现蓝屏或死机,大约在二个小时左右。蓝屏屏幕上的出错信息为“Vxd、Vmm(01)文件出错”。
  故障分析与处理:根据蓝屏时的出错提示可知是内存中某种虚拟文件出错,另外在无法启动时机警的报警提示可以十分准确的判断内存出现了问题。开始时笔者认定可能是可能是接触不良,也是经常通过插拔来解决问题。便这样终不是解决问题的办法。于是笔者将内存条从机器中取出,用橡皮泥仔细的擦试内存条的金手指,并仔细检查了内存上的小元器件,发现没有太大的问题,重新插入机器后故障并没有得到解决,问题依旧。
  于是笔者从另外一台机器中取出一条正常使用的内存条插入到这台故障机中进行测试,使用一段时间后机器死机,故障并没有解决。看来不是内存条的问题。于是仔细检查主板上的内存插槽,发现插内存条的插槽有点变形,看来问题出现在这里了。于是将内存条插入另外一条插槽中(由于笔者习惯将内存插在DIMM1的位置上,在解决故障时并没有考虑到插槽也会出现问题),重新开机,在玩了两个多小时的游戏后,机器工作一切正常,问题解决。

二、升级内存后导致电脑无法正常启动
  故障现象:一台采用英特尔赛扬1.7GHz的品牌机,内存容量为256MB DDR333,工作一直比较稳定。近期为这台机器进行了升级,加装了一条同型号256M DDR333内存,开机后开机遭遇黑屏,此时显示器的电源指示灯是亮的,机器无法通过自检,机箱喇叭长时间报警,提示内存无法通过自检。
  故障分析与处理:机箱喇叭提示表现,故障的根源就在内条上。因为是在加装了一根内存条后发生的故障,所以问题应该是在新加的256MB内存上,于是将加装的256MB内存拔掉(发现内存很烫),然后开机,可是故障依旧。是不是显卡或CPU有问题呢?于时利用排除法,将显卡与CPU分别更换掉进行逐一排除,结果问题依旧。
  逐一排除CPU、硬盘、内存、显卡后,看来是主板有问题。找来一块能够支持英特尔赛扬处理器的主板进行测试,一切正常,电脑顺利进行系统。那么主板上的那个部位出现问题了呢?按照机器的提示,内存故障的可能性比较大,是不是主板上的内存插槽有问题呢?于是重点将检查的对象放在主板的内存插槽之上。通过认真仔细的检查,发现内存插槽中的第8、9脚碰在了一起,短路了。用小镊子轻轻将碰在一起的第8、9脚分开,再小心地装上内存和其它的部件,开机后测试,终于见到了久违的蓝天白云,故障排除。

三、插入不完全,导致机器无法正常启动
  故障现象:随着夏日的临近,笔者对电脑进行了“大扫除”,清理了机箱内积落的灰尘,并加装了新的散热风扇。大扫除结束后,笔者迫不及待的开启电脑,检查自己的劳动成果,但却遇到了麻烦。按下机箱电源键后,机器无法正常启动,机箱喇叭短促的报警声说明机器的内存有了问题。
  故障分析与处理:笔者的爱机使用的两条256M DDR400内存,由于865PE的主板支持双通道,因此组建成双通道以提高系统的整体性能。内存的品牌为金士顿,按理说稳定性还相当的不错,笔者这台电脑使用了一年多都没有出现过故障。
  打开机箱,仔细检查两条内存,这时发现笔者由于粗心大意将内存条插在了DIMM1与DIMM2的位置上,由于主板的内存插槽在DIMM1与DIMM3或DIMM2或DIMM4的位置上才组成双通道,因此这次并没有工作在双通道的模式下,但也不至于开不了机呀。于是笔者将DIMM2位置的内存取下准备插入DIMM3的插槽中,但当笔者在拔内存时发现内存条没有完全插入到内存插槽中,会不会是插入不完全造成的故障呢?于是笔者将内存取出会,重新插入,并进行了仔细的检查,确定已经完全正确的插入到内存插槽中,之后开机测试,随着一声清脆的“滴”声后,机器顺利进入系统,故障排除。
  故障总结:从上述的三起故障来看,内存插槽变形损坏,内存未安装好均可能导致各种异常现象,因此我们一旦确定是内存方面出现问题后,一定要从各方面入手,仔细的检查故障的出处。检查插槽,更换内存等仔细的测试,最后依照故障的表现找出问题的根源,并认真的总结和解决,这样再次遇到问题后,我们便有了经验,能够很快的检查并排除内存的各种故障
delphi 缓冲画图(内存画图)解决画图闪烁问题


介绍
用双缓冲进行绘图可解决在VC中绘图时的闪烁现象

   
  
  
   
正文
用vc做程序,如何画图是一个大家都很关心,但是却感到很难以理解的问题,因为在mfc的封装之下,没有现成的画图函数供你直接调用,像vb等等里面直接来个point之类的,常常让人感到无从下手。这两天帮人解决了一个用内存缓冲画图的问题,顺便也就谈谈这些东西,也算是总结。

我先来解释一下在mfc里面很关键的设备环境描述符,也就是所谓的DC(device context)。

还是从历史来看吧,dos时代,我们如果要绘图,必须通过一系列系统函数来启动图形环境(用过turbo pascal或者turbo c的人该还有印象吧),这之间对各种硬件的初始化参数都不相同,非常的烦人,常常还要查阅硬件手册,那时的程序智能针对最流行的硬件来编写,对不流行的就没有办法了。windows操作系统为了屏蔽不同的硬件环境,让编程时候不考虑具体的硬件差别,采取了一系列办法,设备环境描述符就是这样产生的。简单的说,设备描述符抽象了不同的硬件环境为标准环境,用户编写时使用的是这个虚拟的标准环境,而不是真实的硬件,与真实硬件打交道的工作一般交给了系统和驱动程序完成(这同样解释了为什么我们需要经常更新驱动程序的问题)。使用在windows图形系统(gdi,而不包括direct x)上面,就体现在一系列的图形DC上面,我们如果要在gdi上面绘图,就必须先得到图形DC的句柄(handle),然后指定句柄的基础上进行图形操作。

再来回忆一下,我们怎么在sdk的环境下面绘图呢,我想这个大家都不太清楚吧,但是确实很基础。在windows的sdk环境下面,我们用传统的c编写程序,在需要的绘图地方(比如响应WM_PAINT消息的分支)这样做:

hdc = GetDC( hwnd );
oldGdiObject = SelectObject( hdc,newGdiObject );
...绘图操作...
SelectObject( hdc,oldGdiObject );
DeleteObject( newGdiObject );
ReleaseDC( hdc);

或者是这样

BeginPaint( hwnd,&ps );//PAINTSTRUCT ps -- ps is a paint struct
...绘图操作...
EndPaint( hwnd )

这就是大概的过程,我们看到了hdc(图形DC句柄)的应用,在绘图的部分,每一个绘图函数基本上也要用到这个句柄,最后我们还必须释放它,否则将严重影响性能。每次我们都必须调用GetDC这个api函数得到(不能用全局变量保存结果重复使用,我在后面解释)。这些是最最基本的windows图形操作的方式,相比dos时代简单了些,但是有些概念也难理解了些。vb里面的简单的point函数其实最后也是被转化为这样的方式来执行,系统帮助做了很多事情。

到了mfc里面,由于有了封装,所有的hdc被隐藏在对象中做为隐藏参数传递(就是DC类的this啦~~),所以我们的关键话题就转变为了怎样得到想要的DC类而已,这个过程其实大同小异的。在消息响应的过程中,WM_PAINT被转变为OnDraw(),OnPaint()一系列函数来响应,这些函数一般都有个参数CDC *pDC传入进来,因此在这些函数里面,我们就只需要直接画图就可以了,和以前sdk的方式一样。

但是WM_PAINT消息响应的频度太高了,比如最小化最大化,移动窗体,覆盖等等都引起重绘,经常的这样画图,很是消耗性能;在有些场合,比如随机作图的场合,每一次就改变,还导致了程序的无法实现。怎么解决后一种问题呢。

ms在msdn的例子里面交给我们document/view的经典解决办法,将图形的数据存储在document类里面,view类只是根据这些数据绘图。比如你要画个圆,只是将圆心和半径存在document里面,view类根据这个里面的数据在屏幕上面重新绘制。那么,我们只需要随机产生一次数据就可以了。

这样还是存在性能的问题,于是我们开始考虑另外的解决方法。我们知道,将内存中的图片原样输出到屏幕是很快的,这也是我们在dos时代经常做的事情,能不能在windows也重新利用呢?答案就是内存缓冲绘图,我们今天的主题。

我们还是回到DC上来,既然DC是绘图对象,我们也就可以自己来在内存里面造一个,让它等于我们想要的图,图(CBitmap)可以存储在document类里面,每一次刷新屏幕都只是将这个图输出到屏幕上面,每一次作图都是在内存里面绘制,保存在document的图里面,必要时还可以将图输出到外存保存。这样既保证了速度,也解决了随机的问题,在复杂作图的情况下对内存的开销也不大(总是一副图片的大小)。这是一个很好的解决办法,现在让我们来实现它们。

我们在document类里面保存一个图片

CBitmap m_bmpBuf;//这里面保存了我们做的图,存在于内存中

在view类里面我们需要将这个图拷贝到屏幕上去
位于OnDraw(CDC *pDC)函数中:

CDC dcMem;//以下是输出位图的标准操作
CBitmap *pOldBitmap = NULL;
dcMem.CreateCompatibleDC(NULL);
pOldBitmap = dcMem.SelectObject(&pDoc->m_bmpBuf);
BITMAP bmpinfo;
pDoc->m_bmpBuf.GetBitmap(&bmpinfo);
pDC->BitBlt(0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(pOldBitmap);
dcMem.DeleteDC();

在我们需要画图的函数里面,我们完成绘图工作

CBmpDrawDoc *pDoc = GetDocument(); //得到document中的bitmap对象
CDC *pDC = GetDC();
CDC dcMem;
dcMem.CreateCompatibleDC(NULL);//这里我们就在内存中虚拟建造了DC
pDoc->m_bmpBuf.DeleteObject();
pDoc->m_bmpBuf.CreateCompatibleBitmap(pDC,100,100);//依附DC创建bitmap
CBitmap *pOldBitmap = dcMem.SelectObject(&pDoc->m_bmpBuf);//我们调入了我们bitmap目标

dcMem.FillSolidRect(0,0,100,100,RGB(255,255,255));//这些时绘图操作,随便你^_^
dcMem.TextOut(0,0,"Hello,world!");
dcMem.Rectangle(20,20,40,40);
dcMem.FillSolidRect(40,40,50,50,RGB(255,0,0));

pDC->BitBlt(0,0,100,100,&dcMem,0,0,SRCCOPY);//第一次拷贝到屏幕
dcMem.SelectObject(pOldBitmap);
dcMem.DeleteDC();

全部的过程就是这样,很简单吧。以此为例子还可以实现2个缓冲或者多个缓冲等等,视具体情况而定。当然在缓冲区还可以实现很多高级的图形操作,比如透明,合成等等,取决于具体的算法,需要对内存直接操作(其实就是当年dos怎么做,现在还怎么做)。

再来解释一下前面说的为什么不能用全局变量保存DC问题。其实DC也是用句柄来标识的,所以也具有句柄的不确定性,就是只能随用随取,不同时间两次取得的是不同的(使用过文件句柄地话,应该很容易理解的)。那么我们用全局变量保存的DC就没什么意义了,下次使用只是什么也画不出来。(这一点的理解可以这样:DC需要占用一定的内存,那么在频繁的页面调度中,位置难免改变,于是用来标志指针的句柄也就不同了)。
绝不要大意!三例内存故障分析与实战排解


正常使用的电脑,如果按下开关键后机器无任何反映,或是按下开关键机器能够正常点亮,但无论如何也无法进入操作系统,机箱的报警喇叭伴有长时间的短“嘀、嘀”的报警声,一般情况下我们认为是内存出现了问题,这时我们应该重点检查内存是否烧毁、松开等。   
  
  
   
内存的故障比较常见,解决起来也比较简单,接来来笔者就自己在使用电脑中遇到的几点故障整理如下,希望大家能够学得一点经验。

  故障一、清理电脑后机器无法启动故障排查

  故障表现与排除:朋友前不久攒了一台机器,配置为如下:英特尔奔腾506处理器,微星945P主板,七彩虹6600GT显卡,搭配一条1GB DDRII 533内存,采用希捷160GB SATA硬盘。随着夏季的慢慢到来,朋友准备为爱机清整灰尘,并加装新的散热装备。在清理完毕后,像往常一样将显卡、内存、硬盘等配件重新组装好,但在随后开机中,发现机器无法点亮,显示器指示灯不断闪烁,并有“嘟嘟”的报警声。开始朋友并没有太在意,以为只是内存或显卡没插好,于是把内存和显卡又重新插好,再次开机,机器还是不亮。

  按照机箱报警声判断,应该是内存出现了故障,于是朋友将内存替换后,按下开机按钮后电脑终于恢复正常!由于笔者的朋友内存还在保修期内,于是将内存拿到商家那里去检查,发现是内存条的电容片已被击穿,内存已经烧毁了!幸好商家信誉也是很不错的,终于还是换了一根内存,也算是不幸中的万幸了!

  故障总结:回想烧毁事件的详细情形,发现问题出在以下方面:内存条上积有大量灰尘,容易造成短路。而最关键的是,朋友在插上内存条时没有将插座电源关闭!而在插上内存条的一瞬间,由于ATX电源并不是完全断电的,主板的内存插槽上仍有少量电流存在。因此在插上内存条的同时,电流(哪怕是微电流)就容易引发短路现象,而此时的瞬间电流足以将“脆弱”的内存烧毁!

  总之,为了避免“悲剧”的重演,大家应该对机箱内的灰尘及时清理。而在插拔内存等配件的时候,一定要格外小心,最重要的是,千万要先关闭插座的电源!切记不要因为一时的马虎大意而造成不必要的损失。

  故障二:内存插槽损坏造成机器不稳定故障排查

  故障表现:一台2000的组装兼容机,使用到现在没有出现过任何的问题。最近一段时间笔者发现这台电脑使用一段时间后机器经常出现蓝屏和死机的现象,导致电脑无法正常使用。死机以后重新按下电源开关有时不能够正常启动,机器报警提示内存有问题,将内存重新插拔后机器便能够正常启动,但使用一段时间后依旧会出现蓝屏或死机,大约在二个小时左右。蓝屏屏幕上的出错信息为“Vxd、Vmm(01)文件出错”。

  故障分析与处理:根据蓝屏时的出错提示可知是内存中某种虚拟文件出错,另外在无法启动时机警的报警提示可以十分准确的判断内存出现了问题。开始时笔者认定可能是可能是接触不良,也是经常通过插拔来解决问题。便这样终不是解决问题的办法。于是笔者将内存条从机器中取出,用橡皮泥仔细的擦试内存条的金手指,并仔细检查了内存上的小元器件,发现没有太大的问题,重新插入机器后故障并没有得到解决,问题依旧。

  于是笔者从另外一台机器中取出一条正常使用的内存条插入到这台故障机中进行测试,使用一段时间后机器死机,故障并没有解决。看来不是内存条的问题。于是仔细检查主板上的内存插槽,发现插内存条的插槽有点变形,看来问题出现在这里了。于是将内存条插入另外一条插槽中(由于笔者习惯将内存插在DIMM1的位置上,在解决故障时并没有考虑到插槽也会出现问题),重新开机,在玩了两个多小时的游戏后,机器工作一切正常,问题解决。

  故障三:内存金手指氧化生锈造成机器无法启动故障排查

  笔者朋友是一名超级的电脑游戏发烧友,玩游戏是个高手,对电脑硬件了解却是不深。前不久,这位朋友的电脑出现了问题:打开机箱电源后机器出现长时间的报警,根本无法正常进入操作系统。于是打电话向笔者求救。笔者对朋友的这台电脑还是相当熟悉的,这是一台两年前组装的采用英特尔奔腾4 2.4GB处理器的电脑,主板采用的是硕泰克865PE芯片组,一条256M DDR333内存,硬盘为西部数据WD800BB,显卡为七彩虹R9550,另外还有一个三星DVD-ROM。根据朋友描述的现象,笔者断定是内存条出现了问题,于是让朋友将内存条拔下后换个插槽试试看。

  故障排除:朋友按照笔者的方法将内存条取下后换了一个插槽重新插入,开机后随着一声清脆的“滴”声,问题解决。而就在前几天,朋友慌慌张张的打开电话说电脑又出现毛病了,和前几次的故障相同,但这次无论怎么更换内存插槽均无法正常启动了,主板上仅有的四条内存插槽已经逐个试了个遍。

  于是笔者带着简单的工具来到朋友家,打开机箱,取下这条内存仔细的观察,内存的PCB板上的各个元件并没有出现过任何烧毁过的痕迹。但笔者在检查中发现内存的金手指上有几处明显的锈斑,于是笔者用带来了橡皮将这些锈斑仔细的擦拭干净,并将内存的四个插槽进行了仔细的清整,完成后将内存重新插入到任意一条插槽中,按下机箱上的POWER按键,随着一声清脆的“滴”声过后,机器下正常启动。

  总结:因为内存条的金手指镀金工艺不佳或经常拔插内存,导致内存在使用过程中因为接触空气而氧化生锈,逐渐的与内存插槽接触不良,最后产生开机不启动报警的故障。另外由于我们在插内存条时不注意,用手直接接触内存条的金手指,使手上的汗液附着在金手指上,这样就地取更容易造成金手指氧化生锈。另外,如果用手直接接触内存的金手指,身体上的静电极有可能把内存上的颗粒或电容击穿,导至内存报废,因此在任何情况下一定不要用手接触内存的金手指,防止出现意外