关于作者

用户名:lgs0540
笔名:lgs0540
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



VC各类网站

下载

小说网站

数字电视

访问统计:
文章个数:16
评论个数:10
留言条数:0




Powered by BlogDriver 2.1

gary的博客

 

工作是一种乐趣时,生活是一种享受!工作是一种义务时,生活则是一种苦役。 MAIL:lgs0540@163.com

文章

软件测试包括哪些内容?

以下是一些需要考虑的步骤:

1 得到需求、功能设计、内部设计说书和其他必要的文档

2 得到预算和进度要求

3 确定与项目有关的人员和他们的责任、对报告的要求、所需的标准和过程 ( 例如发行过程、变更过程、等等 )

4 确定应用软件的高风险范围,建立优先级、确定测试所涉及的范围和限制

5 确定测试的步骤和方法 ── 部件、集成、功能、系统、负载、可用性等各种测试

6 确定对测试环境的要求 ( 硬件、软件、通信等 )

7 确定所需的测试用具 (testware) ,包括记录 / 回放工具、覆盖分析、测试跟踪、问题 / 错误跟踪、等等

8 确定对测试的输入数据的要求

9 分配任务和任务负责人,以及所需的劳动力

10 设立大致的时间表、期限、和里程碑

11 确定输入环境的类别、边界值分析、错误类别

12 准备测试计划文件和对计划进行必要的回顾

13 准备白盒测试案例

14 对测试案例进行必要的回顾 / 调查 / 计划

15 准备测试环境和测试用具,得到必需的用户手册 / 参考文件 / 结构指南 / 安装指南,建立测试跟踪过程,建立日志和档案、建立或得到测试输入数据

16 得到并安装软件版本

17 进行测试

18 评估和报告结果

19 跟踪问题 / 错误,并解决它

20 如果有必要,重新进行测试

21 在整个生命周期里维护和修改测试计划、测试案例、测试环境、和测试用具

- 作者: lgs0540 2006年05月10日, 星期三 15:56  回复(0) |  引用(0) 加入博采

在Windows 2000 和XP中,系统包含以下缺省进程

在Windows 2000 和XP中,系统包含以下缺省进程:
Csrss.exe
Explorer.exe
Internat.exe
Lsass.exe
Mstask.exe
Smss.exe
Spoolsv.exe
Svchost.exe
Services.exe
System
System Idle Process
Taskmgr.exe
Winlogon.exe
Winmgmt.exe

下面列出更多的进程和它们的简要说明

进程名描述

smss.exeSessionManager
csrss.exe 子系统服务器进程
winlogon.exe管理用户登录
services.exe包含很多系统服务
lsass.exe 管理 IP 安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安全驱动程序。
svchost.exe Windows 2000/XP 的文件保护系统
SPOOLSV.EXE 将文件加载到内存中以便迟后打印。)
explorer.exe资源管理器
internat.exe托盘区的拼音图标)
mstask.exe允许程序在指定时间运行。
regsvc.exe允许远程注册表操作。(系统服务)->remoteregister
winmgmt.exe 提供系统管理信息(系统服务)。
inetinfo.exemsftpsvc,w3svc,iisadmn
tlntsvr.exe tlnrsvr
tftpd.exe 实现 TFTP Internet 标准。该标准不要求用户名和密码。
termsrv.exe termservice
dns.exe 应答对域名系统(DNS)名称的查询和更新请求。
tcpsvcs.exe 提供在 PXE 可远程启动客户计算机上远程安装 Windows 2000 Professional 的能力。
ismserv.exe 允许在 Windows Advanced Server 站点间发送和接收消息。
ups.exe 管理连接到计算机的不间断电源(UPS)。
wins.exe为注册和解析 NetBIOS 型名称的 TCP/IP 客户提供 NetBIOS 名称服务。
llssrv.exe证书记录服务
ntfrs.exe 在多个服务器间维护文件目录内容的文件同步。
RsSub.exe 控制用来远程储存数据的媒体。
locator.exe 管理 RPC 名称服务数据库。
lserver.exe 注册客户端许可证。
dfssvc.exe管理分布于局域网或广域网的逻辑卷。
clipsrv.exe 支持“剪贴簿查看器”,以便可以从远程剪贴簿查阅剪贴页面。
msdtc.exe 并列事务,是分布于两个以上的数据库,消息队列,文件系统或其它事务保护护资源管理器。
faxsvc.exe帮助您发送和接收传真。
cisvc.exe 索引服务
dmadmin.exe 磁盘管理请求的系统管理服务。
mnmsrvc.exe 允许有权限的用户使用 NetMeeting 远程访问 Windows 桌面。
netdde.exe提供动态数据交换 (DDE) 的网络传输和安全特性。
smlogsvc.exe配置性能日志和警报。
rsvp.exe为依赖质量服务(QoS)的程序和控制应用程序提供网络信号和本地通信控制安装功功能。
RsEng.exe 协调用来储存不常用数据的服务和管理工具。
RsFsa.exe 管理远程储存的文件的操作。
grovel.exe扫描零备份存储(SIS)卷上的重复文件,并且将重复文件指向一个数据存储点,以节省磁盘空间(只对 NTFS 文件系统有用)。
SCardSvr.ex 对插入在计算机智能卡阅读器中的智能卡进行管理和访问控制。
snmp.exe包含代理程序可以监视网络设备的活动并且向网络控制台工作站汇报。
snmptrap.exe接收由本地或远程 SNMP 代理程序产生的陷阱(trap)消息,然后将消息传递到运行在这台计算机上 SNMP 管理程序。
UtilMan.exe 从一个窗口中启动和配置辅助工具。
msiexec.exe依据 .MSI 文件中包含的命令来安装、修复以及删除软件

