﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-黎明的剔透里伸出了你沁清的暧昧</title><link>http://www.cppblog.com/init/</link><description>Graphics|EngineDev|GameDev|2D&amp;3D Art            
                                 </description><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 11:17:58 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 11:17:58 GMT</pubDate><ttl>60</ttl><item><title>LIST </title><link>http://www.cppblog.com/init/archive/2016/07/10/213909.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Sun, 10 Jul 2016 12:38:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2016/07/10/213909.html</guid><wfw:comment>http://www.cppblog.com/init/comments/213909.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2016/07/10/213909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/213909.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/213909.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2016/07/10/213909.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/213909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2016-07-10 20:38 <a href="http://www.cppblog.com/init/archive/2016/07/10/213909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DateTime常用方法</title><link>http://www.cppblog.com/init/archive/2016/07/10/213908.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Sun, 10 Jul 2016 12:34:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2016/07/10/213908.html</guid><wfw:comment>http://www.cppblog.com/init/comments/213908.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2016/07/10/213908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/213908.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/213908.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2016/07/10/213908.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/213908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2016-07-10 20:34 <a href="http://www.cppblog.com/init/archive/2016/07/10/213908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# Newtonsoft.Json</title><link>http://www.cppblog.com/init/archive/2015/12/14/212483.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Mon, 14 Dec 2015 13:32:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2015/12/14/212483.html</guid><wfw:comment>http://www.cppblog.com/init/comments/212483.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2015/12/14/212483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/212483.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/212483.html</trackback:ping><description><![CDATA[<p><font size="4">先上一张图<img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://download.codeplex.com/Download?ProjectName=json&amp;DownloadId=669163"></font></p>   <p>看完图看链接：</p> <p><a href="http://www.cnblogs.com/usharei/archive/2012/04/18/2454967.html">1</a></p> <p><a href="http://www.cnblogs.com/usharei/archive/2012/04/19/2456698.html">2</a></p><img src ="http://www.cppblog.com/init/aggbug/212483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2015-12-14 21:32 <a href="http://www.cppblog.com/init/archive/2015/12/14/212483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# 连接 Oracle 的几种方式</title><link>http://www.cppblog.com/init/archive/2015/12/12/212469.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Sat, 12 Dec 2015 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2015/12/12/212469.html</guid><wfw:comment>http://www.cppblog.com/init/comments/212469.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2015/12/12/212469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/212469.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/212469.html</trackback:ping><description><![CDATA[<pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">一：通过System.Data.OracleClient(需要安装Oracle客户端并配置tnsnames.ora)
1. 添加命名空间System.Data.OracleClient引用
2. using System.Data.OracleClient;
3. 
string connString = "User ID=IFSAPP;Password=IFSAPP;Data Source=RACE;";
OracleConnection conn = new OracleConnection(connString);
try
{
    conn.Open();
    MessageBox.Show(conn.State.ToString());
}
catch (Exception ex)
{
    ShowErrorMessage(ex.Message.ToString());
}
finally
{
    conn.Close();
}

二：通过System.Data.OracleClient(需要安装Oracle客户端不需配置tnsnames.ora)
1. 添加命名空间System.Data.OracleClient引用
2. using System.Data.OracleClient;
3.
string connString = "User ID=IFSAPP;Password=IFSAPP;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = RACE)))";
OracleConnection conn = new OracleConnection(connString);
try
{
    conn.Open();
    MessageBox.Show(conn.State.ToString());
}
catch (Exception ex)
{
    ShowErrorMessage(ex.Message.ToString());
}
finally
{
    conn.Close();
}

三：通过System.Data.OleDb和Oracle公司的驱动
1. 添加命名空间System.Data.OracleClient引用
2. using System.Data.OleDb;
3.
string connString = "Provider=OraOLEDB.Oracle.1;User ID=IFSAPP;Password=IFSAPP;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = RACE)))";
OleDbConnection conn = new OleDbConnection(connString);
try
{
    conn.Open();
    MessageBox.Show(conn.State.ToString());
}
catch (Exception ex)
{
    ShowErrorMessage(ex.Message.ToString());
}
finally
{
    conn.Close();
}

四：通过System.Data.OleDb和微软公司的Oracle驱动
1. 添加命名空间System.Data.OracleClient引用
2. using System.Data.OleDb;
3.
string connString = "Provider=MSDAORA.1;User ID=IFSAPP;Password=IFSAPP;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = RACE)))";
OleDbConnection cnn = new OleDbConnection(connString);
try
{
    conn.Open();
    MessageBox.Show(conn.State.ToString());
}
catch (Exception ex)
{
    ShowErrorMessage(ex.Message.ToString());
}
finally
{
    conn.Close();
}

备注：
a.XP操作系统已经安装了微软公司的Oracle驱动C:\Program Files\Common Files\System\Ole DB\msdaora.dll
b.该驱动需要Oracle客户端的三个文件(oraocixe10.dll、oci.dll、ociw32.dll)放在System32下即可

五：使用ODP连接
1. 下载安装ODP.NET(http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html)
2. 安装完全成后会产生一序列文件。
3. 找到这个安装目录，打开文件夹%ORACLE_HOME%\Network\Admin在这个下面建立一个tnsnames.ora的文件，其内容可以参考其下的Sample目录下面的配置
Oracle.RACE =
(DESCRIPTION=
   (ADDRESS_LIST=
     (ADDRESS=
       (PROTOCOL=TCP)
       (HOST=127.0.0.1)
       (PORT=1521)
     )
   )
   (CONNECT_DATA=
     (SID=RACE)
     (SERVER=DEDICATED)
   )
)
Oracle.RACE为连接字符串名称，可以随便取。等号后面的字符串可以在Enterprise Manager Console工具中连接数据库后的TNS描述符中拷过来
4. 引用Oracle.DataAccess命名空间
5. using Oracle.DataAccess.Client;
6. 示例代码：
string connString = "DATA SOURCE=Oracle.RACE;PERSIST SECURITY INFO=True;USER ID=IFSAPP;password=IFSAPP";
OracleConnection conn = new OracleConnection(connString);
try
{
    conn.Open();
    OracleCommand cmd = new OracleCommand(cmdText,conn);
    OracleDataReader reader = cmd.ExecuteReader();
    this.DataGridView1.DataSource = reader;
    this.DataGridView1.DataBind();
}
catch (Exception ex)
{
    ShowErrorMessage(ex.Message.ToString());
}
finally
{
    conn.Close();
}

