<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Boulevard Of Broken Dreams &#187; visual studio</title>
	<atom:link href="http://www.ray77.com/tag/visual-studio/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ray77.com</link>
	<description>Walking alone ... Waiting alone ...</description>
	<lastBuildDate>Mon, 10 May 2010 14:24:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>VC++存储过程应用技巧</title>
		<link>http://www.ray77.com/visual-cpp-procedure-exert-skills.html</link>
		<comments>http://www.ray77.com/visual-cpp-procedure-exert-skills.html#comments</comments>
		<pubDate>Mon, 06 Apr 2009 16:07:36 +0000</pubDate>
		<dc:creator>Rock</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://www.ray77.com/%e5%ad%98%e5%82%a8%e8%bf%87%e7%a8%8b.html</guid>
		<description><![CDATA[　　很多朋友告诉我他数据库学得很好，对数据库的各类操作都相当熟练，没有难不到他们的SQL语句。然而他们写出的语句效率却并不是让人满意，一个读写就已经如此，要是成千上万频繁的数据库更新的话那个队列可能都要排到火星上去了。再者提到存储过程也是没人去做详细的了解，就更不提应用了。
　　存储过程（Stored Procedure）是一组为了完成特定功能的SQL语句集，经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数（如果该存储过程带有参数）来执行它。存储过程是数据库中的一个重要对象，任何一个设计良好的数据库应用程序都应该用到存储过程。
　　平常对于一条SQL语句需要先编译然后再执行，然后才能返回用户所需要的结果，但如果对于相同的SQL语句进行频繁多次的使用的话，每一次都重新编译然后执行，效率显然是大打折扣的。而正如百科里存储过程的介绍所说，能够将编译好的SQL语句存储在数据库中，之后每次调用便略过了编译这个步骤，只需要向存储过程传递参数（输入或输出）就能够得到用户需要的数据结果。当然，这对小量的数据库读写感觉不出来，但如果是大量的数据库操作，存储过程的优势就能够相当明显的体现出来。
　　接下来我主要讲的是利用Visual C++对存储过程的调用。

　　首先我们得引入msado15.dll动态链接库，他包含了ADO编程的一系列函数。
　　#import &#8220;c:\program files\common files\system\ado\msado15.dll&#8221; no_namespace rename(&#8220;EOF&#8221;,&#8221;adoEOF&#8221;)　　//将EOF改为adoEOF是为了避免与文件的结束符号混淆
　　接下来就需要初始化Com库了，这里有两种方法，一种是
　　::CoInitialize(NULL);
　　另一种是
　　AfxOleInit();
　　这两种区别在于AfxOleInit附带一些其它资源的支持，如果不需要OLE的一些功能的话用CoInitialize就可以了。另外一点区别在于用CoInitialize最后需要释放（CoUninitialize），而AfxOleInit则会自动完成。
　　初始化完成COM库之后就可以开始建立数据库的连接了。
　　_ConnectionPtr m_pConn;//数据库的Com智能指针
　　m_pConn.CreateInstance(&#8220;ADODB.Connection&#8221;);
　　//打开本地（localhost）上的TestDb数据库。利用sa身份与口令123456登陆。
　　m_pConn-&#62;Open(&#8220;Driver={SQL Server};Server=localhost;Database=TestDB;UID=sa;PWD=123456&#8243;,&#8221;",&#8221;",adModeUnknown);
　　有人会疑惑了，为什么m_pConn可以用对象的“.”又可以用指针的“-&#62;”？其实在C++里有一个叫“智能指针”的另类，既拥有对象的属性，又拥有指针的功能。像_ConnectionPtr，_RecordsetPtr等等都归属于这一范畴。
　　到这里，我先用企业管理器创建一个存储过程，存储过程的名称为ProcTest。
　　CREATE PROCEDURE ProcTest 
　　　　@tusername    char(16),
　　　　@tpassword    char(16),
　　　　@retval        int        output
　　AS 
　　　　 if exists(select * from Account where username=@tusername)
　　　　　　BEGIN 
　　　　　　 if (select password from Account where username=@tusername)=@tpassword
　　　　　　　　set @retval=0
　　　　　　else
　　　　　　　　set @retval=1
　　　　　　END
　　　　else
　　　　　　set @retval=2
　　GO
　　这个存储过程的功能是通过传入用户名（tusername）与密码（tpassword），返回验证结果（retval）。如果帐号与密码都匹配便赋retval的值为0，密码错误赋retval的值为1，用户不存在赋retval的值为2。
　　然后就开始创建执行存储过程的命令对象了。
　　_CommandPtr m_pCmd;
　　m_pCmd.CreateInstance(&#8220;ADODB.Command&#8221;);
　　m_pCmd-&#62;ActiveConnection = m_pConn;
　　m_pCmd-&#62;CommandText = &#8220;ProcTest&#8221;;  //存储过程为ProcTest
　　接下来创建三个参数，分别是Input用户名，Input密码，Output验证结果。
　　_ParameterPtr m_pParam_username;
　　m_pParam_username.CreateInstance(&#8220;ADODB.Parameter&#8221;);
　　m_pParam_username = m_pCmd-&#62;CreateParameter(&#8220;tusername&#8221;,adChar,adParamInput,16,&#8221;rock&#8221;);
　　_ParameterPtr m_pParam_password;
　　m_pParam_password.CreateInstance(&#8220;ADODB.Parameter&#8221;);
　　m_pParam_password = m_pCmd-&#62;CreateParameter(&#8220;tpassword&#8221;,adChar,adParamInput,16,&#8221;123456&#8243;);
　　_ParameterPtr m_pParam_result;
　　m_pParam_result.CreateInstance(&#8220;ADODB.Parameter&#8221;);
　　m_pParam_result = m_pCmd-&#62;CreateParameter(&#8220;retval&#8221;,adChar,adParamOutput,30,&#8221;");
　　可以注意到两个是输入（adParamInput），一个是输出（adParamOutput），另外，如果是输入项第一个参数可以直接赋空，只需要在接下来的追加按存储过程里变量创建的顺序就可以了，但是做为良好的代码习惯，而且便于检查与阅读，最好还是赋上变量名。
　　接下来追加m_pCmd里面去吧。
　　m_pCmd-&#62;Parameters-&#62;Append(m_pParam_username);
　　m_pCmd-&#62;Parameters-&#62;Append(m_pParam_password);
　　m_pCmd-&#62;Parameters-&#62;Append(m_pParam_result);
　　最后就可以执行了。
　　m_pCmd-&#62;Execute(NULL,NULL,adCmdStoredProc);
　　之后通过
　　m_pCmd-&#62;Parameters-&#62;GetItem(_variant_t(“retval”))-&#62;GetValue();
　　就可以获得返回值了。简单吧？
　　这两天抽空写了两个类封装了下数据库的基本操作与存储过程，使用的时候只要在适当的地方加入头文件（DbOpt.h）然后建立对象就可以了，方法很简单。
点击下载
]]></description>
			<content:encoded><![CDATA[<p>　　很多朋友告诉我他数据库学得很好，对数据库的各类操作都相当熟练，没有难不到他们的SQL语句。然而他们写出的语句效率却并不是让人满意，一个读写就已经如此，要是成千上万频繁的数据库更新的话那个队列可能都要排到火星上去了。再者提到存储过程也是没人去做详细的了解，就更不提应用了。</p>
<blockquote><p>　　存储过程（Stored Procedure）是一组为了完成特定功能的SQL语句集，经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数（如果该存储过程带有参数）来执行它。存储过程是数据库中的一个重要对象，任何一个设计良好的数据库应用程序都应该用到存储过程。</p></blockquote>
<p>　　平常对于一条SQL语句需要先编译然后再执行，然后才能返回用户所需要的结果，但如果对于相同的SQL语句进行频繁多次的使用的话，每一次都重新编译然后执行，效率显然是大打折扣的。而正如百科里存储过程的介绍所说，能够将编译好的SQL语句存储在数据库中，之后每次调用便略过了编译这个步骤，只需要向存储过程传递参数（输入或输出）就能够得到用户需要的数据结果。当然，这对小量的数据库读写感觉不出来，但如果是大量的数据库操作，存储过程的优势就能够相当明显的体现出来。</p>
<p>　　接下来我主要讲的是利用Visual C++对存储过程的调用。</p>
<p><span id="more-829"></span></p>
<p>　　首先我们得引入msado15.dll动态链接库，他包含了ADO编程的一系列函数。</p>
<blockquote><p>　　#import &#8220;c:\program files\common files\system\ado\msado15.dll&#8221; no_namespace rename(&#8220;EOF&#8221;,&#8221;adoEOF&#8221;)　　//将EOF改为adoEOF是为了避免与文件的结束符号混淆</p></blockquote>
<p>　　接下来就需要初始化Com库了，这里有两种方法，一种是</p>
<blockquote><p>　　::CoInitialize(NULL);</p></blockquote>
<p>　　另一种是</p>
<blockquote><p>　　AfxOleInit();</p></blockquote>
<p>　　这两种区别在于AfxOleInit附带一些其它资源的支持，如果不需要OLE的一些功能的话用CoInitialize就可以了。另外一点区别在于用CoInitialize最后需要释放（CoUninitialize），而AfxOleInit则会自动完成。</p>
<p>　　初始化完成COM库之后就可以开始建立数据库的连接了。</p>
<blockquote><p>　　_ConnectionPtr m_pConn;//数据库的Com智能指针</p>
<p>　　m_pConn.CreateInstance(&#8220;ADODB.Connection&#8221;);</p>
<p>　　//打开本地（localhost）上的TestDb数据库。利用sa身份与口令123456登陆。</p>
<p>　　m_pConn-&gt;Open(&#8220;Driver={SQL Server};Server=localhost;Database=TestDB;UID=sa;PWD=123456&#8243;,&#8221;",&#8221;",adModeUnknown);</p></blockquote>
<p>　　有人会疑惑了，为什么m_pConn可以用对象的“.”又可以用指针的“-&gt;”？其实在C++里有一个叫“智能指针”的另类，既拥有对象的属性，又拥有指针的功能。像_ConnectionPtr，_RecordsetPtr等等都归属于这一范畴。</p>
<p>　　到这里，我先用企业管理器创建一个存储过程，存储过程的名称为ProcTest。</p>
<blockquote><p>　　CREATE PROCEDURE ProcTest <br />
　　　　@tusername    char(16),<br />
　　　　@tpassword    char(16),<br />
　　　　@retval        int        output<br />
　　AS <br />
　　　　 if exists(select * from Account where username=@tusername)<br />
　　　　　　BEGIN <br />
　　　　　　 if (select password from Account where username=@tusername)=@tpassword<br />
　　　　　　　　set @retval=0<br />
　　　　　　else<br />
　　　　　　　　set @retval=1<br />
　　　　　　END<br />
　　　　else<br />
　　　　　　set @retval=2<br />
　　GO</p></blockquote>
<p>　　这个存储过程的功能是通过传入用户名（tusername）与密码（tpassword），返回验证结果（retval）。如果帐号与密码都匹配便赋retval的值为0，密码错误赋retval的值为1，用户不存在赋retval的值为2。</p>
<p>　　然后就开始创建执行存储过程的命令对象了。</p>
<blockquote><p>　　_CommandPtr m_pCmd;</p>
<p>　　m_pCmd.CreateInstance(&#8220;ADODB.Command&#8221;);</p>
<p>　　m_pCmd-&gt;ActiveConnection = m_pConn;</p>
<p>　　m_pCmd-&gt;CommandText = &#8220;ProcTest&#8221;;  //存储过程为ProcTest</p></blockquote>
<p>　　接下来创建三个参数，分别是Input用户名，Input密码，Output验证结果。</p>
<blockquote><p>　　_ParameterPtr m_pParam_username;</p>
<p>　　m_pParam_username.CreateInstance(&#8220;ADODB.Parameter&#8221;);</p>
<p>　　m_pParam_username = m_pCmd-&gt;CreateParameter(&#8220;tusername&#8221;,adChar,adParamInput,16,&#8221;rock&#8221;);</p>
<p>　　_ParameterPtr m_pParam_password;</p>
<p>　　m_pParam_password.CreateInstance(&#8220;ADODB.Parameter&#8221;);</p>
<p>　　m_pParam_password = m_pCmd-&gt;CreateParameter(&#8220;tpassword&#8221;,adChar,adParamInput,16,&#8221;123456&#8243;);</p>
<p>　　_ParameterPtr m_pParam_result;</p>
<p>　　m_pParam_result.CreateInstance(&#8220;ADODB.Parameter&#8221;);</p>
<p>　　m_pParam_result = m_pCmd-&gt;CreateParameter(&#8220;retval&#8221;,adChar,adParamOutput,30,&#8221;");</p></blockquote>
<p>　　可以注意到两个是输入（adParamInput），一个是输出（adParamOutput），另外，如果是输入项第一个参数可以直接赋空，只需要在接下来的追加按存储过程里变量创建的顺序就可以了，但是做为良好的代码习惯，而且便于检查与阅读，最好还是赋上变量名。</p>
<p>　　接下来追加m_pCmd里面去吧。</p>
<blockquote><p>　　m_pCmd-&gt;Parameters-&gt;Append(m_pParam_username);</p>
<p>　　m_pCmd-&gt;Parameters-&gt;Append(m_pParam_password);</p>
<p>　　m_pCmd-&gt;Parameters-&gt;Append(m_pParam_result);</p></blockquote>
<p>　　最后就可以执行了。</p>
<blockquote><p>　　m_pCmd-&gt;Execute(NULL,NULL,adCmdStoredProc);</p></blockquote>
<p>　　之后通过</p>
<blockquote><p>　　m_pCmd-&gt;Parameters-&gt;GetItem(_variant_t(“retval”))-&gt;GetValue();</p></blockquote>
<p>　　就可以获得返回值了。简单吧？</p>
<p>　　这两天抽空写了两个类封装了下数据库的基本操作与存储过程，使用的时候只要在适当的地方加入头文件（DbOpt.h）然后建立对象就可以了，方法很简单。</p>
<p><a href="http://www.ray77.com/wp-content/uploads/2009/04/dbopt.rar">点击下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ray77.com/visual-cpp-procedure-exert-skills.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>EASY TALK 开发日志 (二)</title>
		<link>http://www.ray77.com/easytalk-develop-diary-2.html</link>
		<comments>http://www.ray77.com/easytalk-develop-diary-2.html#comments</comments>
		<pubDate>Fri, 06 Mar 2009 17:26:36 +0000</pubDate>
		<dc:creator>Rock</dc:creator>
				<category><![CDATA[Characters]]></category>
		<category><![CDATA[easytalk]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[软件]]></category>

		<guid isPermaLink="false">http://www.ray77.com/easy-talk-%e5%bc%80%e5%8f%91%e6%97%a5%e5%bf%97-%e4%ba%8c.html</guid>
		<description><![CDATA[Easy Talk 2009
　　经过了几天挣扎，EASY TALK算是有了突破性的进步。服务端方面目前用户线程80%接口函数都写得差不多了，所以后期的服务器工作量会减少许多，因为只需对用户请求进行函数响应返回，基本上就是一些函数的重新组成了。而客户端方面，也就是Rock所负责的70%的框架也已经成形了，函数也是相当得多，最后还是要封装动态链接库的，那样减少主程序的代码量。
　　客户端与服务器端连接正常，多客户之间消息发送经由服务器转发，一方面减少客户端与服务器端代码编写，简化工作，另一方面通过始终都连接的TCP，而不会发生使用UDP出现的丢包现象。再者，已经实现离线消息的数据库副本保存，当用户上线后将能收到所有离线未收到的消息。
　　客户端开发过程中遇到一些棘手的问题，其中包括选择定时器的时候是否使用函数指针，如何向定时器传参数，树控件各结点与好友信息链表的获取与匹配，判断聊天对话框与信息查看对话框创建状态从而选择是头像闪动还是消息直接转移对应对话框的控件，以及各非模态窗口的消息投递。前面几个问题最后决定在好友链表的结构体里分别添加成员变量，分别用以保存定时器事件ID，孩子结点的HTERRITEM句柄，对话框的窗口句柄。一方面可以简化很多操作，一方面给以后的功能扩展铺好基石。

　　目前包括主要功能有：注册请求，登陆请求，登陆反馈，自己信息与好友信息结构体的发送与接收，好友在线未在线自动识别并归类，与好友之间的文本对话，头像闪动，个人资料的更新，好友上下线提示与数据更新，好友资料更新，查看好友信息，更新好友信息。其实有几个小环节解决了大问题，首先是由于服务器为每个客户生成一个线程，每个线程在自己的时间片里做while循环，这种循环会大量占用CPU(90%以上)，从而影响其它操作。解决办法是在每一个while循环最后加一句Sleep(1)，所有while循环的速度便比较适当了，而CPU的使用率很快降到5%以下，相当适用。其次，客户端头像的CimageList起初是准备创建三个，一个放小头像，一个放中头像，一个放大头像，后来发现后两个基本上不适用，只剩下一个CimageList对象，并与好友树控件绑定，而遇上的问题便是头像闪动。因为一旦更换CimageList里图片的话所有该头像的用户图片都会改变，因此用了另一个办法，也就是按照一定顺序将正常情况下图片，左偏图片，右偏图片初始化的时候就载入CimageList对象，当有消息来的时候，只需使用树的对象获取用户结点，将用户结点的图片索引一个增量就可以了。当然，这个操作放在定时器里，300毫秒一次的头像更换，从而实现消息到达后该用户的头像闪动效果，附上消息铃声，显得相当大气，而且美观。
　　接下来就要涉及好友的添加与删除，在线好友的搜索，文件的点对点传送，聊天室多人聊天，文件群发等等一些更棘手的模块编写了，不过还好，以目前的进度与速度相信能在15号回上海之前完成的。
　　最后附上几张截图，希望继续关注！

 

]]></description>
			<content:encoded><![CDATA[<div class="wp-caption aligncenter" style="width: 610px"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px;" title="EASY TALK 开发日志 (二)" src="http://www.ray77.com/wp-content/uploads/2009/03/easytalk2.jpg" border="0" alt="EASY TALK 开发日志 (二)" width="600" height="180" /><p class="wp-caption-text">Easy Talk 2009</p></div>
<p>　　经过了几天挣扎，EASY TALK算是有了突破性的进步。服务端方面目前用户线程80%接口函数都写得差不多了，所以后期的服务器工作量会减少许多，因为只需对用户请求进行函数响应返回，基本上就是一些函数的重新组成了。而客户端方面，也就是Rock所负责的70%的框架也已经成形了，函数也是相当得多，最后还是要封装动态链接库的，那样减少主程序的代码量。</p>
<p>　　客户端与服务器端连接正常，多客户之间消息发送经由服务器转发，一方面减少客户端与服务器端代码编写，简化工作，另一方面通过始终都连接的TCP，而不会发生使用UDP出现的丢包现象。再者，已经实现离线消息的数据库副本保存，当用户上线后将能收到所有离线未收到的消息。</p>
<p>　　客户端开发过程中遇到一些棘手的问题，其中包括选择定时器的时候是否使用函数指针，如何向定时器传参数，树控件各结点与好友信息链表的获取与匹配，判断聊天对话框与信息查看对话框创建状态从而选择是头像闪动还是消息直接转移对应对话框的控件，以及各非模态窗口的消息投递。前面几个问题最后决定在好友链表的结构体里分别添加成员变量，分别用以保存定时器事件ID，孩子结点的HTERRITEM句柄，对话框的窗口句柄。一方面可以简化很多操作，一方面给以后的功能扩展铺好基石。</p>
<p><span id="more-735"></span></p>
<p>　　目前包括主要功能有：注册请求，登陆请求，登陆反馈，自己信息与好友信息结构体的发送与接收，好友在线未在线自动识别并归类，与好友之间的文本对话，头像闪动，个人资料的更新，好友上下线提示与数据更新，好友资料更新，查看好友信息，更新好友信息。其实有几个小环节解决了大问题，首先是由于服务器为每个客户生成一个线程，每个线程在自己的时间片里做while循环，这种循环会大量占用CPU(90%以上)，从而影响其它操作。解决办法是在每一个while循环最后加一句Sleep(1)，所有while循环的速度便比较适当了，而CPU的使用率很快降到5%以下，相当适用。其次，客户端头像的CimageList起初是准备创建三个，一个放小头像，一个放中头像，一个放大头像，后来发现后两个基本上不适用，只剩下一个CimageList对象，并与好友树控件绑定，而遇上的问题便是头像闪动。因为一旦更换CimageList里图片的话所有该头像的用户图片都会改变，因此用了另一个办法，也就是按照一定顺序将正常情况下图片，左偏图片，右偏图片初始化的时候就载入CimageList对象，当有消息来的时候，只需使用树的对象获取用户结点，将用户结点的图片索引一个增量就可以了。当然，这个操作放在定时器里，300毫秒一次的头像更换，从而实现消息到达后该用户的头像闪动效果，附上消息铃声，显得相当大气，而且美观。</p>
<p>　　接下来就要涉及好友的添加与删除，在线好友的搜索，文件的点对点传送，聊天室多人聊天，文件群发等等一些更棘手的模块编写了，不过还好，以目前的进度与速度相信能在15号回上海之前完成的。</p>
<p>　　最后附上几张截图，希望继续关注！</p>
<p style="text-align: center;"><img class="aligncenter" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" title="Easy Talk 2009" src="http://www.ray77.com/wp-content/uploads/2009/03/easytalk2-1.jpg" border="0" alt="Easy Talk 2009" width="594" height="569" /></p>
<p> </p>
<p style="text-align: center;"><img class="aligncenter" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" title="Easy Talk 2009" src="http://www.ray77.com/wp-content/uploads/2009/03/easytalk2-2.jpg" border="0" alt="Easy Talk 2009" width="594" height="737" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ray77.com/easytalk-develop-diary-2.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>EASY TALK 开发日志 (一)</title>
		<link>http://www.ray77.com/easytalk-develop-diary-1.html</link>
		<comments>http://www.ray77.com/easytalk-develop-diary-1.html#comments</comments>
		<pubDate>Thu, 26 Feb 2009 15:21:03 +0000</pubDate>
		<dc:creator>Rock</dc:creator>
				<category><![CDATA[Characters]]></category>
		<category><![CDATA[easytalk]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[软件]]></category>

		<guid isPermaLink="false">http://www.ray77.com/easytalk-develop-diary-1.html</guid>
		<description><![CDATA[EASY TALK
　　“EASY TALK 2009”其实是一款类似腾讯QQ，IM，以及MSN的即时通讯软件，它基于C/S的构架模型，开发语言为C++，平台用的是Microsoft Visual Studio C++。
　　“EASY TALK”开发组员共有三位，其中ROCK，也就是在下，主要负责软件构架，数据结构以及客户端程序编写；ICEHIKER（小名老猴，常年额头不长毛）负责网络通讯模块的分析与服务器端程序编写；最后还有CBOY，负责数据库构架以及服务器端与客户端部分子模块的编写。有人会说到美工方面，很遗憾，ICEHIKER与CBOY的美工水平实在欠缺，这一重担又落到ROCK的肩膀上，总的来说，IDS（我们三人的组织名称）设计项目不少，如此大学最后一个设计，决定做出最高的质量，最好的效果。

　　前几天就已经开始着手需求分析了，还好QQ是个很好的“模仿”对象，包括功能与UI。说到UI我们决定省去控件美化的部分，从而把全部精力放在核心的开发上面。于是搜索了几款已经把各种控件UI封装好的美化软件，其中包插国内比较知名的SKIN++，以前国外的LIBUIDK，SKINCRAFTER，其实这几款美化控件都非常不错，排除了比较复杂的LIBUIDK（所有美工图片得自己DIY），剩下SKIN++与SKINCRAFTER，首先两者使用都相当简单，初始一个对象然后设置皮肤就大功告成，然而相比之下，SKIN++的主题比较“国内化”，也就是比较雅致，但SKINCRAFTER的主题显得格外的张扬，这反而也是个弊病，花里胡哨的看得眼都花了。但SKIN++有两个比较大的缺点，一个是主题美化得不够精细，很多边缘相当毛草，另一个是搜了半天没能找到被CRACK的主题的编辑器，然而SKINCRAFTER就相当不错了，有几款主题做得格外精细，同时已经找到比较新的CRACK的主题编辑器（出名的软件破解的也多）。于是决定用SKINCRAFTER的VISTA主题，产生界面先给个截图给大家看看。

　　目前开发进度与速度还算正常，已经写完登陆与注册模块了，整体包括服务器通讯接口，数据库读写接口，线程与消息的响应接口都规划完成，马上要进入主界面的程序的编写了，感兴趣的朋友希望你们能够继续关注Easy Talk的最新动态。
　　好了，学校领导总算是开眼了，白天再也不停我们大四学生寝室的电了，要不然靠PC吃饭的我们还真是得纸上谈兵了。嗯，今天天气开始转晴，心情也“由多云转晴了”。
]]></description>
			<content:encoded><![CDATA[<div class="wp-caption aligncenter" style="width: 604px"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px;" title="EASY TALK 开发日志" src="http://www.ray77.com/wp-content/uploads/2009/02/etdev-01.jpg" border="0" alt="EASY TALK 开发日志" width="594" height="164" /><p class="wp-caption-text">EASY TALK</p></div>
<p>　　“EASY TALK 2009”其实是一款类似腾讯QQ，IM，以及MSN的即时通讯软件，它基于C/S的构架模型，开发语言为C++，平台用的是Microsoft Visual Studio C++。</p>
<p>　　“EASY TALK”开发组员共有三位，其中ROCK，也就是在下，主要负责软件构架，数据结构以及客户端程序编写；ICEHIKER（小名老猴，常年额头不长毛）负责网络通讯模块的分析与服务器端程序编写；最后还有CBOY，负责数据库构架以及服务器端与客户端部分子模块的编写。有人会说到美工方面，很遗憾，ICEHIKER与CBOY的美工水平实在欠缺，这一重担又落到ROCK的肩膀上，总的来说，IDS（我们三人的组织名称）设计项目不少，如此大学最后一个设计，决定做出最高的质量，最好的效果。</p>
<p><span id="more-718"></span></p>
<p>　　前几天就已经开始着手需求分析了，还好QQ是个很好的“模仿”对象，包括功能与UI。说到UI我们决定省去控件美化的部分，从而把全部精力放在核心的开发上面。于是搜索了几款已经把各种控件UI封装好的美化软件，其中包插国内比较知名的SKIN++，以前国外的LIBUIDK，SKINCRAFTER，其实这几款美化控件都非常不错，排除了比较复杂的LIBUIDK（所有美工图片得自己DIY），剩下SKIN++与SKINCRAFTER，首先两者使用都相当简单，初始一个对象然后设置皮肤就大功告成，然而相比之下，SKIN++的主题比较“国内化”，也就是比较雅致，但SKINCRAFTER的主题显得格外的张扬，这反而也是个弊病，花里胡哨的看得眼都花了。但SKIN++有两个比较大的缺点，一个是主题美化得不够精细，很多边缘相当毛草，另一个是搜了半天没能找到被CRACK的主题的编辑器，然而SKINCRAFTER就相当不错了，有几款主题做得格外精细，同时已经找到比较新的CRACK的主题编辑器（出名的软件破解的也多）。于是决定用SKINCRAFTER的VISTA主题，产生界面先给个截图给大家看看。</p>
<p style="text-align: center;"><img class="aligncenter" style="display: block; border: 0px;" title="EASY TALK 2009" src="http://www.ray77.com/wp-content/uploads/2009/02/et2009-01.jpg" border="0" alt="EASY TALK 2009" width="489" height="567" /></p>
<p>　　目前开发进度与速度还算正常，已经写完登陆与注册模块了，整体包括服务器通讯接口，数据库读写接口，线程与消息的响应接口都规划完成，马上要进入主界面的程序的编写了，感兴趣的朋友希望你们能够继续关注Easy Talk的最新动态。</p>
<p>　　好了，学校领导总算是开眼了，白天再也不停我们大四学生寝室的电了，要不然靠PC吃饭的我们还真是得纸上谈兵了。嗯，今天天气开始转晴，心情也“由多云转晴了”。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ray77.com/easytalk-develop-diary-1.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