- 作者: lgs0540 2005年11月29日, 星期二 11:50  回复(0) |  引用(0) 加入博采

有關內存方面的

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等
文章链接:http://dev.yesky.com/254/2191254.shtml 
 
论C/C++函数间动态内存的传递 (2005-07-30)  

当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。
文章链接:http://dev.yesky.com/81/2051581.shtml 
 
C++内存对象大会战 (2005-07-07)  

如果一个人自称为程序高手,却对内存一无所知,那么我可以告诉你,他一定在吹牛。
文章链接:http://dev.yesky.com/105/2030105.shtml 
 
链表的C语言实现之动态内存分配 (2005-04-30)  

但我们未学习链表的时候,如果要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组
文章链接:http://www.yesky.com/311/1943811.shtml 
 
C++中堆内存的概念和操作方法入门 (2005-03-28)  

我们知道在c/c++中定义的数组大小必需要事先定义好
文章链接:http://www.yesky.com/12/1927012.shtml 
 
C++中用vectors改进内存的再分配 (2005-01-10)  

本文将讨论如何使用 STL 的 vector 进行内存的再分配
文章链接:http://www.yesky.com/11/1898511.shtml 
 
水滴石穿C语言之内存使用 (2004-12-03)  

内存是一种重要的资源,在编程中对内存的使用不当,将导致程序崩溃
文章链接:http://www.yesky.com/476/1883476.shtml 
 
C++中动态内存分配引发问题的解决方案 (2004-10-21)  

假设我们要开发一个String类,它可以方便地处理字符串数据。我们可以在类中声明一个数组,考虑到有时候字符串极长
文章链接:http://www.yesky.com/285/1866785.shtml 
 
浅谈C++中的内存管理 (2003-08-04)  

有的时候变量生存周期已经结束,但是所分配的那块内存空间还是存在的......
文章链接:http://www.yesky.com/449/1718949.shtml 
 
控制C++的内存分配 (2004-01-25)  

在嵌入式系统中使用C++的一个常见问题是内存分配,即对new 和 delete 操作符的失控
文章链接:http://www.yesky.com/445/1713445.shtml 

- 作者: lgs0540 2005年11月28日, 星期一 14:32  回复(0) |  引用(0) 加入博采

精确迭代法

迭代法”也称“辗转法”是一种不断用变量的旧值递推新值的过程。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”,这两种属于“近似迭代法”。在这里我们用的是精确迭代法求两正整数的最大公约数。以后我会讲到“近似迭代法”求二元方程。

求两正整数的最大公约数

原理1.比较两数的大小,用大数除以小数,将得到一个余数;2.再将小数作为先前的大数,余数作为先前的小数,再重复第一步;3.直到所得的余数为0时停止,那么我们得到的最后那一个余数就是他们的最大公约数。

模型:假设两正整数为mn,m>n.

      u=m,v=n

      当r=m/n不为0时,则有:

          u=v;

          v=r;

      当r为0时,输出v。

    当然这不是求最大公约数的唯一方法,还可以用穷举法等,这里我就不多说了。

例如下:(C++)

#include<iostream.h>

main()