六：使用第三方驱动
第三方驱动有 Devart，下载驱动 http://www.devart.com/dotconnect/oracle/，但是是商业版，需要购买许可或破解
连接格式 User ID=myUsername;Password=myPassword;Host=ora;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;
1. 引用Devart.Data.Oracle命名空间
2. using Devart.Data.Oracle;
3.
OracleConnection conn = new OracleConnection();
conn.ConnectionString = "";
conn.Unicode = true;
conn.UserId = "IFSAPP";
conn.Password = "IFSAPP";
conn.Port = 1521;
conn.Server = "127.0.0.1";
conn.Sid = "RACE";
try
{
    conn.Open();
    //execute queries, etc
}
catch (Exception ex)
{
    ShowErrorMessage(ex.Message.ToString());
}
finally
{
    conn.Close();
}</pre><img src ="http://www.cppblog.com/init/aggbug/212469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2015-12-12 15:18 <a href="http://www.cppblog.com/init/archive/2015/12/12/212469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据组件和 DataSet</title><link>http://www.cppblog.com/init/archive/2015/12/06/212426.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Sun, 06 Dec 2015 08:46:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2015/12/06/212426.html</guid><wfw:comment>http://www.cppblog.com/init/comments/212426.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2015/12/06/212426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/212426.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/212426.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2015/12/06/212426.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/212426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2015-12-06 16:46 <a href="http://www.cppblog.com/init/archive/2015/12/06/212426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ADO.NET 基础（事务、通用的数据工厂）</title><link>http://www.cppblog.com/init/archive/2015/12/06/212425.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Sun, 06 Dec 2015 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2015/12/06/212425.html</guid><wfw:comment>http://www.cppblog.com/init/comments/212425.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2015/12/06/212425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/212425.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/212425.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2015/12/06/212425.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/212425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2015-12-06 16:45 <a href="http://www.cppblog.com/init/archive/2015/12/06/212425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# Tostring() 格式大全</title><link>http://www.cppblog.com/init/archive/2015/12/06/212424.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Sun, 06 Dec 2015 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2015/12/06/212424.html</guid><wfw:comment>http://www.cppblog.com/init/comments/212424.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2015/12/06/212424.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/212424.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/212424.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2015/12/06/212424.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/212424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2015-12-06 16:44 <a href="http://www.cppblog.com/init/archive/2015/12/06/212424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库数据转换</title><link>http://www.cppblog.com/init/archive/2015/10/23/212076.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Thu, 22 Oct 2015 16:27:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2015/10/23/212076.html</guid><wfw:comment>http://www.cppblog.com/init/comments/212076.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2015/10/23/212076.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/212076.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/212076.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2015/10/23/212076.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/212076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2015-10-23 00:27 <a href="http://www.cppblog.com/init/archive/2015/10/23/212076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2008下编写QT程序环境设置</title><link>http://www.cppblog.com/init/archive/2015/08/22/211652.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Sat, 22 Aug 2015 06:55:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2015/08/22/211652.html</guid><wfw:comment>http://www.cppblog.com/init/comments/211652.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2015/08/22/211652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/211652.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/211652.html</trackback:ping><description><![CDATA[<p><font size="3"><font face="微软雅黑">一、环境配置</font> </font></p> <p><font face="微软雅黑"> </font></p><p><font face="微软雅黑"><font face="微软雅黑"><font style="font-weight: bold" size="3">&nbsp;&nbsp; </font></font></font><font size="3">&nbsp; 用VS新建一个win32控制台应用程序,我们假设工程名为：Hello。 </font></p><p>&nbsp;</p> <p> </p><p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 选择工具-&gt;选项-&gt;项目和解决方案-&gt;VC++目录。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)&nbsp; 选择&#8220;可执行文件&#8221;，在里面添加：C:\Qt4.7.0\bin;</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)&nbsp; 选择&#8220;包含文件&#8221;，在里面添加：C:\Qt4.7.0\include;&nbsp;&nbsp; C:\Qt4.7.0\include\Qt;&nbsp;&nbsp; C:\Qt4.7.0\include\QtCore;&nbsp;&nbsp; C:\Qt4.7.0\include\QtGui</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)&nbsp; 选择&#8220;库文件&#8221;，在里面添加：C:\Qt4.7.0\lib； </font></p><p>&nbsp;</p> <p><font size="3" face="微软雅黑">二、开始编程 </font></p><font face="微软雅黑"> <p><font size="3"><font face="微软雅黑">&nbsp;&nbsp; 1.&nbsp;&nbsp;&nbsp;&nbsp; 选择菜单上的&#8220;QT&#8221;选项- &gt;&#8220;Launch Designer&#8221; ,启动designer : 放入一个&#8220;label&#8221;,内容写为：helloQT。然后保存为Hello.ui，再将它添加到源文件中。</font> </font></p> <p><font size="3" face="微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 右击&#8220;Hello.ui&#8221;-&gt;&#8220;属性&#8221;-&gt;&#8220;自定义生成步骤&#8221;：</font></p><font face="微软雅黑"> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命令行：uic.exe Hello.ui -o HelloUi.h</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出：HelloUi.h</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 附加依赖项：uic.exe; Hello.ui</font></p> <p><font size="3"><font face="微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后，点击&#8220;确定&#8221;。这时再右击&#8220;Hello.ui&#8221;，选择&#8220;编译&#8221;，则会生成HelloUi.h。将它添加到工程中。</font> </font></p></font> <p><font size="3"><font face="微软雅黑">&nbsp;&nbsp;&nbsp; 2.&nbsp;&nbsp; 在Hello.cpp中编写代码：</font> </font></p> <p><font size="3" face="微软雅黑">&nbsp;&nbsp;&nbsp; 3.&nbsp;&nbsp; 选择&#8220;项目&#8221;，&#8220;Hello属性&#8221;，&#8220;配置属性&#8221;：</font></p><font face="微软雅黑"> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)&nbsp; &#8220;常规&#8221;：选择&#8220;字符集&#8221;为&#8220;使用多字节字符集&#8221;；</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)&nbsp; &#8220;调试&#8221;：填写&#8220;环境&#8221;值为：PATH=C:\Qt4.7.0\bin；</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 填写&#8220;合并环境&#8221;值为：是；</font></p> <p><font size="3"><font face="微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)&nbsp; &#8220;链接器&#8221;：进入&#8220;常规&#8221;选项，填写&#8220;附加库目录&#8221;为：C:\Qt4.7.0\lib;</font> </font></p></font> <p><font size="3" face="微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 进入&#8220;输入&#8221;选项，填写&#8220;附加依赖项&#8221;为：qtcore4.lib qtgui4.lib</font></p><font face="微软雅黑"> <p><font size="3" face="微软雅黑">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （注意，这两个库之间为空格，不能写逗号）</font></p> </font></font><p><font face="微软雅黑"><font face="微软雅黑"></font></font><u><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></u></p> <li><font size="3">信号和槽</font></li> <p><font size="3">&nbsp;&nbsp;&nbsp; 信号signals的声明是头文件中进行的（槽的声明也在头文件中声明，同时要在类声明的开始处加上Q_OBJECT语句，这将告诉编译器在编译之前必须用moc工具进行扩展），并且moc&nbsp;&nbsp;&nbsp; 工具会注意不要将信号定义在实现文件中，使用signals关键字标示信号声明区，随后可声明自己的信号。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 信号signals没有public\private\protected等属性，这点不同于slots。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 信号signals的返回值为void&nbsp;&nbsp;&nbsp; </font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 槽slots有public slots、private slots、protected slots (方法)</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 信号signals/事件-&gt;（驱动）槽slots/方法</font></p> <p><font size="3"></font>&nbsp;</p> <li><font size="3"> 元对象</font></li> <p><font size="3">QT的元对象系统为QT提供了对象间通信的信号与槽机制、实时类型信息、动态属性系统等方面的功能。</font></p> <p> </p><p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 元对象系统在QT中主要有以下三个部分构成：QObject类、Q_OBJECT宏、元对象编译器moc</font></p><font size="3">&nbsp; </font> <p><font size="3">&nbsp;&nbsp; 3.vs中QT显示中文：</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;QTextCodec&gt;</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; QFont font("Times",12,QFont::Normal,FALSE);</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; app.setFont(font); </font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; //QFont font("Times",12,QFont::Normal,FALSE);</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; //a.setFont(font);</font></p><font size="3">&nbsp; </font> <p><font size="3">&nbsp;&nbsp;&nbsp; 4.<u><font color="#ff0000">QAction类</font></u>的用法</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; 1、QAction::QAction ( const QString &amp; text, QObject * parent )</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QAction类的构造函数之一，利用text，parent创建QAction对象。QAction对象一般为菜单中的菜单项，比如 "文件"菜单中"新建"选项就是一个QAction对象，</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上述构造函数中text成员变量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 即为菜单项所表示的内容</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用法：QAction *newAction = new QAction(tr("&amp;New"),this);</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; 2、void QAction::setIcon ( const QIcon &amp; icon )</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该函数可设置菜单项名称前的图标</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用法：newAction-&gt;setIcon(QIcon(":/images/new.png"));</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; 3、void QAction::setShortcut ( const QKeySequence &amp; shortcut );</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置QAction对象执行的快捷键</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用法：newAction-&gt;setShortcut(tr("Ctrl+N"));</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 4、void QAction::setStatusTip ( const QString &amp; statusTip );</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置当鼠标移动到&#8220;动作&#8221;上时，状态栏显示的提示语。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 5、void QAction::setVisible ( bool );</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置&#8220;动作&#8221;显示与否，当形参为true是，&#8220;动作&#8221;表示。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 6、void QAction::triggered ( bool checked = false ) [signal]</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此函数为信号，当用户触发此&#8220;动作&#8221;时，此信号发射。例如用户点击了菜单中的菜单项等。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此函数一般用法为：在QObject::connect（）函数中作为信号参数，用于触发&#8220;动作&#8221;所对应执行的槽函数&#8212;&#8212;实现&#8220;动作&#8221;的功能函数，例如：&#8220;新建&#8221;按钮被用户按下，</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所需要的功能可能&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是新建一个文档，那么新建一个文档的动作就在这个槽函数中实现。至于此信号函数中的形参暂时可以忽略。以后会在介绍QObject类中的静态方法connect()函数时详细解说。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、void QAction::setCheckable ( bool );</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此函数用于设置QAction类中的私有变量： bool checkable ，此属性用以提供&#8220;动作&#8221;是否为复选动作，例如Qt Creator中&#8220;控件&#8221;菜单中的&#8220;全屏&#8221;菜单项即为复选动作</font></p> <p><font size="3">菜单</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; 5&nbsp; </font><a href="http://blog.chinaunix.net/uid-27666459-id-3966620.html"><font color="#ff0000" size="3">QMainWindow类</font></a><font size="3">用法</font></p> <p><font size="3">&nbsp; 1、void QMainWindow::setCentralWidget ( QWidget * widget );</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此方法作用为设置传入部件为主窗口布局的中心领域部件。传入部件可为任意的部件或QWidget类的子类部件。对于&#8220;部件&#8221;这个词的理解可以理解为某机器上的一个螺丝、一个配件等等，其实部件就是螺丝和某配件的一个抽象感念嘛，他们都叫做部件，但是却有着不同的作用和形状。以后会遇到很多类继承QWidget类的。相信大家都比笔者聪明，或许我是在说些废话，呵呵。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 举例：</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在自定义的继承于QMainWindow的来构造函数里面：</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTableWidget *table = new QTableWidget；&nbsp;&nbsp;&nbsp;&nbsp; //QTableWidget继承于QWidget类；</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setCentralWidget(table);</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 2、void&nbsp; QMainWindow::setWindowIcon ( const QIcon &amp; icon );</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置窗口左上角图标，支持PNG、BMP、GIF、FPEG、PNM、XBM、XPM格式文件。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一下为几种GUI应用程序提供资源的方法：</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9312;将图片存入文件，在程序运行时加载</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9313;将XPM文件包含在源程序中，因为XPM文件是有效的C++文件</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#9314;使用Qt的资源机制&#8212;&#8212;&#8212;&#8212;此种方式不仅仅支持图片格式文件，而且支持任何格式的文件</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 3、QMenuBar *QMainWindow::menuBar() const;</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此方法返回一个主窗口的菜单栏对象指针。如果在调用此方法时，主窗口不存在菜单栏，则此方法会创建一个空的菜单栏。在Mac应用程序中，如想在多个主窗口之间共享一个菜单栏，则需要使用QMenuBar *menuBar = new QMenuBar(0);形式创建菜单栏，即创建一个无父部件的菜单栏对象。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里解释一下什么叫做父部件，初学一定对这个概念不理解，这里的父部件不是C++中类的继承关系，而是部件与部件的关系。我也是学习了一段时间才慢慢悟出这里面的道理的。我看的是《C++ GUI Programming with Qt 4》英文原版，本来理解起来就有些障碍，再遇到这样新的概念词汇，更是不知其所云。为什么看英文原版书呢，个人觉得国内翻译的不是很到位，可能在某个地方或关键点给我造成误导，貌似扯远了。。。即说说父部件是个什么东西，现在为大家打个比方，一张电脑桌由多个部件构成，如桌面，桌子腿，抽屉等等，抽屉上面有抽屉把手，那么抽屉就是抽屉把手的父部件，电脑桌就是抽屉的父部件。相信这样解释，大家一定就会理解了。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 4、QToolBar * QMainWindow::addToolBar ( const QString &amp; title );</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此函数为重载函数，其余两个为已创建了工具栏(QToolBar)对象时，将工具栏对象添加到QMainWindow对象中。下面就会马上列出这两个类方法。在调用此方法时，会创建一个QToolBar对象，返回这个对象的指针，并在主窗口顶部工具栏区域中显示。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; 5、void QMainWindow::addToolBar ( Qt::ToolBarArea area, QToolBar * toolbar );</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与上个函数构成重载关系，此函数第二个形参为已定义好的工具栏对象指针，第一个形参工具栏表示的位置，此形参为枚举型变量。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工具栏表示位置共4种，即左右上下：</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1) Qt::LeftToolBarArea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x1</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2) Qt::RightToolBarArea&nbsp;&nbsp;&nbsp;&nbsp; 0x2</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3) Qt::TopToolBarArea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x4</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4) Qt::BottomToolBarArea&nbsp; 0x8</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; 6、void QMainWindow::addToolBar ( QToolBar * toolbar );</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与调用 addToolBar(Qt::TopToolBarArea, toolbar) 方法效果相同，即调用 addToolBar(Qt::TopToolBarArea, toolbar) 方法，工具栏显示区域默认为主窗口顶部。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; 7、QStatusBar *QMainWindow::statusBar() const;</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当主窗口状态栏不存在时，创建状态栏，并返回状态栏对象指针。一般在自定义QMainWindow子类的构造函数时使用，创建状态栏对象。创建后，添加QLabel对象，以显示主窗口状态或菜单栏中按钮的状态提示。</font></p> <p><font size="3">相信通过3、4、5、6、7、QMainWindow类方法的学习，大家应该掌握了创建菜单栏，工具栏和状态栏的方法。通常的主窗口一般也就需要这些东西了。但要想让菜单栏，工具栏以及状态栏能有自己的动作或行为，还需要其他类的配合使用。大家不用急，QMainWindow类简单介绍完毕之后，会介绍这些相关的类及其使用方法。</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; 8、void QMainWindow::setWindowModified(bool);</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当此函数形式参数为true时，即设置了WindowModified属性为true，意思为表明先编辑的文档有更新，这时，Qt会自动更新标题栏，Mac OS X 系统上在主窗口的关闭按钮上将出现一个变更的样式，其他系统或平台上会在主窗口标题栏的文件名后多显示一个&#8220;*&#8221;。</font></p> <p><font size="3"></font>&nbsp;</p><pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">void MainWindow::open()
{
    QDialog *dialog = new QDialog;
    dialog-&gt;setAttribute(Qt::WA_DeleteOnClose);
    dialog-&gt;setWindowTitle(tr("Hello, dialog!"));
    dialog-&gt;show();</pre><p>&nbsp;</p><pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">void MainWindow::open()
{
    QDialog dialog(this);
    dialog.setWindowTitle(tr("Hello, dialog!"));
    dialog.exec();
}</pre>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"></font></p><img src ="http://www.cppblog.com/init/aggbug/211652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2015-08-22 14:55 <a href="http://www.cppblog.com/init/archive/2015/08/22/211652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可信时间戳在医疗信息化中的应用</title><link>http://www.cppblog.com/init/archive/2015/08/20/211622.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Thu, 20 Aug 2015 06:27:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2015/08/20/211622.html</guid><wfw:comment>http://www.cppblog.com/init/comments/211622.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2015/08/20/211622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/211622.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/211622.html</trackback:ping><description><![CDATA[<p><b><a name="_Toc257045862">1 </a>概述</b>  <p>随着信息化的发展，医疗机构越来越多依赖各种信息化手段来提高运行效率和保障工作质量，医疗信息化已经遍布在医疗机构的各个环节。这种状况的存在将使医院不可避免的面临一系列新的问题，为此，国家卫生行政管理部门和司法部门相继出台了一系列的规章、规定以保障医患双方的利益。  <p>本方案根据卫生部《电子病历基本规范》、《医疗事故处理条例》、《电子病历系统功能规范（试行）》、《医院卫生系统电子认证服务管理办法》、《中华人民共和国电子签名法》、《中华人民共和国侵权责任法》、《最高人民法院关于民事诉讼证据的若干规定》等法律法规的相关规定，结合医院信息系统和业务特点，以国家授时中心建设和保障的第三方可信时间戳服务为主要技术手段，解决医疗管理信息系统中存在的电子签名有效性、电子数据（数据电文）的真实完整性、产生时间权威等问题，介绍了可信时间戳如何帮助医疗机构解决在实施信息化过程中给医疗机构带来的的技术风险；如何在出现医患纠纷时医疗机构能降低举证成本和有效举证；如何使用可信时间戳建立内部责任认定体系。  <p>可信时间戳的使用是医疗机构的信息化系统能够满足国家有关标准和法律法规的要求和医疗结构降低运营成本、建立内部责任认定体系、保障医院的合法权益和降低医院法律风险的必要手段。该方案在2010年11月14日由卫生部组织的《可信时间戳与电子病历法律效力研讨论证会》上获得通过，医政司、政策法规司、医院管理研究所、卫生部统计信息中心、协和医院、北大人民医院、北医三院、北京市西城法院法官、中国医院协会自律维权部、国家法官学院、国家授时中心、联合信任时间戳服务中心的有关领导和专家参加了论证。  <p><b><a name="_Toc257045863">2 </a>可信时间戳的概念与作用</b>  <p><b><a name="_Toc257045864">2.1 </a>可信时间戳释义</b>  <p>可信时间戳是由权威时间戳服务中心签发的一个能证明数据电文（各种电子文件和电子数据）在一个时间点是已经存在的、完整的、可验证的，具备法律效力的电子凭证；是解决《中华人民共和国电子签名法》中对数据电文原件形式要求的必要技术保障。我国权威的时间戳服务中心（<a href="http://www.tsa.cn/">www.tsa.cn</a>）是由国家法定授时机构（国家授时中心）和联合信任共同建设，按照有关标准和规定运营，对各行业提供权威可信时间戳服务。  <p><b><a name="_Toc257045865">2.2 </a>可信时间戳产生</b>  <p>根据国际时间戳标准《RFC3161》，可信时间戳是将用户的电子数据的Hash值封装成可信时间戳请求发送到时间戳服务中心，在此基础上绑定由国家权威时间机构保障、不可更改的时间信息并通过时间戳服务中心签发，产生不可伪造的时间戳文件。通过电子数据及对应可信时间戳文件有效证明电子数据的完整性及产生时间。  <p><b>[</b><b>图一] 可信时间戳产生原理</b>  <p><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="111.jpg" src="http://chisc.net/d/file/yiliaoxinxixitongjishu/jxyy/2011-03-08/8cae828ecaaded8a04f4840992e200a1.jpg" width="776" height="399">  <p><b><a name="_Toc257045866">2.3 </a>可信时间戳法律效力</b>  <p>可信时间戳必须由权威第三方时间戳服务中心签发，由国家授时中心来负责保障时间的授时和守时监测，任何机构包括时间戳中心自己不能对时间进行修改以保障时间的权威，只有这样产生的时间戳才具有法律效力。联合信任时间戳服务中心是我国目前唯一由国家授时中心进行时间的权威保障的第三方可信时间戳服务机构，其签发的时间戳已经得到了司法的认可，是具有法律效力的可信时间戳。  <p><b>[</b><b>图二] 可信时间戳服务构架</b>  <p><b><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="222.jpg" src="http://chisc.net/d/file/yiliaoxinxixitongjishu/jxyy/2011-03-08/d8a8c87278b4395a6ae0a0e581131f09.jpg" width="613" height="458"></b>  <p><b><a name="_Toc257045867">2.4 </a>可信时间戳的基本作用</b>  <p><b>2.4.1 解决电子签名法中对数据电文（电子文件）满足法律法规要求的原件形式的有效手段</b>  <p>《中华人民共和国电子签名法》第二章数据电文第五条中规定：“符合下列条件的数据电文，视为满足法律、法规规定的原件形式要求：  <p>（一）能够有效地表现所载内容并可供随时调取查用；  <p>（二）能够可靠地保证自最终形成时起，内容保持完整、未被更改。但是，在数据电文上增加背书以及数据交换、储存和显示过程中发生的形式变化不影响数据电文的完整性。”  <p>如何保证电子数据自最终形式生成，内容保持完整、未被更改。以实现医疗行为的“重现”，保证医疗电子数据（数据电文的“客观性和真实性”。关键在于确保数据电文何时已存在产生，自形成始内容完整且是可验证的。  <p>根据可信时间戳的基本功能，可信时间戳符合《中华人民共和国电子签名法》第二章关于数据电文原件形式的要求，能有效证明数据电文（电子文件）产生的时间及内容的完整性，保证数据电文的客观性、真实性，应用于数据电文长期归档、保存、验证、及法律证据举证。  <p><b><a name="_Toc257045868">2.4.2&nbsp; </a>解决电子签名的有效性</b>  <p>《中华人民共和国电子签名法》中对电子签名的定义为：“电子签名，是指数据电文中以电子形式所含、所附用于识别签名人身份并表明签名人认可其中内容的数据。本法所称数据电文，是指以电子、光学、磁或者类似手段生成、发送、接收或者储存的信息。”  <p><b>根据已经颁布实施的《</b>国标GB/T25064-2010<b>》规定，电子签名格式有如下几种：</b>  <p>l <b>基本电子签名（</b><b>BES</b><b>）</b>  <p>基本电子签名方式（BES）是指包括了签名基本数据信息的电子签名。  <p><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="333.jpg" src="http://chisc.net/d/file/yiliaoxinxixitongjishu/jxyy/2011-03-08/80355d76b3329a3615ad03908bc4144b.jpg" width="573" height="192">  <p><b></b> <p>采用基本电子签名方式将存在以下问题：  <p>在现时的公钥基础建设中，采用电子签名技术来确保签署人的身份和验证数据是否篡改。然而综合众多现实案例中出现的情形，采用基本电子签名方式的不足之处在于“数字签名的伪造”，由于数字证书有效期为一年，且用户可以随时吊销数字证书，数字证书失效后，无法确认电子签名的有效性，基本电子签名一般只用在通讯过程中的身份认证和防止数据在通讯过程被篡改，电子数据的长期归档保存不能使用基本签名来实现抗抵赖特性。  <p>l <b>带时间戳的电子签名（ES-T）</b>  <p>根据标准电子签名方式，其在基本电子签名的基础上添加了时间戳，其目的是开始在长时间的有效性上提供一定程度的保证。  <p><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="444.jpg" src="http://chisc.net/d/file/yiliaoxinxixitongjishu/jxyy/2011-03-08/40d3b833b6f3f1e555849d992021cc30.jpg" width="677" height="225">  <p>当某些验证数据的安全性受到威胁的时候，电子签名上的时间戳可保护签名的有效性，只要这些安全性威胁是在签名产生以后发生的。时间戳可有效证明电子签名是在该安全威胁产生前创建的，使电子签名仍可保持其有效性。  <p>l <b>带归档时间戳的电子签名</b>  <p>各种算法、密钥、加密数据、加密函数都会随着时间的增加而逐渐降低其安全性，各种证书也会随着时间而纷纷失效，如果要长期保存一个电子签名，就需要在这些成分的安全性降低前对整个电子签名加盖一次时间戳。新加的时间戳尽可能使用比老时间戳更强的算法和密钥。这类额外添加的验证数据称为归档验证数据。  <p>考虑到时间戳所使用的证书、算法和密钥也会随着时间而失效或降低安全性，在这种情况发生前，必须加盖新的时间戳。因此，一个ES-A可能嵌套了多重时间戳。  <p>综上电子签名的几种形式上看，电子签名证实了签署人的身份。但是，如果文件没有一个准确可靠的签署时间，即使附有电子签名的文件也有可能不被承认起不到抗抵赖的做用。可信时间戳能为电子签名提供确实的签署时间，保证电子签名的有效性，这样既能证实签署人的身份，亦能指出准确的签署时间，使人无从抵赖或否认。可信时间戳是电子签名有效性的基本保障。  <p><b><a name="_Toc257045870">3 </a>可信时间戳在医疗卫生信息系统中的作用</b>  <p>1、为医疗数据电文（电子文件）在出现纠纷时能有效举证，降低医院的举证成本，保障医院利益，规避法律风险；  <p>2、为医院信息系统中使用电子签名的数据，提供标准中规定的可信时间戳，使医疗机构的电子签名格式满足高级电子签名的要求，保障医疗机构电子签名在签名证书失效后应然有效。  <p>2、为医疗信息电子数据（数据电文）的长期保存、归档提供客观、安全、真实性保障。  <p>4、为医院加强管理、建立内部责任认定体系提供基础技术保障；  <p><b><a name="_Toc257045878">4 </a>可信时间戳在医疗卫生信息系统中的应用解决方案</b>  <p><b><a name="_Toc257045879">4.1 </a>可信时间戳技术实现构架</b>  <p>可信时间戳在医疗卫生信息系统中的实现构架主要由时间戳中间件应用组件与可信时间戳数据库存储组件组成，时间戳服务中心提供符合国际标准的接口程序，医疗机构几乎不用修改系统既可以方便部署，具体架构如图：  <p><b><a name="_Toc257045880">4.2 </a>可信时间戳技术实现细节</b>  <p><b></b><b>可信时间戳申请</b>  <p>联合信任时间戳中间件采用异步的方式实现时间戳申请功能，通过UDP通讯协议方式访问中间件通讯接口进行请求可信时间戳申请操作。中间件接收到请求后，将请求数据存储至数据库中，并进行应答响应结束此次通讯对话，以保证医疗工作流程的正常进行。封装成时间戳标准请求包，并按照请求的优先级将发送至联合信任时间戳中心进行加盖可信时间戳。成功返回可信时间戳后，将可信时间戳存储至中间件存储组件中。若发生异常情况，导致无法完成此次时间戳申请操作，中间件会将此数据请求进行存档。由按照规则自动启动的异常处理模块定时扫描的方式，重新处理此数据请求。具体流程如图：  <p><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="555.jpg" src="http://chisc.net/d/file/yiliaoxinxixitongjishu/jxyy/2011-03-08/075077841cff0ca01a0822e3ab10586f.jpg" width="748" height="438">  <p>图申请时间戳流程  <p>图异常处理模块处理失败请求流程  <p><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="666.jpg" src="http://chisc.net/d/file/yiliaoxinxixitongjishu/jxyy/2011-03-08/010e652a751f4611f537087f59570881.jpg" width="699" height="599">  <p><b>已加盖时间戳医疗电子数据查询验证</b>  <p>联合信任时间戳中间件提供可信时间戳的验证接口，通过通讯接口的进行交互可以已加盖时间戳医疗电子数据是否被篡改或查询可信时间戳签名时间。验证接口提供3种验证成功后的返回数据结果方式：  <p>Ø 返回可信时间戳签名时间  <p>Ø 返回可信时间戳文件  <p>Ø 返回可信时间戳签名时间和可信时间戳文件  <p><b><a name="_Toc257045881">4.3 </a>可信时间戳技术实现特点</b>  <p>Ø 高可靠性：时间戳服务中心采取消息中间件与医院信息系统链接，保障了申请时间戳的请求能不丢失，完整返回申请时间戳电子凭证。时间戳服务中心的高可靠和高速签发能力保障了7x24小时不间断服务。  <p>Ø&nbsp; 数据安全性：系统采用时间戳专用隔离网关和中间件程序，上传到时间戳中心的只是医疗数据的hash值，不上传医疗数据内容本身，从而保障了医疗信息数据的安全。针对不能链接外网的医疗信息系统，使用时间戳申请专用网闸等进行内外网分离。  <p>Ø 适用性：采用模块化设计技术，便于升级和扩展。  <p>Ø 跨平台性：可以在UNIX、LINUX等多种操作系统平台上运行。  <p>Ø负载动态均衡技术：根据用户的实际需求，可以实现自动负载动态均衡，使得时间戳中间件能够发挥最佳的使用效率。  <p><b><a name="_Toc257045882">4.4 </a>可信时间戳技术实现环境</b>  <p>联合信任时间戳中间件所需2台硬件企业级服务器，以下为硬件环境和软件环境需求：  <p>&nbsp;</p><strong></strong> <p><b><a name="_Toc257045886">4.5 </a>出现发生医疗纠纷争议时时间戳证据的提取</b>  <p>在发生医疗纠纷时需要对医疗电子数据进行验证时，需要提取医院加盖时间戳的电子数据原文和时间戳存储服务器上的时间戳电子文件（或时间戳服务中心存储的时间戳），由时间戳服务中心或其他第三方鉴定机构按照时间戳技术标准出具验证报告。证明相关数据是否被篡改和产生的时间。  <p><b><a name="_Toc257045887">5 </a>方案总结-可信时间戳是保障医疗系统信息化系统法律效力的基础</b>  <p>1、医疗机构需要制定科学有效的使用可信时间戳和电子签名的策略，在容易出现纠纷的关键数据上合理使用，这样既可以解决医患纠纷时医疗机构举证困难、举证成本高的问题，又可以解决医疗机构在实际工作中由于工作需要合理修改诊疗数据给患者带来的疑虑。  <p>2、医疗机构需要长期归档保存的各类医疗数据、医疗记录、影像资料等，通过加盖时间戳，保证了医疗信息的时间及内容真实可靠性，解决患者和司法机构对电子病历的篡改、伪造的质疑，即使数年以后仍具有法律效力，客观真实反映医疗过程，对界定工作责任、追究医疗事故起着致关重要的作用。  <p>3、时间戳服务中心由我国唯一法定时间机构负责监控、保持，保证了时间的权威、可靠、不可篡改。实施时间戳认证后、院方有能力有效的保存经权威时间认证后的医疗数据，避免了数据保存在第三方处的存在的数据安全风险。  <p>4、由于医院内部系统时间、电子病历数据、电子签名证书等都完全由医院控制，在医院内部责任认定和医患纠纷举证时这些电子数据的可信性将受到质疑及否认，根据《中华人民共和国侵权责任法》、《最高人民法院关于民事诉讼证据的若干规定》，导致医院处于极为不利的境地，医院利益受到极大损害。  <p>通过采用国家授时中心时间戳服务中心权威可信时间戳认证，对医疗电子数据（电子病历、各类医疗记录、检查报告、各类影像资料、图片等）加盖时间戳后进行归档保存，有效保障了电子数据的完整性及产生时间的不可否认，真实客观的反映了医疗行为，符合相关法律规章规定，医院具有法律效力的医疗数据证据，规避了院方利益受损的巨大风险，同时增强了系统安全性，医院自己能保存医疗信息资料，避免泄露隐患。  <img src ="http://www.cppblog.com/init/aggbug/211622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2015-08-20 14:27 <a href="http://www.cppblog.com/init/archive/2015/08/20/211622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>glAlphaFunc in OpenGL ES2.0</title><link>http://www.cppblog.com/init/archive/2012/11/19/195387.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Mon, 19 Nov 2012 14:28:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/11/19/195387.html</guid><wfw:comment>http://www.cppblog.com/init/comments/195387.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/11/19/195387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/195387.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/195387.html</trackback:ping><description><![CDATA[<p><font size="3">In OpenGL ES 2.0 </font><a href="http://www.opengl.org/sdk/docs/man/xhtml/glAlphaFunc.xml"><font size="3">glAlphaFunc</font></a><font size="3"> isn't available, you have to implement it in a fragment shader. There isn't a lot of reference out there for this (not that I could find anyway) so I thought I'd write this up.</font> 
<p><font size="3">It's actually quite simple to implement a quick alpha test. I needed to be able to cookie cut out sprites and fonts so I simply needed to reject fragments where the alpha value was zero. Here are the guts of a shader to do this:</font> 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre><span style="color: #000000">#ifdef GL_ES 
precision highp </span><span style="color: #0000ff">float</span><span style="color: #000000">;
</span><span style="color: #0000ff">#endif</span> <span style="color: #000000">
uniform sampler2D u_tex0; 
uniform </span><span style="color: #0000ff">bool</span><span style="color: #000000"> u_alphatestenable; 
varying vec2 v_texCoord;
varying vec4 v_color;
</span><span style="color: #0000ff">void</span><span style="color: #000000"> main(){ 
    </span><span style="color: #008000">//</span><span style="color: #008000">calculate the fragment color based on the texture and the vertex colour</span>
    vec4 basecolor = texture2D( u_tex0, v_texCoord ) *<span style="color: #000000"> v_color;

    </span><span style="color: #008000">//</span><span style="color: #008000">if testing is enabled, check the alpha component and discard if zero      </span>
    <span style="color: #0000ff">if</span><span style="color: #000000">(u_alphatestenable){ 
        </span><span style="color: #0000ff">if</span>(basecolor.a == <span style="color: #800080">0.0</span><span style="color: #000000">){ 
            </span><span style="color: #008000">//</span><span style="color: #008000">throw this fragment away</span>
<span style="color: #000000">            discard;
        }
    }
    gl_FragColor </span>=<span style="color: #000000"> basecolor;
}</span></pre></div>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3">You need to set up a uniform variable u_alphatestenable which enables the alpha test. If you want to support different test types ( less than, greater than etc) then you will need two more uniform variables: one for the test type and one for the value to test against.</font> 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre><span style="color: #0000ff">int</span> uni_alphatest_enable = glGetUniformLocation(mProgram, <span style="color: #800000">"</span><span style="color: #800000">u_alphatestenable</span><span style="color: #800000">"</span><span style="color: #000000">); 
</span><span style="color: #0000ff">bool</span> alphateston = <span style="color: #0000ff">true</span><span style="color: #000000">; 
glUniform1i(uni_alphatest_enabl</span></pre></div>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"><em>note that you shouldn't call glGetUniformLocation every frame, it should be cached somewhere</em>.<br />It's quite simple and while you may be thinking oh that is so slow it not that bad. It's faster then the fixed function pipeline which is doing tests for alpha, lights, blend modes etc. If you get paranoid then you can create multiple shaders that support different subsets of features. All you need to be careful of is the cost of calling glSetProgram (to switch shaders) which can be expensive and cause bubbles in the vertex pipeline in the hardware.</font></p><img src ="http://www.cppblog.com/init/aggbug/195387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-11-19 22:28 <a href="http://www.cppblog.com/init/archive/2012/11/19/195387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gamma Correction</title><link>http://www.cppblog.com/init/archive/2012/11/15/195246.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Thu, 15 Nov 2012 15:05:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/11/15/195246.html</guid><wfw:comment>http://www.cppblog.com/init/comments/195246.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/11/15/195246.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/195246.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/195246.html</trackback:ping><description><![CDATA[<p><br><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_11C68/image_12.png"><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_11C68/image_thumb_5.png" width="635" height="318"></a></p> <p><font size="3">在计算机图形学领域时常听到gamma correction ，gamma correction 控制了图像整体的亮度，reproduce colors也需要gamma correction的一些理论知识，gamma correction不仅仅是控制了图像的亮度，而且还控制了RGB各个分量的比例，我们知道渲染器是线性的，而显示器并非线性，其实电子打在屏幕上从而产生亮点，电子的运动受电压控制，这两者是指数关系的，所以产生的亮度也跟电压成指数关系，而发送给显示器的voltages范围是0~1：</font></p> <p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_11C68/image_14.png"><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_11C68/image_thumb_6.png" width="304" height="64"></a></p> <p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_11C68/image_2.png"><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_11C68/image_thumb.png" width="697" height="175"></a></p> <p><font size="3">对于我们输入的图像，如果直接显示，那么就会篇暗，根据已知电压与显示亮度的关系，进行gamma correction ，其实就是对gamma曲线的修正。一般生产厂家不加说明，他们的伽码值大约等于2.5.</font></p> <p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_11C68/image_16.png"><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_11C68/image_thumb_7.png" width="264" height="77"></a></p> <p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_11C68/image_10.png"><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_11C68/image_thumb_4.png" width="691" height="265"></a></p> <p>代码：</p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre>   gammaCorrection = <span style="color: #800080">1</span> /<span style="color: #000000"> gamma
   colour </span>=<span style="color: #000000"> GetPixelColour(x, y)
   newRed   </span>= <span style="color: #800080">255</span> * (Red(colour)   / <span style="color: #800080">255</span>) ^<span style="color: #000000"> gammaCorrection
   newGreen </span>= <span style="color: #800080">255</span> * (Green(colour) / <span style="color: #800080">255</span>) ^<span style="color: #000000"> gammaCorrection
   newBlue  </span>= <span style="color: #800080">255</span> * (Blue(colour)  / <span style="color: #800080">255</span>) ^<span style="color: #000000"> gammaCorrection
   PutPixelColour(x, y) </span>= RGB(newRed, newGreen, newBlue)</pre></div>
<p><font size="3">知道monitor不是一个线性的，那么我们在进行颜色加法时，我们得到的颜色并不是真正的颜色值的相加，比如gamma factor是2.2</font></p>
<p><font size="3">red = add (r1, r2);</font></p>
<p><font size="3">red= add (0.235,0.156);</font></p>
<p><font size="3">对于一个线性设备，red = 0.391,对于未经修正的montior red=0.126;</font></p>
<p><font size="3">因为有一个幂函数的运算：C_out = C_in<sup>2.2</sup></font></p>
<p><font size="3">现在使用gamma correction :C_corrected= C_out<sup>1.0/2.2</sup></font></p>
<p><font size="3">0.391<sup>2.2</sup> = 0.126</font></p>
<p><font size="3">0.126<sup>1.0/2.2</sup> = 0.39</font></p>
<p><font size="3">我们看到使用伽码校正以后我们能得到我们预想的颜色值0.39.</font></p>
<p><font size="3"></font>&nbsp;</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_thumb.png" width="637" height="476"></a><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_10.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_thumb_3.png" width="637" height="475"></a></p>
<p>&nbsp;</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_12.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_thumb_4.png" width="643" height="399"></a><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_14.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_thumb_5.png" width="638" height="398"></a></p>
<p>&nbsp;</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_16.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_thumb_6.png" width="636" height="403"></a><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_18.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/Gamma-Correction_62A/image_thumb_7.png" width="639" height="403"></a></p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3">There are two ways to do gamma correction:</font></p>
<ul>
<li><font size="3">Using the renderer. The renderer (the graphics card or GPU) is a linear device. Modern renderers have the support of gamma correction via <b>sRGB</b> textures and framebuffer formats. See the following OpenGL extensions for more details: </font><a href="http://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt"><font size="3">GL_ARB_framebuffer_sRGB</font></a><font size="3"> and </font><a href="http://www.opengl.org/registry/specs/EXT/texture_sRGB.txt"><font size="3">GL_EXT_texture_sRGB</font></a><font size="3">. With these extensions you can get gamma corrected values <i>for free</i> but gamma correction factor is set to 2.2. You can’t change it. </font>
<li><font size="3">Using a software gamma correction. The gamma correction is applied to the final scene buffer thanks to a<b>pixel shader</b> and you can set the gamma correction you want.</font></li></ul>
<p><font size="3">In OpenGL, using GL_ARB_framebuffer_sRGB is really simple: once your FBO is bound, just enable the sRGB space with</font><pre><font size="3">glEnable(GL_FRAMEBUFFER_SRGB);</font></pre><pre>&nbsp;</pre><pre><a href="http://www.cambridgeincolour.com/tutorials/gamma-correction.htm">gamma-correction</a></pre><img src ="http://www.cppblog.com/init/aggbug/195246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-11-15 23:05 <a href="http://www.cppblog.com/init/archive/2012/11/15/195246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hemi-Sphere Lighting</title><link>http://www.cppblog.com/init/archive/2012/09/18/191143.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Tue, 18 Sep 2012 11:27:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/09/18/191143.html</guid><wfw:comment>http://www.cppblog.com/init/comments/191143.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/09/18/191143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/191143.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/191143.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2012/09/18/191143.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/191143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-09-18 19:27 <a href="http://www.cppblog.com/init/archive/2012/09/18/191143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>辐射计量概念</title><link>http://www.cppblog.com/init/archive/2012/09/18/191130.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Tue, 18 Sep 2012 08:50:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/09/18/191130.html</guid><wfw:comment>http://www.cppblog.com/init/comments/191130.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/09/18/191130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/191130.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/191130.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2012/09/18/191130.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/191130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-09-18 16:50 <a href="http://www.cppblog.com/init/archive/2012/09/18/191130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Light Mapping</title><link>http://www.cppblog.com/init/archive/2012/09/18/191128.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Tue, 18 Sep 2012 08:48:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/09/18/191128.html</guid><wfw:comment>http://www.cppblog.com/init/comments/191128.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/09/18/191128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/191128.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/191128.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2012/09/18/191128.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/191128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-09-18 16:48 <a href="http://www.cppblog.com/init/archive/2012/09/18/191128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GLSL.Ambient occlusion </title><link>http://www.cppblog.com/init/archive/2012/04/30/173280.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Mon, 30 Apr 2012 14:18:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/04/30/173280.html</guid><wfw:comment>http://www.cppblog.com/init/comments/173280.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/04/30/173280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/173280.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/173280.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2012/04/30/173280.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/173280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-04-30 22:18 <a href="http://www.cppblog.com/init/archive/2012/04/30/173280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GLSL.High Dynamic Range</title><link>http://www.cppblog.com/init/archive/2012/04/19/172031.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Thu, 19 Apr 2012 13:48:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/04/19/172031.html</guid><wfw:comment>http://www.cppblog.com/init/comments/172031.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/04/19/172031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/172031.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/172031.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2012/04/19/172031.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/172031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-04-19 21:48 <a href="http://www.cppblog.com/init/archive/2012/04/19/172031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GLSL.Depth Of Field</title><link>http://www.cppblog.com/init/archive/2012/04/19/172028.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Thu, 19 Apr 2012 12:42:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/04/19/172028.html</guid><wfw:comment>http://www.cppblog.com/init/comments/172028.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/04/19/172028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/172028.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/172028.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2012/04/19/172028.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/172028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-04-19 20:42 <a href="http://www.cppblog.com/init/archive/2012/04/19/172028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GLSL.Image post-processing</title><link>http://www.cppblog.com/init/archive/2012/04/07/170372.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Sat, 07 Apr 2012 09:03:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/04/07/170372.html</guid><wfw:comment>http://www.cppblog.com/init/comments/170372.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/04/07/170372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/170372.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/170372.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2012/04/07/170372.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/170372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-04-07 17:03 <a href="http://www.cppblog.com/init/archive/2012/04/07/170372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GLSL.Parallax mapping</title><link>http://www.cppblog.com/init/archive/2012/04/07/169945.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Sat, 07 Apr 2012 09:03:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/04/07/169945.html</guid><wfw:comment>http://www.cppblog.com/init/comments/169945.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/04/07/169945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/169945.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/169945.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2012/04/07/169945.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/169945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-04-07 17:03 <a href="http://www.cppblog.com/init/archive/2012/04/07/169945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>