{

 int u,v,r;

 cout<<"Enter two positive integers:";

 cin>>m>>n;

 if(m>n)

    u=m;

 else 

    v=n;

 if(u*v!=0)

 {

  while(r=u%v)

  {

   u=v;

   v=r;

   }

  cout<<"The gcd is:"<<v<<endl;

  }

  else cout<<"Divided by zero!"<<endl;

}

- 作者: lgs0540 2005年09月23日, 星期五 20:46  回复(0) |  引用(0) 加入博采

基础的内存映射文件技术
1. 用途和基本操作
   用于不同进程之间的内存共享操作, 可以将一个物理文件映射到内存当中然后直接利用分配到的或者打开的命名共享内存的地址空间实现资源共享访问

2. 相关流程
1) 新建命名共享内存
   首先利用CreateFile或者CreateFileForMapping获得一个用于映射的物理文件句柄, 然后利用该文件句柄结合CreateFileMapping得到一个命名的共享内存映射文件句柄

2) 打开命名共享内存
   如果需要共享已经存在的命名共享内存映射文件, 使用OpenFileMapping函数

3) 获得地址空间指针
   进行内存映射文件的读写和一般的文件读写不同, 是直接面对你申请的地址空间, 为此需要使用MapViewOfFile得到相关的地址LPVOID类型的指针.

   如果需要进行文件写入, 可以通过类型转换直接对于内存地址进行赋值, 比如:
   memcpy( lpAddress, lpBuf, ....)
   这里自然需要防止内存溢出的情况

   如果是读取操作, 呵呵将参数顺序调整一下就可以了

4) 将内存复制到所映射的物理文件上面
   FlushMapViewOfFile函数可以将内存里面的内容DUMP到物理磁盘上面

5) 卸载内存映射文件地址指针
   UnmapViewOffFile函数就是卸载

6) 关闭内存映射文件
   太简单了, CloseHandle搞定

2. 相关背景
   其实内存映射技术本身没有什么难度, 关键在于共享内存映射的使用上面, 特别是进行不同进程之间的同步, 尤其是如果该内存映射是跨机器的情况下, 你需要考虑不同的异常情况.

- 作者: lgs0540 2005年09月23日, 星期五 20:40  回复(0) |  引用(0) 加入博采

PCR的物理意义
   1.PCR 仅仅在实时播出流中才有意义(即前端编码器实时编码或视频服务器实时播出,后端机顶盒实时接收的情况),对DVD机这类从文件中取TS流的设备PCR毫无意义。
   2.前端编码器工作原理:编码器中有一个27M的时钟,编码过程中不断读取硬件时钟放入TS中PCR字段,和PES的PTS,DTS字段。
   3.后端机顶盒工作原理:机顶盒中也有一个27M的时钟,它根据PES中的PTS,DTS字段中指示的时间进行解码和显示。那么TS中的PCR还有什么用呢?首先如果前端编码器的时钟与后端机顶盒中时钟"绝对"同步,那么TS中的PCR就没有任何意义了。但是如果"绝对"变对"相对"以后会出先什么情况?它们之间的"微小"误差经过长时间的累积(1-2小时就足以)机顶盒中解码器会因为自己时钟"快"了而造成buffer中没有数据--停帧,会因为时钟"慢"了而造成buffer中数据溢出--丢帧。所对它需要TS中的PCR字段来不断修正自己时钟与编码器时钟间的"微小"误差。
   4.TS流在经过复用器,加扰机这些中间设备时,PCR"必须"进行"非均匀"延迟修正(原因如上)。所以对于没有PCR修正功能的复用器和加扰机,建设大家一定不要买。
   5.为什么说TS流中的PCR对DVD机毫无意义呢?DVD机是从光盘中读取TS流,读盘速度与TS流传送速率毫无关联,PCR还有指示时间的意义吗?但因为它不是"实时流"传送,所以不会出现buffer溢出的问题,也就不会产生停丢帧现象。
     明白了PCR,PTS,DTS的物理意义后对于它们的设置就不会有太大问题了。

- 作者: lgs0540 2005年09月22日, 星期四 20:37  回复(0) |  引用(0) 加入博采

si标准2(转)
1、网络信息表(NIT)
网络信息表提供一组传输流以及相应的调谐信息。NIT在IRD(整合接收解码器)启动程序中用到,并且调谐信息可以存储到不变的存储器中。NIT还可以用来标志调谐信息的变化。NIT遵从如下规定:
a、当前的传输系统必须包含NIT。
b、当且仅当NIT包含可用的传输系统描述符,当前传输系统才是有效的。这就指定了NIT包含有效信息的条件。在一些广播传输系统边界,TS中的NIT也被允许用来描述广播频道中的早期的网络。IRD不得不选择一个不同的机制来获得当前传输系统的相应的调谐信息。例如,一个卫星IRD接受到当前传输系统的一个卫星传输系统描述符,那么这个描述符被视为有效,如果一个电缆IRD接收到当前传输系统的一个电缆传输系统描述符也是有效的,但是,如果电缆IRD接收到当前传输系统的一个卫星传输系统描述符,那么这个描述符对于这个IRD就是无效的。
c、如果当前传输系统一个有效的NIT在SI比特流中出现,那么这个NIT应当列出当前传输系统中所有的TS。
d、SI流每10秒钟应当至少包含8个TS包来传输NIT或者空包。这个规定简化了广播传输边界中NIT的复位(replacement)。使用这样的复位机制,使得本地频率控制使用低廉设备成为可能。

SI使用两个标志来描述传输系统。它们分别是network_id和original_network_id。后者用来作为一个TS中的一个服务的唯一标志符,即使这个TS被传送到了其他的传输系统之中。一个TS可以被path:original_network_id/transport_stream_id唯一标识。一个服务可以被path:original_network_id/transport_stream_id/service_id唯一标识。显然,network_id不在这个path之内。另外,每个original_network_id中都有不同的service_id。当一个服务(同一个TS内)被传送到另一个传输系统后,只有network_id改变了,original_network_id不受影响。
下面举个例子,考虑如下情况:有两个服务(A和B),它们源于两个不同的传输系统并且碰巧有相同的service_id和transport_stream_id,它们被传输到一个新的传输系统。
在这个例子中,这两个服务被安排在新network中的不同的TS中。如果这两个服务被放在同一个TS中,那么必须修改服务的ID号,因为在同一个TS中一个service_id不能够分配给多个服务,并且一个TS仅仅可以对应一个original_network_id。

2、BAT信息
BAT提供一组服务,这些服务提供了一个基础,IRD在这些基础之上向用户展示有效的服务。BAT的传输是可选的。下面的规则提高了SI比特流的连贯性并且简化了IRD的工作。
SI比特流应当在每个BAT子表中列出集锦的所有服务。
注意:一个服务可以属于多个bouquet。这一规定使得IRD可以通过不同的TS得到一个服务。
如果IRD将bouquet中服务信息提供给用户,那么列在bouquet中的服务就得到保证,否则一些服务将会丢失。一个bouquet可以把不同网络传输的多个TS中的服务集中起来。如果BAT中所有服务都被列在SDT中,IRD对bouquet中所有服务信息的访问将会变得容易。同样的,如果NIT信息给出所有TS中service的容量,IRD对service的访问将会变得容易。

3、SDT信息
SDT用来罗列TS中service的名称以及其他参数。每一个TS中都有一个独立的SDT子表。为了提高对service的采集,定义了下列规则:
强制传输当前TS的SDT。
SDT列出的SI比特流至少包括TS中所有服务。
另外:
当前TS(例如table_id=0x46)中SDT描述其他TS时,应当列出这个TS的所有service。
强烈推荐service_id,在一个network中一旦把一个service_id分配给了一个特定的服务,那么这个service_id将不再变化,以便于IRD实现收藏频道列表之类的功能。

- 作者: lgs0540 2005年05月14日, 星期六 17:05  回复(3) |  引用(0) 加入博采

si标准入门1(转)
数字电视与传统模拟电视节目选择的方式完全不同, 传统电视的每一个频道对应一个节目,只要调到相应的频率, 就可以看到节目。 而在数字电视信号中,一路码流对应多路节目,使用复用技术就可以做到了。一个物理的频道只能给出包含多路节目的一路传输流。要观看其中的某一路节目,还必须从该传输流中提取出该路节目的压缩包,然后再进行解码。 所以怎样从众多的传输流中,选中一路节目播放,就变得很复杂。在mpeg-2的传输流(Transport Stream)中,节目专用信息PSI(Program Specific Information),就是规定不同节目和节目中的不同成分如何复用成一个统一的码流。以PSI为基础可以提供一个码流的构成,从而帮助用户对节目进行选择。DVB中的服务信息SI(Service Information)则对此进行了进一步的扩展,加入了一些对用户有用的信息,标示节目的类型,服务商,节目的相互关系等。正确的了解mpeg-2的PSI以及DVB的SI的结构,及其在节目组织,选择中的应用,可以正确理解service information在DVB解码中的地位。对于我们做好对数字节目的复用,也能起到帮助作用。
1, MPEG-2 TS中的PSI
PSI信息主要包括以下的表:
   PAT(Program Association Table):节目群丛表,该表的PID是固定的0x0000,它的主要作用是指出该传输流ID,以及该路传输流中所对应的几路节目流的 MAP 表和网络信息表的PID。
   PMT(Program Map Table):节目映射表,该表的PID是由PAT提供给出的。通过该表可以得到一路节目中包含的信息,例如,该路节目由哪些流构成和这些流的类型(视频,音频,数据),指定节目中各流对应的PID,以及该节目的PCR所对应的PID。
   NIT(Network Information Table):网络信息表,该表的PID是由PAT提供给出的。NIT的作用主要是对多路传输流的识别,NIT提供多路传输流,物理网络及网络传输的相关的一些信息,如用于调谐的频率信息以及编码方式。调制方式等参数方面的信息。
   CAT(Conditional Access Table):条件访问表,PID - 0x0001。
除了上述的几种表外,mpeg-2还提供了私有字段,用于实现对MPEG-2的扩充。

2, DVB中的SI
Mpeg-2的PSI中提供了不少的相关节目组成和相互关系的信息,从而使得在接收端可以正确的对多路传输流进行分解。但是这些信息在实际使用时仍显得不够,为此在DVB中采用SI对PSI信息进行了进一步的扩展。
除了在PSI中的信息之外,DVB还定义了一些其他的一些表。
SI的主要用途有:
a、根据NIT,PAT,PMT等信息可以进行自动的频道调谐;
b、更方便的对节目进行选择和定位;
c、实现电子节目指南EPG(Electronic Program Guide),等等。
PSI中的信息基本上都是与当前码流相关的,即它们所涉及的内容都与当前码流中的部分信息相关。与PSI不同的是,SI的信息可以包括不在当前码流中的一些服务和事件,允许用户进行更多的选择和了解更多的其他服务信息。
DVB规定携带SI信息的传输包必须用指定的PID,指定的PID如下表:
    TABLE TYPE    PID Value
PAT 0X0000 
CAT 0X0001
TSDT 0X0002
RESERVED 0X0003 TO 0X000F
NIT,ST 0X0010
SDT,BAT,ST 0X0011 
EIT,ST 0X0012 
RST,ST 0X0013 
TDT,TOT,ST 0X0014 
Network Synchroniztion 0X0015 
Reserved for future use 0X0016 TO 0X001B
Inband signaling 0X001C
Measurement 0X001D
DIT 0X001E 
SIT 0X001F 
在该表中可以看到同一个PID可以对应不同的表,要把这样的表区分开来,需要进一步找到TableID 进行识别。TableID表如下:        
Value  Description 
0x00 Program_association_section
0x01 Conditional_access_section
0x02 Program_map_section
0x03 Transport_stream_description_section
0x04 TO 0x3F Reserved
0x40 Network_information_section-actual_network
0x41 Network_information_section-other_network
0x42 Service_description_section-actual_transport_stream
0x43 TO 0x45 Reserved for future use
0x46 Service_description_section-other_transport_stream
0x47 TO 0x49 Reserved for future use
0x4A Bouquet_association_section
0x4B TO 0x4D Reserved for future use
0x4E Event_information_section-actual_transport_stream,P/F
0x4F Event_information_section-other_transport_stream,P/F
0x50 TO 0x5F Event_information_section-actual_transport_stream,schedule
0x60 TO 0x6F Event_information_section-other_transport_stream,schedule
0x70 Time_data_section
0x71 Running_status_section
0x72 Stuffing_section
0x73 Time_offset_section
0x74 TO 0x7D Reserved for future use
0x7E Discontinuity_information_section
0x7F Selection_information_section
0x80 TO 0xFE User defined
0xFF Reserved
有了这两个ID我们可以在码流中找到我们想要的任何一张表。
SI主要包括以下一些信息表:
NIT(Network Information Table):NIT的作用主要是对多路传输流的识别,NIT
提供多路传输流,物理网络及网络传输的相关的一些信息,如用于调谐的频率信息以
及编码方式。调制方式等参数方面的信息。根据此信息设置IRD(Integrated Receiver
Decoder)可以进行多路传输流之间的切换。
SDT(Service Description Table):用于描述系统中各路节目的名称,该节目的提
供者,是否有相应的时间描述表等方面的信息。该表可以描述当前传输流,也可以描
述其他的传输流,这由TableID进行区分。
EIT(Event Information Table):该表示对某一路节目的更进一步的描述。它提供
事件的的名称,开始时间,时间长度,运行状态等。
TDT(Time and Data Table):该表提供当前的时间信息,该表用来对IRD的解码
时钟进行更新
BAT(Bouquet Association Table):该表提供一系列类似节目的集合。这些节目
可以不在同一个传输流中,利用该表可以很方便的进行相关节目或某一类节目的浏览
和选择。
RST(Running Status Table):该表提供某一具体事件的的运行状态,可用于按时
自动的切换到指定的事件
TOT(Time Offset Table):该表提供当地时间与TDT之间的关系,该表与TDT
配合使用。
TSDT(Transport Stream Description Table):由PID0x0002标识,提供传输流的一
些参数.
ST(Stuffing Table):该表表明其内容是无效的,只是作为填充字节。

- 作者: lgs0540 2005年05月14日, 星期六 17:03  回复(3) |  引用(0) 加入博采

已锁定
此日志的浏览权限已被作者锁定,请同作者联系,发送短消息,如果你的身份符合作者的要求,点击此处可以进行浏览

- 作者: lgs0540 2005年04月20日, 星期三 13:20  回复(0) |  引用(0) 加入博采

列表控件设置

列表功能是最常用的控制功能之一,所以实现它的定制技巧也具有很大的现实意义。其实现步骤如下:

 


  1、首先利用资源编辑器建立一个包含列表控件的对话框,并利用类向导ClassWizard为对话框生成新类CColorListBox,其头文件为custlist.cpp,实现文件不设置;
  2、在实现文件custlist.cpp中完善其类代码:
   class CColorListBox:public CListBox
   {//完善列表控制类代码
   public://类成员函数
  void AddColorItem(COLORREF color);
  virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);
  virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
   };
  3、在实现文件custlist.cpp中完善各成员函数;
   void CColorListBox::AddColorItem(COLORREF color)
   { //增加表项,其为一个颜色值
   AddString((LPCTSTR) color);
   }
   #define COLOR_ITEM_HEIGHT 20 //表的高度
   void CColorListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
   {//设置自绘表项的高度
   lpMIS->itemHeight = COLOR_ITEM_HEIGHT;
   }
   void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
   { //绘制列表的表项函数
   CDC* pDC=CDC::FromHandle(lpDIS->hDC);
   COLORREF cr=(COLORREF)lpDIS->itemData;
   if (lpDIS->itemAction&ODA_DRAWENTIRE){
   CBrush br(cr);//绘制正常色彩条
   pDC->FillRect(&lpDIS->rcItem,&br);
   }
   if ((lpDIS->itemState&ODS_SELECTED) &&
      (lpDIS->itemAction&(ODA_SELECT|ODA_DRAWENTIRE)))
   { //绘制选中项色彩条
   COLORREF crHilite=RGB(255-GetRValue(cr),
   255-GetGValue(cr),255-GetBValue(cr));
   CBrush br(crHilite);
   pDC->FrameRect(&lpDIS->rcItem,&br);
   }
   if (!(lpDIS->itemState&ODS_SELECTED)&&
   (lpDIS->itemAction&ODA_SELECT))
   { file://清除前次选中项的框
   CBrush br(cr);
   pDC->FrameRect(&lpDIS->rcItem, &br);
   }
   }
  4、在实现文件custlist.cpp中可以像使用其它类一样使用新生成的定制列表类,其方法是首先设置类的控制成员变量m_colors,并设置相应的消息映射,最后完善其初始化函数:
   BOOL CCustListDlg::OnInitDialog()
   {//完善初始化函数,与子类控制连接
   VERIFY(m_colors.SubclassDlgItem(IDC_LISTBOX1,this));
   for(int red=0;red<=255;red+=255)//增加彩色条8项
   for(int green=0;green<=255;green+=255)
   for(int blue=0;blue<=255;blue+=255)
   m_colors.AddColorItem(RGB(red,green,blue));
   return TRUE;
   }
  

- 作者: lgs0540 2005年04月20日, 星期三 10:18  回复(0) |  引用(0) 加入博采