<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7195651747633003892</id><updated>2011-10-02T04:50:58.149-07:00</updated><category term='SampleCode'/><category term='C++'/><category term='CodeIgniter'/><category term='php'/><category term='delphi'/><title type='text'>敏捷軟體學院 : 教學資源網</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>95</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-4566877810365214913</id><published>2011-06-20T00:32:00.001-07:00</published><updated>2011-06-20T00:32:42.104-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>crecord</title><content type='html'>&lt;pre class="brush: cpp;"&gt;class crecord extends crecord_NullObject {&lt;br /&gt;&lt;br /&gt;    var $model;&lt;br /&gt;    var $table;&lt;br /&gt;    var $row;&lt;br /&gt;&lt;br /&gt;    var $id;&lt;br /&gt;&lt;br /&gt;    function crecord()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;model = NULL;&lt;br /&gt;        $this-&amp;gt;table = "";&lt;br /&gt;&lt;br /&gt;        $this-&amp;gt;_common_init();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _common_init( $id = NULL )&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;row = NULL;&lt;br /&gt;        $this-&amp;gt;id = $id;&lt;br /&gt;&lt;br /&gt;        if( $id != NULL )&lt;br /&gt;            $this-&amp;gt;load($id);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function init( &amp;$model , $table, $id = NULL)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;model = &amp;$model;&lt;br /&gt;        $this-&amp;gt;table = $table;&lt;br /&gt;&lt;br /&gt;        $this-&amp;gt;_common_table();&lt;br /&gt;        $this-&amp;gt;load($id);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function equal($record)&lt;br /&gt;    {&lt;br /&gt;        foreach($record-&amp;gt;row as $key =&amp;gt; $value)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            if( $this-&amp;gt;getField($key) != $value )&lt;br /&gt;                    return false;&lt;br /&gt;        }&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    function reuse($id = NULL)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;_common_init($id);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function loadlast( $key = null , $value = null)&lt;br /&gt;    {&lt;br /&gt;        $id = $this-&amp;gt;model-&amp;gt;select_max('id', $key, $value);&lt;br /&gt;        $this-&amp;gt;load($id);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    function _common_table()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;model-&amp;gt;init($this-&amp;gt;table);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function load($id = NULL)&lt;br /&gt;    {&lt;br /&gt;         return $this-&amp;gt;loadwithfield("id", $id);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function loadwithfield($field, $value)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;_common_table();&lt;br /&gt;        $this-&amp;gt;reuse();&lt;br /&gt;&lt;br /&gt;        if( $field == NULL || $value == NULL )&lt;br /&gt;            return;&lt;br /&gt;&lt;br /&gt;        $row = $this-&amp;gt;model-&amp;gt;select_field_row($field,$value);&lt;br /&gt;&lt;br /&gt;        return $this-&amp;gt;_init_load_field($row);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _init_load_field($row)&lt;br /&gt;    {&lt;br /&gt;        if( $row == NULL )&lt;br /&gt;        {&lt;br /&gt;            $this-&amp;gt;id = NULL;&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        $this-&amp;gt;id = $row-&amp;gt;id;&lt;br /&gt;        $this-&amp;gt;setrow($row);&lt;br /&gt;&lt;br /&gt;        return $this-&amp;gt;row;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function load2($field ='id',$value=NULL)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;loadwithfield($field, $value);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function is_update()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;id != NULL;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function save()&lt;br /&gt;    {&lt;br /&gt;        if( $this-&amp;gt;row == NULL )&lt;br /&gt;            return;&lt;br /&gt;&lt;br /&gt;        $this-&amp;gt;_common_table();&lt;br /&gt;        if( $this-&amp;gt;id == NULL )&lt;br /&gt;        {&lt;br /&gt;           $this-&amp;gt;id = $this-&amp;gt;model-&amp;gt;insert($this-&amp;gt;row);&lt;br /&gt;           return $this-&amp;gt;id;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;           $this-&amp;gt;model-&amp;gt;update($this-&amp;gt;id, $this-&amp;gt;row);&lt;br /&gt;           return $this-&amp;gt;id;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function delete($id = null)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;_common_table();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        if( $id != null )&lt;br /&gt;            $this-&amp;gt;load($id);&lt;br /&gt;&lt;br /&gt;        if( $this-&amp;gt;id == NULL )&lt;br /&gt;            return;&lt;br /&gt;&lt;br /&gt;        $this-&amp;gt;model-&amp;gt;delete($this-&amp;gt;id);&lt;br /&gt;        return $this-&amp;gt;id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function getField($field)&lt;br /&gt;    {&lt;br /&gt;        if( $field == "id" )&lt;br /&gt;        {&lt;br /&gt;            return $this-&amp;gt;id;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        switch( gettype($this-&amp;gt;row) )&lt;br /&gt;        {&lt;br /&gt;            case "array":&lt;br /&gt;                return $this-&amp;gt;row[$field];&lt;br /&gt;&lt;br /&gt;            case "object":&lt;br /&gt;            {&lt;br /&gt;                if( isset($this-&amp;gt;row-&amp;gt;$field) )&lt;br /&gt;                    return $this-&amp;gt;row-&amp;gt;$field;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            default:&lt;br /&gt;                return;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if( is_object($this-&amp;gt;row))&lt;br /&gt;                return $this-&amp;gt;row-&amp;gt;$field;&lt;br /&gt;&lt;br /&gt;        if( is_array($this-&amp;gt;row))&lt;br /&gt;                return $this-&amp;gt;row[$field];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    function setField($field, $value)&lt;br /&gt;    {&lt;br /&gt;        $type = gettype($this-&amp;gt;row);&lt;br /&gt;        switch( $type)&lt;br /&gt;        {&lt;br /&gt;            case "array":&lt;br /&gt;                return $this-&amp;gt;row[$field] = $value;&lt;br /&gt;            case "object":&lt;br /&gt;            default:&lt;br /&gt;                return $this-&amp;gt;row-&amp;gt;$field = $value;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function getrow()&lt;br /&gt;    {&lt;br /&gt;        $row = $this-&amp;gt;row;&lt;br /&gt;        if( $row != NULL )&lt;br /&gt;            $row-&amp;gt;id = $this-&amp;gt;id;&lt;br /&gt;        return $row;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function setrow($row)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;_tranArr2Obj ($row);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _tranArr2Obj($array_row)&lt;br /&gt;    {&lt;br /&gt;        foreach($array_row as $key =&amp;gt; $value )&lt;br /&gt;        {&lt;br /&gt;            if( $key == "id" )&lt;br /&gt;                continue;&lt;br /&gt;            $this-&amp;gt;setField($key, $value);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function create_owner()&lt;br /&gt;    {&lt;br /&gt;        return new crecord;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function isNull()&lt;br /&gt;    {&lt;br /&gt;        return "FALSE";&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-4566877810365214913?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/4566877810365214913/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2011/06/crecord.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4566877810365214913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4566877810365214913'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2011/06/crecord.html' title='crecord'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2081512784996191128</id><published>2011-06-20T00:19:00.000-07:00</published><updated>2011-06-20T00:19:11.458-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>mymodel_db</title><content type='html'>&lt;pre class="brush: cpp;"&gt;class mymodel_db extends model{&lt;br /&gt;&lt;br /&gt;    var $table;&lt;br /&gt;&lt;br /&gt;    function mymodel_db(){&lt;br /&gt;        parent::model();&lt;br /&gt;&lt;br /&gt;        $this-&amp;gt;table = "";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function init($table)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;table = $table;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function select($id)&lt;br /&gt;    {&lt;br /&gt;        $row = $this-&amp;gt;select_field_row("id", $id);&lt;br /&gt;        return $row;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function select_query($field, $value)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;flush_cache();&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;where($field , $value);&lt;br /&gt;        &lt;br /&gt;        $query = $this-&amp;gt;db-&amp;gt;get($this-&amp;gt;table);&lt;br /&gt;        return $query;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    function select_field_row($field, $value)&lt;br /&gt;    {&lt;br /&gt;        $query = $this-&amp;gt;select_query($field, $value);&lt;br /&gt;        return $query-&amp;gt;row();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    function select2($field,$value)&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        return $this-&amp;gt;select_field_row($field, $value);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function delete($id){&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;flush_cache();&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;where("id",$id);&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;delete($this-&amp;gt;table);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function insert($row)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;flush_cache();&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;insert($this-&amp;gt;table,$row);&lt;br /&gt;        $id = $this-&amp;gt;db-&amp;gt;insert_id();&lt;br /&gt;&lt;br /&gt;        return $id;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function update($id, $row)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;flush_cache();&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;where("id",$id);&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;update($this-&amp;gt;table,$row);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function selectall()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;flush_cache();&lt;br /&gt;        $query = $this-&amp;gt;db-&amp;gt;get($this-&amp;gt;table);&lt;br /&gt;        return $query;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function select_all_idTOarr()&lt;br /&gt;    {&lt;br /&gt;        $id_arr = array();&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;flush_cache();&lt;br /&gt;        $query = $this-&amp;gt;db-&amp;gt;get($this-&amp;gt;table);&lt;br /&gt;        foreach($query-&amp;gt;result() as $row)&lt;br /&gt;        {&lt;br /&gt;            $id_arr[] = $row-&amp;gt;id;&lt;br /&gt;        }&lt;br /&gt;        return $id_arr;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function like_query($field, $value)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;flush_cache();&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;like($field , $value);&lt;br /&gt;        $query = $this-&amp;gt;db-&amp;gt;get($this-&amp;gt;table);&lt;br /&gt;        return $query;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function list_fields()&lt;br /&gt;    {&lt;br /&gt;        $result = $this-&amp;gt;db-&amp;gt;list_fields($this-&amp;gt;table);&lt;br /&gt;        return $result;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2081512784996191128?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2081512784996191128/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2011/06/mymodeldb.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2081512784996191128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2081512784996191128'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2011/06/mymodeldb.html' title='mymodel_db'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-302293308870979032</id><published>2011-05-19T18:35:00.001-07:00</published><updated>2011-05-19T18:37:43.447-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>cweb_grid</title><content type='html'>&lt;pre class="brush: cpp;"&gt;class cweb_grid {&lt;br /&gt;&lt;br /&gt;    var $column_obj; // 欄位&lt;br /&gt;    var $item_arr; // 項目列&lt;br /&gt;    var $param; // 參數列&lt;br /&gt;&lt;br /&gt;    function cweb_grid()&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        $this-&amp;gt;column_obj = new empty_object;&lt;br /&gt;        $this-&amp;gt;item_arr = array();&lt;br /&gt;        $this-&amp;gt;param = array();&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    function _pre_html()&lt;br /&gt;    {&lt;br /&gt;        $param_str = "";&lt;br /&gt;        foreach($this-&amp;gt;param as $key =&amp;gt; $value )&lt;br /&gt;        {&lt;br /&gt;            $param_str .= " {$key}=\"{$value}\" ";&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        $result = "&amp;lt;table " . $param_str . " &amp;gt;";&lt;br /&gt;&lt;br /&gt;        return $result;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _after_html()&lt;br /&gt;    {&lt;br /&gt;        return "&amp;lt;/table&amp;gt;";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _arr2obj($row)&lt;br /&gt;    {&lt;br /&gt;        return $row;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _proc_row($row)&lt;br /&gt;    {&lt;br /&gt;        $result = "";&lt;br /&gt;        foreach($this-&amp;gt;column_obj as $key =&amp;gt; $value)&lt;br /&gt;        {&lt;br /&gt;            if( !isset($row-&amp;gt;$key) )&lt;br /&gt;                $result .= "&amp;lt;td &amp;gt;&amp;lt;/td&amp;gt;";&lt;br /&gt;            else&lt;br /&gt;                $result .= "&amp;lt;td &amp;gt;{$row-&amp;gt;$key}&amp;lt;/td&amp;gt;";&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        $result = "&amp;lt;tr&amp;gt; {$result} &amp;lt;/tr&amp;gt;";&lt;br /&gt;&lt;br /&gt;        return $result;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _proc_column()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;_proc_row($this-&amp;gt;column_obj);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _proc_item()&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        $result = "";&lt;br /&gt;        foreach($this-&amp;gt;item_arr as $item)&lt;br /&gt;        {&lt;br /&gt;            $result .= $this-&amp;gt;_proc_row($item);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return $result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function insert_column($key, $text)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;column_obj-&amp;gt;$key = $text;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function insert_item($row)&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        $obj = $this-&amp;gt;_arr2obj($row);&lt;br /&gt;        $this-&amp;gt;item_arr[] = $obj;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function add_param($key, $value)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;param[$key] = $value;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function outHtml()&lt;br /&gt;    {&lt;br /&gt;        $result = "";&lt;br /&gt;        &lt;br /&gt;        $result .= $this-&amp;gt;_pre_html();&lt;br /&gt;&lt;br /&gt;        $result .= $this-&amp;gt;_proc_column();&lt;br /&gt;&lt;br /&gt;        $result .= $this-&amp;gt;_proc_item();&lt;br /&gt;&lt;br /&gt;        $result .= $this-&amp;gt;_after_html();&lt;br /&gt;&lt;br /&gt;        return $result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-302293308870979032?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/302293308870979032/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2011/05/cwebgrid.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/302293308870979032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/302293308870979032'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2011/05/cwebgrid.html' title='cweb_grid'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-7564568915679778552</id><published>2011-05-18T21:39:00.001-07:00</published><updated>2011-05-18T21:39:08.650-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>cweb_link</title><content type='html'>&lt;pre class="brush: cpp;"&gt;class cweb_link&lt;br /&gt;{&lt;br /&gt;    var $id;&lt;br /&gt;    var $url;&lt;br /&gt;    var $text;&lt;br /&gt;    var $display;&lt;br /&gt;    function cweb_link($id = "")&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;id = $id;&lt;br /&gt;        $this-&amp;gt;url = null;&lt;br /&gt;        $this-&amp;gt;text = null;&lt;br /&gt;        $this-&amp;gt;display = null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function insert($url=null,$text=null,$display=true)&lt;br /&gt;    {&lt;br /&gt;        if($url == null || $text == null)&lt;br /&gt;            return;&lt;br /&gt;        $this-&amp;gt;url = $url;&lt;br /&gt;        $this-&amp;gt;text = $text;&lt;br /&gt;        $this-&amp;gt;display = $display;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function outHtml()&lt;br /&gt;    {&lt;br /&gt;        if($this-&amp;gt;display==false)&lt;br /&gt;            return "";&lt;br /&gt;&lt;br /&gt;        $html = "&amp;lt;a id='{$this-&amp;gt;id}' href='{$this-&amp;gt;url}'&amp;gt;{$this-&amp;gt;text}&amp;lt;/a&amp;gt;";&lt;br /&gt;        if($this-&amp;gt;id == "")&lt;br /&gt;            $html = "&amp;lt;a href='{$this-&amp;gt;url}'&amp;gt;{$this-&amp;gt;text}&amp;lt;/a&amp;gt;";&lt;br /&gt;        &lt;br /&gt;        return $html;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-7564568915679778552?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/7564568915679778552/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2011/05/cweblink.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7564568915679778552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7564568915679778552'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2011/05/cweblink.html' title='cweb_link'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-5765832225572426502</id><published>2011-05-17T04:11:00.000-07:00</published><updated>2011-05-17T04:11:36.743-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>cweb_select</title><content type='html'>&lt;pre class="brush: cpp;"&gt;&lt;br /&gt;class cweb_select {&lt;br /&gt;    //put your code here&lt;br /&gt;&lt;br /&gt;    var $name;&lt;br /&gt;    var $option;&lt;br /&gt;    var $selected;&lt;br /&gt;&lt;br /&gt;    function cweb_select($name = "")&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;option = array();&lt;br /&gt;        $this-&amp;gt;selected = null;&lt;br /&gt;        $this-&amp;gt;name = $name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function insert($row /*array or object*/ )&lt;br /&gt;    {&lt;br /&gt;        foreach ($row as $key =&amp;gt; $value )&lt;br /&gt;        {&lt;br /&gt;            $this-&amp;gt;insertItem($key, $value);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function insert_only_value($row /*array or object*/ )&lt;br /&gt;    {&lt;br /&gt;        foreach ($row as $value )&lt;br /&gt;        {&lt;br /&gt;            $this-&amp;gt;insertItem($value, $value);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function insertItem($value , $text)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;option[$value] = $text;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function selected($value)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;selected = $value;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function getText($value)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;option[$value];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function outHtml()&lt;br /&gt;    {&lt;br /&gt;        $result = "";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        foreach( $this-&amp;gt;option as $value =&amp;gt; $text )&lt;br /&gt;        {&lt;br /&gt;            $selected = "";&lt;br /&gt;            if( $this-&amp;gt;selected == $value)&lt;br /&gt;                $selected = " selected";&lt;br /&gt;&lt;br /&gt;            $result .= "&amp;lt;option value='{$value}'{$selected}&amp;gt;{$text}&amp;lt;/option&amp;gt;";&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        $result = "&amp;lt;select name='{$this-&amp;gt;name}' &amp;gt;{$result}&amp;lt;/select&amp;gt;";&lt;br /&gt;&lt;br /&gt;        return $result;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-5765832225572426502?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/5765832225572426502/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2011/05/cwebselect.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5765832225572426502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5765832225572426502'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2011/05/cwebselect.html' title='cweb_select'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-7867815139241251350</id><published>2010-05-31T00:41:00.000-07:00</published><updated>2010-05-31T00:41:21.030-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Non-Virtual Interface (NVI)</title><content type='html'>&lt;pre class="brush: cpp;"&gt;class IuGUI : public IuUnknown&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    void OnDraw(HDC hDC)&lt;br /&gt;    {&lt;br /&gt;        this-&amp;gt;OnOwnerDraw(hDC);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    virtual void OnOwnerDraw(HDC hDC) = 0;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush: cpp;"&gt;class CuGUI :&lt;br /&gt;    public IuGUI&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    CuGUI(void);&lt;br /&gt;    ~CuGUI(void);&lt;br /&gt;&lt;br /&gt;    virtual ULONG Release() &lt;br /&gt;    { &lt;br /&gt;        delete this;&lt;br /&gt;        return 0;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    virtual void OnOwnerDraw(HDC hDC);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-7867815139241251350?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/7867815139241251350/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/non-virtual-interface-nvi.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7867815139241251350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7867815139241251350'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/non-virtual-interface-nvi.html' title='Non-Virtual Interface (NVI)'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-7051569997895781609</id><published>2010-05-24T19:55:00.000-07:00</published><updated>2010-05-24T19:56:50.713-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>how to using CriticalSection</title><content type='html'>&lt;pre class="brush: cpp;"&gt;struct CParam&lt;br /&gt;{&lt;br /&gt;    BOOL bActive;&lt;br /&gt;    int nCount;&lt;br /&gt;    CCriticalSection CriticalSection;&lt;br /&gt;&lt;br /&gt;    CParam();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;CParam::CParam()&lt;br /&gt;:bActive(TRUE)&lt;br /&gt;,nCount(0)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush: cpp;"&gt;DWORD WINAPI MyThread(LPVOID lpParameter)&lt;br /&gt;{&lt;br /&gt;    CParam *pParam;&lt;br /&gt;    pParam = (CParam*)lpParameter;&lt;br /&gt;    pParam-&amp;gt;bActive = TRUE;&lt;br /&gt;&lt;br /&gt;    while(1)&lt;br /&gt;    {&lt;br /&gt;        pParam-&amp;gt;CriticalSection.Enter();&lt;br /&gt;        ++pParam-&amp;gt;nCount;&lt;br /&gt;        pParam-&amp;gt;CriticalSection.Leave();&lt;br /&gt;        Sleep(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    pParam-&amp;gt;bActive = FALSE;&lt;br /&gt;&lt;br /&gt;    ExitThread(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void InitThread()&lt;br /&gt;{&lt;br /&gt;    HANDLE hThread;&lt;br /&gt;    DWORD ThreadId;&lt;br /&gt;&lt;br /&gt;    CParam param;&lt;br /&gt;    hThread = CreateThread(NULL, 0, &lt;br /&gt;        (LPTHREAD_START_ROUTINE)MyThread, (void*)&amp;param, 0, &amp;ThreadId);&lt;br /&gt;&lt;br /&gt;    while(param.bActive == TRUE)&lt;br /&gt;    {&lt;br /&gt;        param.CriticalSection.Enter();&lt;br /&gt;        Sleep(100);&lt;br /&gt;        cout &lt;&lt; param.nCount &lt;&lt; "\n";&lt;br /&gt;        param.CriticalSection.Leave();&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    CloseHandle(hThread);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int _tmain(int argc, _TCHAR* argv[])&lt;br /&gt;{&lt;br /&gt;    InitThread();&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-7051569997895781609?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/7051569997895781609/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/how-to-using-criticalsection.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7051569997895781609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7051569997895781609'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/how-to-using-criticalsection.html' title='how to using CriticalSection'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-7895962519329835945</id><published>2010-05-24T01:07:00.000-07:00</published><updated>2010-05-24T01:07:34.951-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>define SaveToSQL  interface</title><content type='html'>&lt;pre class="brush: php;"&gt;&lt;br /&gt;class ISaveToSQL {&lt;br /&gt;    function GetField()&lt;br /&gt;    {&lt;br /&gt;        echo "hi... go back to study PHP 3 year!";&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: php;"&gt;class cucustom extends ISaveToSQL{&lt;br /&gt;    ....&lt;br /&gt;&lt;br /&gt;    function GetField()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;field["name"] = $this-&amp;gt;name;&lt;br /&gt;        $this-&amp;gt;field["tel"] = $this-&amp;gt;tel;&lt;br /&gt;        $this-&amp;gt;field["address"] = $this-&amp;gt;address;&lt;br /&gt;&lt;br /&gt;        return $this-&amp;gt;field;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: php;"&gt;class CuModelSave extends model&lt;br /&gt;{&lt;br /&gt;    function insertSaveToSQL(/*ISaveToSQL*/ $ISaveToSQL)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;insert($this-&amp;gt;table_name, $ISaveToSQL-&amp;gt;GetField());&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: php;"&gt;&lt;br /&gt;class custom_sql extends CuModelSave{&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-7895962519329835945?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/7895962519329835945/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/define-savetosql-interface.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7895962519329835945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7895962519329835945'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/define-savetosql-interface.html' title='define SaveToSQL  interface'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2588761293163332642</id><published>2010-05-16T18:43:00.000-07:00</published><updated>2010-05-16T18:52:46.963-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>Prototype Pattern -- Load User Define Library</title><content type='html'>&lt;pre class="brush: php;"&gt;function testUnit_CreateCustom()&lt;br /&gt;    {&lt;br /&gt;        $Custom = $this-&amp;gt;cucustom-&amp;gt;MyClone();&lt;br /&gt;        echo $this-&amp;gt;unit-&amp;gt;run($Custom != NULL, "is_TRUE", "Create Custom");&lt;br /&gt;        &lt;br /&gt;        if( $Custom == NULL )&lt;br /&gt;            return;&lt;br /&gt;        &lt;br /&gt;        $Custom-&amp;gt;Init("Eric", "1234567", "高興路");&lt;br /&gt;        echo $this-&amp;gt;unit-&amp;gt;run($Custom-&amp;gt;name, "Eric", "name");&lt;br /&gt;        echo $this-&amp;gt;unit-&amp;gt;run($Custom-&amp;gt;tel, "1234567", "tel");&lt;br /&gt;        echo $this-&amp;gt;unit-&amp;gt;run($Custom-&amp;gt;address, "高興路", "address");&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush: php;"&gt;class cucustom {&lt;br /&gt;&lt;br /&gt;    var $name;&lt;br /&gt;    var $tel;&lt;br /&gt;    var $address;&lt;br /&gt;&lt;br /&gt;    function cucustom($name = "", $tel = "", $address = "")&lt;br /&gt;    {&lt;br /&gt;        $this-&gt;Init($name, $tel, $address);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function MyClone()&lt;br /&gt;    {&lt;br /&gt;        return new cucustom;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function Init($name = "", $tel = "", $address = "")&lt;br /&gt;    {&lt;br /&gt;        $this-&gt;name = $name;&lt;br /&gt;        $this-&gt;tel = $tel;&lt;br /&gt;        $this-&gt;address = $address;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2588761293163332642?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2588761293163332642/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/prototype-pattern-load-user-define.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2588761293163332642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2588761293163332642'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/prototype-pattern-load-user-define.html' title='Prototype Pattern -- Load User Define Library'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2802492065026643060</id><published>2010-05-12T22:09:00.000-07:00</published><updated>2010-06-01T20:17:15.377-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Create General Object From DLL.</title><content type='html'>// the GUI is a GUI.DLL &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: cpp;"&gt;// GUI.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;typedef IuGUI* (*LPFN_CREATEGUI)(void);&lt;br /&gt;&lt;br /&gt;GUI_API IuGUI* CreateObject(void);&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: cpp;"&gt;GUI_API IuGUI* CreateObject(void)&lt;br /&gt;{&lt;br /&gt;    return new CuGUI;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: cpp;"&gt;// CuGUI&lt;br /&gt;&lt;br /&gt;class CuGUI :&lt;br /&gt;    public IuGUI&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    CuGUI(void);&lt;br /&gt;    ~CuGUI(void);&lt;br /&gt;&lt;br /&gt;     virtual ULONG Release() &lt;br /&gt;     { &lt;br /&gt;        delete this;&lt;br /&gt;        return 0;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;    virtual void OnDraw(HDC hDC);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: cpp;"&gt;// CGUILoadTest&lt;br /&gt;&lt;br /&gt;void CGUILoadTest::testDllCreateObject(void)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    LPFN_CREATEGUI lpfnCreateGUI = NULL;&lt;br /&gt;&lt;br /&gt;    CuDllManager dllGUI;&lt;br /&gt;    BOOL bResult = dllGUI.LoadLibrary(TEXT("GUI.dll"));&lt;br /&gt;    CPPUNIT_ASSERT( bResult != NULL );&lt;br /&gt;&lt;br /&gt;    lpfnCreateGUI = (LPFN_CREATEGUI)dllGUI.GetProcAddress(("CreateObject"));&lt;br /&gt;    CPPUNIT_ASSERT( lpfnCreateGUI != NULL );&lt;br /&gt;&lt;br /&gt;    IuGUI *pIuGUI = NULL;&lt;br /&gt;&lt;br /&gt;    if( lpfnCreateGUI != NULL )&lt;br /&gt;        pIuGUI = lpfnCreateGUI();&lt;br /&gt;&lt;br /&gt;    CPPUNIT_ASSERT( pIuGUI != NULL );&lt;br /&gt;&lt;br /&gt;    if( pIuGUI != NULL )&lt;br /&gt;        pIuGUI-&amp;gt;Release();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2802492065026643060?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2802492065026643060/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/create-general-object-from-dll.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2802492065026643060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2802492065026643060'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/create-general-object-from-dll.html' title='Create General Object From DLL.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-255646985301305889</id><published>2010-05-02T16:20:00.000-07:00</published><updated>2010-05-02T16:20:10.279-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>filedrive - file upload download</title><content type='html'>&lt;pre class="brush: php;"&gt;&lt;br /&gt;class filedrive extends controller{&lt;br /&gt;&lt;br /&gt;    function filedrive()&lt;br /&gt;    {&lt;br /&gt;        parent::controller();&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;model('filedrive_model','FileDrive',true);&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;library("cudownload");&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;library("cuupload");&lt;br /&gt;        $this-&amp;gt;culogin-&amp;gt;onlogin();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function index($id="")&lt;br /&gt;    {&lt;br /&gt;        $data["downloadlist"] = "";&lt;br /&gt;        if (empty($id))&lt;br /&gt;                $query = $this-&amp;gt;FileDrive-&amp;gt;file_query();&lt;br /&gt;        else&lt;br /&gt;                $query = $this-&amp;gt;FileDrive-&amp;gt;tags_like($id);&lt;br /&gt;&lt;br /&gt;        foreach($query-&amp;gt;result() as $row){&lt;br /&gt;                $filelist["row"] = $row;&lt;br /&gt;                $data["downloadlist"] .= $this-&amp;gt;load-&amp;gt;view("downloadlist",$filelist,true);&lt;br /&gt;        }&lt;br /&gt;        $dnTable = $this-&amp;gt;load-&amp;gt;view("downloadtable",$data,true);&lt;br /&gt;        $viewData["body"] = $dnTable;&lt;br /&gt;        $this-&amp;gt;_MainFrame($viewData);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function upload_form(){&lt;br /&gt;        $tags = $this-&amp;gt;FileDrive-&amp;gt;get_tags();&lt;br /&gt;        $upForm = array("error"=&amp;gt;"");&lt;br /&gt;        $upForm["active_url"] = "filedrive/upload";&lt;br /&gt;        $upLoadform = $this-&amp;gt;cuciload-&amp;gt;view("upload_form",$upForm,true);&lt;br /&gt;        $tags = $this-&amp;gt;cuciload-&amp;gt;view("tags",array("tags"=&amp;gt;$tags,),true);&lt;br /&gt;        $backpage = $this-&amp;gt;cuciload-&amp;gt;view("backpage",array("goback" =&amp;gt; "filedrive"),true);&lt;br /&gt;        $viewData["body"] = $backpage.$upLoadform.$tags;&lt;br /&gt;        $this-&amp;gt;_MainFrame($viewData);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function update_form($id){&lt;br /&gt;        $data["row"] = $this-&amp;gt;FileDrive-&amp;gt;select_file($id);&lt;br /&gt;        $viewData["body"] = $this-&amp;gt;load-&amp;gt;view("update_form",$data,true).$this-&amp;gt;file_tags();&lt;br /&gt;        $this-&amp;gt;_MainFrame($viewData);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function delete_form($id){&lt;br /&gt;        $data["row"] = $this-&amp;gt;FileDrive-&amp;gt;select_file($id);&lt;br /&gt;        $viewData["body"] = $this-&amp;gt;load-&amp;gt;view("delete_form",$data,true);&lt;br /&gt;        $this-&amp;gt;_MainFrame($viewData);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function file_tags(){&lt;br /&gt;        $tags = $this-&amp;gt;FileDrive-&amp;gt;get_tags();&lt;br /&gt;        return $this-&amp;gt;cuciload-&amp;gt;view("tags",array("tags"=&amp;gt;$tags,),true);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function update($id){&lt;br /&gt;        $this-&amp;gt;FileDrive-&amp;gt;update($id);&lt;br /&gt;        redirect("filedrive","location");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function delete($id){&lt;br /&gt;        $row = $this-&amp;gt;FileDrive-&amp;gt;select_file($id);&lt;br /&gt;        $this-&amp;gt;FileDrive-&amp;gt;delete_file($id);&lt;br /&gt;        unlink("./uploads/".$row-&amp;gt;file_name.$row-&amp;gt;file_ext);&lt;br /&gt;        redirect("filedrive","location");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    function IsUpload($result){&lt;br /&gt;        $data = $this-&amp;gt;upload-&amp;gt;data();&lt;br /&gt;        $data["true_name"] = $result["true_name"];&lt;br /&gt;        $data["file_date"] = date("Y-m-d");&lt;br /&gt;        $data["file_time"] = date("H:i:s");&lt;br /&gt;        $data["file_tag"] = $this-&amp;gt;FileDrive-&amp;gt;write_sql($data);&lt;br /&gt;        $data["is_img"]= lang("NO")."&amp;lt;/li&amp;gt;";&lt;br /&gt;        if($data["is_image"])&lt;br /&gt;        {&lt;br /&gt;            $data["is_img"] = $this-&amp;gt;load-&amp;gt;view("is_image",$data,true);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return $data;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function Upload()&lt;br /&gt;    {&lt;br /&gt;        if ( empty($_FILES["userfile"]["name"]) )&lt;br /&gt;                redirect("filedrive/upload_form", "location");&lt;br /&gt;        $result = $this-&amp;gt;FileDrive-&amp;gt;filename();&lt;br /&gt;&lt;br /&gt;        $this-&amp;gt;cuupload-&amp;gt;InitUploadLib_($result["file_name"]);&lt;br /&gt;&lt;br /&gt;        if ( ! $this-&amp;gt;upload-&amp;gt;do_upload())&lt;br /&gt;        {&lt;br /&gt;            $data["body"] = $this-&amp;gt;upload-&amp;gt;display_errors()."&amp;lt;br&amp;gt;".anchor("filedrive","return file upload!");&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            $susess_data = $this-&amp;gt;IsUpload($result);&lt;br /&gt;            redirect("filedrive","location");&lt;br /&gt;        }&lt;br /&gt;        $this-&amp;gt;_MainFrame($data);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _MainFrame($frame)&lt;br /&gt;    {&lt;br /&gt;        $data = $this-&amp;gt;_Tag_List();&lt;br /&gt;        $frame["leftmenu"] = $this-&amp;gt;load-&amp;gt;view("leftmenu",$data,true);&lt;br /&gt;        $frame["submenu"] = $this-&amp;gt;load-&amp;gt;view("submenu","",true);&lt;br /&gt;        $this-&amp;gt;csmainframe-&amp;gt;view($frame);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _Tag_List(){&lt;br /&gt;        $tags = array();&lt;br /&gt;        $query =$this-&amp;gt;FileDrive-&amp;gt;get_tags();&lt;br /&gt;&lt;br /&gt;        foreach($query-&amp;gt;result() as $row){&lt;br /&gt;                $number = $this-&amp;gt;FileDrive-&amp;gt;count_tags_like($row-&amp;gt;id);&lt;br /&gt;                $tags[] = anchor("filedrive/index/".$row-&amp;gt;id, $row-&amp;gt;tags . " ( ".$number ." ) ");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        $query_all = $this-&amp;gt;FileDrive-&amp;gt;tags_like("");&lt;br /&gt;        $data["all_num"] = $query_all-&amp;gt;num_rows();&lt;br /&gt;&lt;br /&gt;        $notags_num = $this-&amp;gt;FileDrive-&amp;gt;tags_like("null");&lt;br /&gt;        $data["notags_num"] = $notags_num-&amp;gt;num_rows();&lt;br /&gt;        $data["tag"] = $tags;&lt;br /&gt;        return $data;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function download($id){&lt;br /&gt;        $result = $this-&amp;gt;FileDrive-&amp;gt;download($id);&lt;br /&gt;        $this-&amp;gt;cudownload-&amp;gt;DownLoadEx($result, "./uploads/");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-255646985301305889?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/255646985301305889/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/filedrive-file-upload-download.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/255646985301305889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/255646985301305889'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/05/filedrive-file-upload-download.html' title='filedrive - file upload download'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-5529952955203468645</id><published>2010-04-22T16:16:00.001-07:00</published><updated>2010-04-22T16:16:31.191-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>login extends controller</title><content type='html'>&lt;pre class="brush: php;"&gt;class login extends controller{&lt;br /&gt;&lt;br /&gt;    function login()&lt;br /&gt;    {&lt;br /&gt;        parent::controller();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function index()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;view("login");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function chklogin()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;culogin-&amp;gt;login($_POST["account"],$_POST["password"]);&lt;br /&gt;        $this-&amp;gt;culogin-&amp;gt;islogin();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function logout(){&lt;br /&gt;        $this-&amp;gt;session-&amp;gt;unset_userdata("login");&lt;br /&gt;        redirect("main","location");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-5529952955203468645?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/5529952955203468645/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/04/login-extends-controller.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5529952955203468645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5529952955203468645'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/04/login-extends-controller.html' title='login extends controller'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-274397829335319833</id><published>2010-04-21T17:50:00.001-07:00</published><updated>2010-04-21T17:50:53.588-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>CuLogin  -- Login base on CodeIgniter Library</title><content type='html'>&lt;pre class="brush: php;"&gt;&lt;br /&gt;class CuLogin {&lt;br /&gt;&lt;br /&gt;    function CuLogin()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;Login_Information();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function Login_Information(){&lt;br /&gt;        $this-&amp;gt;login_account = "useric";&lt;br /&gt;        $this-&amp;gt;login_password = "password";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function chk_login($account,$password){&lt;br /&gt;        if (($account == $this-&amp;gt;login_account) &amp;&amp; ($password == $this-&amp;gt;login_password))&lt;br /&gt;            return true;&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function login($account = "",$password = ""){&lt;br /&gt;        $CI = &amp;get_instance();&lt;br /&gt;        $CI-&amp;gt;session-&amp;gt;set_userdata("login",$this-&amp;gt;chk_login($account,$password));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function islogin(){&lt;br /&gt;        $CI = &amp;get_instance();&lt;br /&gt;        if ($CI-&amp;gt;session-&amp;gt;userdata("login"))&lt;br /&gt;            redirect("bulletin","location");&lt;br /&gt;        redirect("login","location");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function onlogin(){&lt;br /&gt;        $CI = &amp;get_instance();&lt;br /&gt;        if (!$CI-&amp;gt;session-&amp;gt;userdata("login"))&lt;br /&gt;            redirect("main","location");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-274397829335319833?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/274397829335319833/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/04/culogin-login-base-on-codeigniter.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/274397829335319833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/274397829335319833'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/04/culogin-login-base-on-codeigniter.html' title='CuLogin  -- Login base on CodeIgniter Library'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-829242873576884749</id><published>2010-04-16T00:06:00.000-07:00</published><updated>2010-04-16T00:46:46.276-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>weblink -- view</title><content type='html'># delete_form.php&lt;br /&gt;&lt;pre class="brush: html;"&gt;&amp;lt;a href="javascript:history.go(-1)"&amp;gt;&amp;lt;?=lang("BACK")?&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;?=anchor("weblink/delete_link/".$row-&amp;gt;id,lang("DELETE"))?&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;?=lang("LINK").lang("DESCRIPTION")?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;?=$row-&amp;gt;link_des?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;?=lang("LINK").lang("WEB")?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;http://&amp;lt;?=$row-&amp;gt;weblink?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;# edit_form.php&lt;br /&gt;&lt;pre class="brush: html;"&gt;&amp;lt;?=form_open("weblink/{$action}")?&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;?=lang("LINK").lang("DESCRIPTION")?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;input type="text" name="link_des" size="40" maxlength="64" value="&amp;lt;?=$row-&amp;gt;link_des?&amp;gt;" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;?=lang("LINK").lang("WEB")?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;http://&amp;lt;input type="text" name="weblink" size="40" maxlength="256" value="&amp;lt;?=$row-&amp;gt;weblink?&amp;gt;" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td colspan="2" align="center"&amp;gt;&amp;lt;input type="submit" value="&amp;lt;?=lang("SUBMIT")?&amp;gt;"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;# showlink.php&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html;"&gt;&amp;lt;table border="1"&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td width="150"&amp;gt;&amp;lt;?=lang("LINK").lang("DESCRIPTION")?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td width="250"&amp;gt;&amp;lt;?=lang("LINK").lang("WEB")?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td width="50"&amp;gt;&amp;lt;?=lang("EDIT")?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;?php foreach($query-&amp;gt;result() as $row):?&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;?=anchor_popup("http://".$row-&amp;gt;weblink,$row-&amp;gt;link_des,$atts)?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;http://&amp;lt;?=$row-&amp;gt;weblink?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;?=anchor("weblink/edit_form/".$row-&amp;gt;id,lang("EDIT"))?&amp;gt; &amp;lt;?=anchor("weblink/delete_form/".$row-&amp;gt;id,lang("DELETE"))?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;?php endforeach;?&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;# submenu.php&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html;"&gt;&amp;lt;table border="0"&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;?=anchor("weblink",lang("VIEW").lang("LINK"))?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;?=anchor("weblink/insert_link_form",lang("INSERT").lang("LINK"))?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-829242873576884749?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/829242873576884749/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/04/weblink-view.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/829242873576884749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/829242873576884749'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/04/weblink-view.html' title='weblink -- view'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-9003251706139124613</id><published>2010-04-15T00:57:00.000-07:00</published><updated>2010-04-15T00:57:12.001-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>weblink_sql -- model</title><content type='html'>&lt;pre class="brush: php;"&gt;&lt;br /&gt;class weblink_sql extends model{&lt;br /&gt;&lt;br /&gt;    function weblink_sql()&lt;br /&gt;    {&lt;br /&gt;        parent::model();&lt;br /&gt;        $database_table = $this-&gt;config-&gt;item("database_table_name");&lt;br /&gt;        $this-&gt;table_name = $database_table."weblink";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function load_post()&lt;br /&gt;    {&lt;br /&gt;        return array(&lt;br /&gt;            "link_des" =&gt; $_POST["link_des"],&lt;br /&gt;            "weblink" =&gt; $_POST["weblink"]&lt;br /&gt;        );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function select($id = ""){&lt;br /&gt;        if($id != "")&lt;br /&gt;            return $this-&gt;db-&gt;get_where($this-&gt;table_name,array("id"=&gt;$id));&lt;br /&gt;        $this-&gt;db-&gt;order_by("id","desc");&lt;br /&gt;        return $this-&gt;db-&gt;get($this-&gt;table_name);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function insert()&lt;br /&gt;    {&lt;br /&gt;        $this-&gt;db-&gt;insert($this-&gt;table_name,$this-&gt;load_post());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function update($id)&lt;br /&gt;    {&lt;br /&gt;        $this-&gt;db-&gt;where("id",$id);&lt;br /&gt;        $this-&gt;db-&gt;update($this-&gt;table_name,$this-&gt;load_post());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function delete($id){&lt;br /&gt;        $this-&gt;db-&gt;where("id",$id);&lt;br /&gt;        $this-&gt;db-&gt;delete($this-&gt;table_name);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-9003251706139124613?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/9003251706139124613/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/04/weblinksql-model.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/9003251706139124613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/9003251706139124613'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/04/weblinksql-model.html' title='weblink_sql -- model'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-5421800518849887909</id><published>2010-04-12T01:00:00.001-07:00</published><updated>2010-04-12T01:04:47.983-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>weblink - modify web link</title><content type='html'>&lt;pre class="brush: php;"&gt;class weblink extends controller{&lt;br /&gt;&lt;br /&gt;    function weblink()&lt;br /&gt;    {&lt;br /&gt;        parent::controller();&lt;br /&gt;        $this-&gt;culogin-&gt;onlogin();&lt;br /&gt;        $this-&gt;load-&gt;model("weblink_sql","WLINK",TRUE);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function index()&lt;br /&gt;    {&lt;br /&gt;        $data["atts"] = array("width" =&gt; "1024");&lt;br /&gt;        $data["query"] = $this-&gt;WLINK-&gt;select();&lt;br /&gt;        $frame["body"] = $this-&gt;load-&gt;view("showlink",$data,TRUE);&lt;br /&gt;        $this-&gt;_MainFrame($frame);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function insert_link_form(){&lt;br /&gt;        $data["row"] = array();&lt;br /&gt;        $data["action"] = "insert_link";&lt;br /&gt;        $frame["body"] = $this-&gt;load-&gt;view("edit_form",$data,TRUE);&lt;br /&gt;        $this-&gt;_MainFrame($frame);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function edit_form($id){&lt;br /&gt;        $query = $this-&gt;WLINK-&gt;select($id);&lt;br /&gt;        $data["action"] = "update_link/".$id;&lt;br /&gt;        $data["row"] = $query-&gt;row();&lt;br /&gt;        $frame["body"] = $this-&gt;load-&gt;view("edit_form",$data,TRUE);&lt;br /&gt;        $this-&gt;_MainFrame($frame);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function delete_form($id){&lt;br /&gt;        $query = $this-&gt;WLINK-&gt;select($id);&lt;br /&gt;        $data["row"] = $query-&gt;row();&lt;br /&gt;        $frame["body"] = $this-&gt;load-&gt;view("delete_form",$data,TRUE);&lt;br /&gt;        $this-&gt;_MainFrame($frame);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function insert_link(){&lt;br /&gt;        $this-&gt;WLINK-&gt;insert();&lt;br /&gt;        $this-&gt;_Redirect();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function update_link($id){&lt;br /&gt;        $this-&gt;WLINK-&gt;update($id);&lt;br /&gt;        $this-&gt;_Redirect();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function delete_link($id){&lt;br /&gt;        $this-&gt;WLINK-&gt;delete($id);&lt;br /&gt;        $this-&gt;_Redirect();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _Redirect(){&lt;br /&gt;        redirect("weblink","location");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function _MainFrame($frame = ""){&lt;br /&gt;        $frame["submenu"] = $this-&gt;load-&gt;view("submenu","",TRUE);&lt;br /&gt;        $frame["leftmenu"] ="";&lt;br /&gt;        $this-&gt;cuciload-&gt;view("mainframework",$frame);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-5421800518849887909?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/5421800518849887909/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/04/blog-post.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5421800518849887909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5421800518849887909'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/04/blog-post.html' title='weblink - modify web link'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-1383345500892683017</id><published>2010-02-24T15:00:00.000-08:00</published><updated>2010-02-24T15:00:02.637-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SampleCode'/><title type='text'>CuGLES</title><content type='html'>&lt;pre class="brush: cpp;"&gt;&lt;br /&gt;class CuGLES : public CuEGL  &lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    void Ortho(double left, double right, double bottom, double top, double Near, double Far);&lt;br /&gt;    void Frustum( double fovy, double aspect, double zNear, double zFar );&lt;br /&gt;    void Viewport(int x, int y, int width, int height);&lt;br /&gt;#if 0&lt;br /&gt;    void DrawArrays(const void *pvlist, const void *pnvlist, const void *ptclist,int stride, int numvertices);&lt;br /&gt;    void DrawElements(const void *pvlist, const void *pnvlist, const void *ptclist,int stride, int numvertices,&lt;br /&gt;        const void *pfaceindex, int numfaceindex);&lt;br /&gt;#endif&lt;br /&gt;    &lt;br /&gt;    CuGLES();&lt;br /&gt;    virtual ~CuGLES();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush: cpp;"&gt;&lt;br /&gt;&lt;br /&gt;CuGLES::CuGLES()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuGLES::~CuGLES()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#if 0&lt;br /&gt;void CuGLES::DrawArrays(const void *pvlist, const void *pnvlist, const void *ptclist, int stride, int numvertices)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    glTexCoordPointer(2, GL_FIXED, stride, ptclist);&lt;br /&gt;    // setup client states&lt;br /&gt;    glEnableClientState(GL_TEXTURE_COORD_ARRAY);    // setup arrays&lt;br /&gt;    // first the vertices&lt;br /&gt;    glVertexPointer(3, GL_FIXED , stride, pvlist);&lt;br /&gt;    glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // next the normals&lt;br /&gt;//  glNormalPointer(GL_SHORT, stride, pnvlist);&lt;br /&gt;    glNormalPointer(GL_FIXED , stride, pnvlist);&lt;br /&gt;    glEnableClientState(GL_NORMAL_ARRAY);&lt;br /&gt;&lt;br /&gt;    glDrawArrays(GL_TRIANGLES , 0, numvertices);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    glDisableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;    glDisableClientState(GL_NORMAL_ARRAY);&lt;br /&gt;    glDisableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuGLES::DrawElements(const void *pvlist, const void *pnvlist, const void *ptclist,int stride, int numvertices,&lt;br /&gt;    const void *pfaceindex, int numfaceindex)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    glTexCoordPointer(2, GL_FIXED, stride, ptclist);&lt;br /&gt;    // setup client states&lt;br /&gt;    glEnableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // setup arrays&lt;br /&gt;    // first the vertices&lt;br /&gt;    glVertexPointer(3, GL_FIXED , stride, pvlist);&lt;br /&gt;    glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // next the normals&lt;br /&gt;    glNormalPointer(GL_FIXED , stride, pnvlist);&lt;br /&gt;    glEnableClientState(GL_NORMAL_ARRAY);&lt;br /&gt;&lt;br /&gt;    glDrawElements(GL_TRIANGLES , numfaceindex, GL_UNSIGNED_BYTE , pfaceindex);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    glDisableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;    glDisableClientState(GL_NORMAL_ARRAY);&lt;br /&gt;    glDisableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;void CuGLES::Viewport(int x, int y, int width, int height)&lt;br /&gt;{&lt;br /&gt;    glViewport(x,y,width,height);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define PI_     3.14159265358979323846&lt;br /&gt;void CuGLES::Frustum(double fovy, double aspect, double zNear, double zFar)&lt;br /&gt;{&lt;br /&gt;    // 設定投影&lt;br /&gt;    glMatrixMode(GL_PROJECTION);&lt;br /&gt;    glLoadIdentity();&lt;br /&gt;&lt;br /&gt;    float right, left, top, bottom;&lt;br /&gt;    top = zNear * tan(fovy * PI_ / 180.0 / 2 );&lt;br /&gt;    bottom = -top;&lt;br /&gt;    right = top * aspect;&lt;br /&gt;    left = -right;&lt;br /&gt;&lt;br /&gt;    glFrustumx(EGL_FixedFromFloat(left), EGL_FixedFromFloat(right),&lt;br /&gt;        EGL_FixedFromFloat(bottom), EGL_FixedFromFloat(top),&lt;br /&gt;        EGL_FixedFromFloat(zNear), EGL_FixedFromFloat(zFar) );&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuGLES::Ortho(double left, double right, double bottom, double top, double Near, double Far)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    glMatrixMode(GL_PROJECTION);&lt;br /&gt;    glLoadIdentity();&lt;br /&gt;    glOrthox(&lt;br /&gt;        EGL_FixedFromFloat(left),&lt;br /&gt;        EGL_FixedFromFloat(right),&lt;br /&gt;        EGL_FixedFromFloat(bottom), &lt;br /&gt;        EGL_FixedFromFloat(top), &lt;br /&gt;        EGL_FixedFromFloat(Near), &lt;br /&gt;        EGL_FixedFromFloat(Far));&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;完全不了解為什麼要繼承, 想不起來.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-1383345500892683017?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/1383345500892683017/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cugles.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1383345500892683017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1383345500892683017'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cugles.html' title='CuGLES'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-657318809558718165</id><published>2010-02-23T15:00:00.000-08:00</published><updated>2010-02-23T15:00:03.192-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SampleCode'/><title type='text'>CuEGL</title><content type='html'>&lt;pre class="brush: cpp;"&gt;class CuEGL  &lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    int _red_size;&lt;br /&gt;    int _green_size;&lt;br /&gt;    int _bule_size;&lt;br /&gt;    int _alpha_size;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;    // &lt;br /&gt;    void SwapBuffers();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // 只要有呼叫 Init() 做初始化 就要呼叫 Exit() &lt;br /&gt;    // 在這裡 解構會自動呼叫&lt;br /&gt;    void Exit();&lt;br /&gt;&lt;br /&gt;    // 初始化 EGL&lt;br /&gt;    // Return:  1 有問題初始化失敗   0: 一切正常&lt;br /&gt;    bool Init(NativeWindowType hWnd);&lt;br /&gt;&lt;br /&gt;    CuEGL();&lt;br /&gt;    virtual ~CuEGL();&lt;br /&gt;&lt;br /&gt;    EGLDisplay  _eglDisplay;&lt;br /&gt;    EGLConfig   _eglConfig;&lt;br /&gt;    EGLSurface  _eglSurface;&lt;br /&gt;    EGLContext  _eglContext;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush: cpp;"&gt;CuEGL::CuEGL()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _eglDisplay = EGL_NO_DISPLAY;&lt;br /&gt;    _eglConfig;&lt;br /&gt;    _eglSurface = EGL_NO_SURFACE;&lt;br /&gt;    _eglContext = EGL_NO_CONTEXT;&lt;br /&gt;&lt;br /&gt;    _red_size = 5;&lt;br /&gt;    _green_size = 6;&lt;br /&gt;    _bule_size = 5;&lt;br /&gt;    _alpha_size = 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuEGL::~CuEGL()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if( _eglDisplay != EGL_NO_DISPLAY )&lt;br /&gt;        this-&amp;gt;Exit();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;bool CuEGL::Init(NativeWindowType hWnd)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    int buffer_size = _red_size + _green_size + _bule_size + _alpha_size;&lt;br /&gt;    EGLint  attrs[] = {&lt;br /&gt;        EGL_ALPHA_SIZE, _alpha_size,&lt;br /&gt;        EGL_RED_SIZE, _red_size,&lt;br /&gt;        EGL_GREEN_SIZE, _green_size,&lt;br /&gt;        EGL_BLUE_SIZE, _bule_size,&lt;br /&gt;        EGL_BUFFER_SIZE, buffer_size,&lt;br /&gt;        EGL_DEPTH_SIZE, 16,&lt;br /&gt;        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,&lt;br /&gt;        EGL_NONE};&lt;br /&gt;&lt;br /&gt;    EGLint  numConfig;&lt;br /&gt;    LONG        lRet = 1; &lt;br /&gt;&lt;br /&gt;    // NOTE: Theres a bunch of stuff we should be doing to release resources&lt;br /&gt;    //       in the case of failure that we're not bothering with atm&lt;br /&gt;&lt;br /&gt;    HDC hdc = GetWindowDC((HWND)hWnd);&lt;br /&gt;&lt;br /&gt;    // Get the display device&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    _eglDisplay = eglGetDisplay(hdc);&lt;br /&gt;&lt;br /&gt;    Assert( _eglDisplay != EGL_NO_DISPLAY, L"CuEGL::Init:\n _eglDisplay == EGL_NO_DISPLAY");&lt;br /&gt;&lt;br /&gt;    // Initialize the display&lt;br /&gt;    if (!eglInitialize(_eglDisplay, NULL, NULL))&lt;br /&gt;        {  &lt;br /&gt;            Assert(0, L"CuEGL::Init:\n can't Initialize egl");&lt;br /&gt;            return lRet;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    // Obtain the first configuration with a depth buffer&lt;br /&gt;    if (!eglChooseConfig(_eglDisplay, attrs, &amp;_eglConfig, 1, &amp;numConfig))&lt;br /&gt;        { &lt;br /&gt;            Assert(0, L"CuEGL::Init:\n can't ChooseConfig");&lt;br /&gt;            return lRet; &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    // Create a surface for the main window&lt;br /&gt;    _eglSurface = eglCreateWindowSurface(_eglDisplay, _eglConfig, (NativeWindowType)hWnd, NULL);&lt;br /&gt;    Assert( _eglSurface != EGL_NO_SURFACE, L"CuEGL::Init:\n _eglSurface == EGL_NO_SURFACE");&lt;br /&gt;&lt;br /&gt;    // Create an OpenGL ES context&lt;br /&gt;    _eglContext = eglCreateContext(_eglDisplay, _eglConfig, EGL_NO_CONTEXT, NULL);&lt;br /&gt;    Assert( _eglContext != EGL_NO_CONTEXT, L"CuEGL::Init:\n _eglContext == EGL_NO_CONTEXT");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // Make the context and surface current&lt;br /&gt;    if (!eglMakeCurrent(_eglDisplay, _eglSurface, _eglSurface, _eglContext))&lt;br /&gt;        {  &lt;br /&gt;            Assert(0, L"CuEGL::Init:\n can't MakeCurrent");&lt;br /&gt;            return lRet; &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuEGL::Exit()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    // Set the current context to nothing&lt;br /&gt;    eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);&lt;br /&gt;&lt;br /&gt;    // Free any EGL contexts; should be called per context created&lt;br /&gt;    eglDestroyContext(_eglDisplay, _eglContext);&lt;br /&gt;&lt;br /&gt;    // Free any EGL surfaces; should be called per surface created&lt;br /&gt;    eglDestroySurface(_eglDisplay, _eglSurface);&lt;br /&gt;&lt;br /&gt;    // Terminate any EGL displays; should be called per display initialized&lt;br /&gt;    eglTerminate(_eglDisplay); &lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuEGL::SwapBuffers()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    eglSwapBuffers(_eglDisplay, _eglSurface);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;好舊的碼了~ 如果有更新會在加上去&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-657318809558718165?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/657318809558718165/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuegl.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/657318809558718165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/657318809558718165'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuegl.html' title='CuEGL'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-6893493994258729070</id><published>2010-02-19T15:00:00.000-08:00</published><updated>2010-02-19T15:00:03.717-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuGPSDevice</title><content type='html'>&lt;pre class="brush: cpp;"&gt;class CuGPSDevice : public CuPort  &lt;br /&gt;{&lt;br /&gt;    CuFile m_LogFile;&lt;br /&gt;    CuFile m_CheckLogFile;&lt;br /&gt;    CuFile m_CheckErrorLogFile;&lt;br /&gt;    CuFile m_Error_Message_File;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    DWORD m_dReadDataBufferSize;&lt;br /&gt;    DWORD m_dReadDataBuffseIndex;&lt;br /&gt;    BYTE *m_pReadDataBuffer;&lt;br /&gt;&lt;br /&gt;    bool _writeFileCheck(CuFile &amp;File, void *pData, int nSize);&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    BOOL CheckReadData(BYTE* pReadData);&lt;br /&gt;    virtual void OnWrite(BYTE *pByte, int nSize);&lt;br /&gt;    virtual void OnRead(BYTE *pByte, int nSize);&lt;br /&gt;    CuGPSDevice();&lt;br /&gt;    virtual ~CuGPSDevice();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: cpp;"&gt;//&lt;br /&gt;&lt;br /&gt;CuGPSDevice::CuGPSDevice()&lt;br /&gt;:m_dReadDataBufferSize(1024)&lt;br /&gt;,m_dReadDataBuffseIndex(0)&lt;br /&gt;,m_pReadDataBuffer(NULL)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    m_pReadDataBuffer = new BYTE[m_dReadDataBufferSize];&lt;br /&gt;&lt;br /&gt;    CuModuleFile mf;&lt;br /&gt;    wstring strLogFile = mf.GetModuleFileName(L"GPS_Log.txt");&lt;br /&gt;    m_LogFile.Open(strLogFile, L"w");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    strLogFile = mf.GetModuleFileName(L"GPS_Check_Log.txt");&lt;br /&gt;    m_CheckLogFile.Open(strLogFile, L"w");&lt;br /&gt;&lt;br /&gt;    strLogFile = mf.GetModuleFileName(L"GPS_Check_Error_Log.txt");&lt;br /&gt;    m_CheckErrorLogFile.Open(strLogFile, L"w");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    strLogFile = mf.GetModuleFileName(L"GPS_Error_Message_Log.txt");&lt;br /&gt;    m_Error_Message_File.Open(strLogFile, L"w");&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuGPSDevice::~CuGPSDevice()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;void CuGPSDevice::OnWrite(BYTE *pByte, int nSize)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    unsigned char checksum = 0 ;&lt;br /&gt;    for(int i=0 ; i &amp;lt; nSize; i++)&lt;br /&gt;    {&lt;br /&gt;        checksum ^= pByte[i];&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    char strCheckSum[2];&lt;br /&gt;&lt;br /&gt;    sprintf( strCheckSum, "%x", checksum);&lt;br /&gt;    char pSendStr[2048];&lt;br /&gt;    memset(pSendStr, 0, 2048);&lt;br /&gt;&lt;br /&gt;    ::strcat(pSendStr, "$");&lt;br /&gt;    ::strcat(pSendStr, (char*)pByte);&lt;br /&gt;&lt;br /&gt;    ::strcat(pSendStr, "*");&lt;br /&gt;    ::strcat(pSendStr, strCheckSum);&lt;br /&gt;    ::strcat(pSendStr, "\x0d");&lt;br /&gt;    ::strcat(pSendStr, "\x0a");&lt;br /&gt;        &lt;br /&gt;    CuPort::OnWrite((BYTE*)pSendStr, strlen(pSendStr));&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuGPSDevice::OnRead(BYTE *pByte, int nSize)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    for( int i = 0 ; i &amp;lt; nSize ; i++ )&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;        if( pByte[i] == 0x0a )&lt;br /&gt;        {&lt;br /&gt;            m_pReadDataBuffer[m_dReadDataBuffseIndex++] = pByte[i];&lt;br /&gt;            if( CheckReadData( m_pReadDataBuffer) )&lt;br /&gt;                _writeFileCheck(m_CheckLogFile, (void*)m_pReadDataBuffer , m_dReadDataBuffseIndex);&lt;br /&gt;                m_CheckLogFile.Write(()m_pReadDataBuffer, m_dReadDataBuffseIndex);&lt;br /&gt;            else&lt;br /&gt;                _writeFileCheck(m_CheckErrorLogFile, (void*)m_pReadDataBuffer , m_dReadDataBuffseIndex);&lt;br /&gt;                m_CheckErrorLogFile.Write((void*)m_pReadDataBuffer, m_dReadDataBuffseIndex);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            memset(m_pReadDataBuffer, 0, m_dReadDataBuffseIndex);&lt;br /&gt;            m_dReadDataBuffseIndex = 0;&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        m_pReadDataBuffer[m_dReadDataBuffseIndex++] = pByte[i];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;        m_LogFile.Write((void*)pByte, nSize);&lt;br /&gt;        _writeFileCheck(m_LogFile, (void*)pByte , nSize);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuGPSDevice::CheckReadData(BYTE* pReadData)&lt;br /&gt;{&lt;br /&gt;    int nSize;&lt;br /&gt;    nSize = strlen((char*)pReadData);&lt;br /&gt;&lt;br /&gt;    unsigned char checksumtemp;&lt;br /&gt;&lt;br /&gt;    TCHAR checkstr[3];&lt;br /&gt;    checkstr[0] = pReadData[ nSize - 4 ];&lt;br /&gt;    checkstr[1] = pReadData[ nSize - 3 ];&lt;br /&gt;    checkstr[2] = 0;&lt;br /&gt;&lt;br /&gt;    swscanf(checkstr, L"%x", &amp;checksumtemp);&lt;br /&gt;&lt;br /&gt;    unsigned char checksum = 0 ;&lt;br /&gt;    checksum = 0;&lt;br /&gt;    for(int i=1 ; i &amp;lt; nSize - 5 ; i++)&lt;br /&gt;    {&lt;br /&gt;        checksum ^= pReadData[i];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return checksum == checksumtemp ? TRUE : FALSE;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool CuGPSDevice::_writeFileCheck(CuFile &amp;File, void *pData, int nSize)&lt;br /&gt;{&lt;br /&gt;    static int nWriteFileResult = 0;&lt;br /&gt;    nWriteFileResult = File.Write(pData, nSize);&lt;br /&gt;    &lt;br /&gt;    bool bResult = (nWriteFileResult == nSize);&lt;br /&gt;&lt;br /&gt;    if( !bResult )&lt;br /&gt;    {&lt;br /&gt;        MessageBox(NULL, L"WriteFileError", L"WriteFileError", MB_OK);&lt;br /&gt;        m_Error_Message_File.Write(pData, nSize);&lt;br /&gt;    }&lt;br /&gt;    return bResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-6893493994258729070?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/6893493994258729070/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cugpsdevice.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6893493994258729070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6893493994258729070'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cugpsdevice.html' title='CuGPSDevice'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-6803275593770474950</id><published>2010-02-18T15:00:00.000-08:00</published><updated>2010-02-18T15:00:00.687-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuImageLoaderBMP</title><content type='html'>&lt;pre class="brush: cpp;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;class CuImageLoaderBMP : public IuImageLoaderBMP  &lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuImageLoaderBMP();&lt;br /&gt;    virtual ~CuImageLoaderBMP();&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////&lt;br /&gt;    // IuUnknown 公開虛擬界面 &lt;br /&gt;    virtual ULONG Release();&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////&lt;br /&gt;    // IuImageLoader 公開虛擬界面 &lt;br /&gt;    virtual BOOL LoadFile(IuImageEx *pImageEx, LPCTSTR lpszResourceName);&lt;br /&gt;&lt;br /&gt;    enum BMPFORMAT { BMP1555, BMP565};&lt;br /&gt;&lt;br /&gt;    void SetBmpFormat(BMPFORMAT bmpFormat);&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&lt;br /&gt;    BOOL _Load565Bmp(BYTE * pbits);&lt;br /&gt;    BOOL _Load1555Bmp(BYTE * pbits);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//  BOOL _Load565Bmp16(BYTE * pbits);&lt;br /&gt;    BOOL _Load565Bmp24(BYTE * pbits);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    BOOL _Load1555Bmp24(BYTE * ptr);&lt;br /&gt;    BOOL _Load1555Bmp16(BYTE * ptr);&lt;br /&gt;    BOOL _Load1555Bmp8(BYTE * ptr);&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&lt;br /&gt;    IuImageEx *m_tempImageEx;&lt;br /&gt;&lt;br /&gt;    BMPFORMAT m_bmpFormat;&lt;br /&gt;    BITMAPFILEHEADER m_bmfh;&lt;br /&gt;    BITMAPINFOHEADER *m_pInfo;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuImageLoaderBMP::CuImageLoaderBMP()&lt;br /&gt;:m_bmpFormat(BMP1555)&lt;br /&gt;,m_pInfo(NULL)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuImageLoaderBMP::~CuImageLoaderBMP()&lt;br /&gt;{&lt;br /&gt;    delete [] m_pInfo;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ULONG CuImageLoaderBMP::Release()&lt;br /&gt;{&lt;br /&gt;    delete this;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuImageLoaderBMP::SetBmpFormat(BMPFORMAT bmpFormat)&lt;br /&gt;{&lt;br /&gt;    m_bmpFormat = bmpFormat;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BOOL CuImageLoaderBMP::LoadFile(IuImageEx *pImageEx, LPCTSTR lpszResourceName)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    delete [] m_pInfo;&lt;br /&gt;    m_pInfo = NULL;&lt;br /&gt;&lt;br /&gt;    m_tempImageEx = pImageEx;&lt;br /&gt;&lt;br /&gt;    // 需要 Bits 只支援 24 &amp; 16 BIT bmp 圖&lt;br /&gt;    /////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;//  BITMAPINFOHEADER *pInfo = NULL;&lt;br /&gt;    BYTE *pbits;&lt;br /&gt;&lt;br /&gt;    CuFile File; &lt;br /&gt;&lt;br /&gt;    if( !File.Open(lpszResourceName, L"rb") )&lt;br /&gt;    {&lt;br /&gt;        Assert(0, L"CuBitmap::LoadFile /n can't open the file");&lt;br /&gt;        return FALSE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    DWORD readed;&lt;br /&gt;//  BITMAPFILEHEADER bmfh;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    int size = File.GetFileSize();&lt;br /&gt;    if( size &amp;gt; sizeof(BITMAPFILEHEADER) )&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        //ReadFile( hfile, &amp;m_bmfh, sizeof(BITMAPFILEHEADER), &amp;readed, 0 );&lt;br /&gt;        readed = File.Read( &amp;m_bmfh,  sizeof(BITMAPFILEHEADER) );&lt;br /&gt;&lt;br /&gt;        if(( readed == sizeof(BITMAPFILEHEADER) ) &amp;&amp; ( m_bmfh.bfType == 0x4d42 ))&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            m_pInfo = (BITMAPINFOHEADER*)(new BYTE[ size - sizeof(BITMAPFILEHEADER) ]);&lt;br /&gt;&lt;br /&gt;            Assert(m_pInfo, L"CuBitmap::LoadFile /n not enough memory.");&lt;br /&gt;&lt;br /&gt;            File.Read(  m_pInfo, size - sizeof(BITMAPFILEHEADER) );&lt;br /&gt;&lt;br /&gt;            // the pInfo type is BITMAPINFOHEADER, &lt;br /&gt;            // if pInfo add 1 that mean pInfo jump sizeof(BITMAPINFOHEADER)&lt;br /&gt;            pbits = (BYTE*)(m_pInfo+1);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            return FALSE;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // use Create allocate memory   &lt;br /&gt;    pImageEx-&amp;gt;Create(m_pInfo-&amp;gt;biWidth, m_pInfo-&amp;gt;biHeight, 16);&lt;br /&gt;&lt;br /&gt;//  WORD &amp;biBitCount = m_pInfo-&amp;gt;biBitCount;&lt;br /&gt;&lt;br /&gt;    BOOL bResult = false;&lt;br /&gt;&lt;br /&gt;    switch( m_bmpFormat )&lt;br /&gt;    {&lt;br /&gt;    case BMP1555:&lt;br /&gt;        return _Load1555Bmp(pbits);&lt;br /&gt;        break;&lt;br /&gt;    case BMP565:&lt;br /&gt;        return _Load565Bmp(pbits);&lt;br /&gt;        break;&lt;br /&gt;    &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    delete [] m_pInfo;&lt;br /&gt;    m_pInfo = NULL;&lt;br /&gt;&lt;br /&gt;    return bResult;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;BOOL CuImageLoaderBMP::_Load565Bmp(BYTE * pbits)&lt;br /&gt;{&lt;br /&gt;    BOOL bResult = false;&lt;br /&gt;&lt;br /&gt;    switch( m_pInfo-&amp;gt;biBitCount )&lt;br /&gt;    {&lt;br /&gt;    case 24:&lt;br /&gt;        bResult = this-&amp;gt;_Load565Bmp24(pbits);&lt;br /&gt;        break;&lt;br /&gt;    case 16:&lt;br /&gt;//      bResult = this-&amp;gt;_Load565Bmp16(pbits);&lt;br /&gt;        break;&lt;br /&gt;    case 8:&lt;br /&gt;//      bResult = this-&amp;gt;_Load565Bmp8(pbits);&lt;br /&gt;        break;&lt;br /&gt;    default:&lt;br /&gt;        {&lt;br /&gt;            Assert(0, L"CuBitmap::LoadFile /n biBitCount not support.");&lt;br /&gt;        }&lt;br /&gt;        break;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return bResult;&lt;br /&gt;}&lt;br /&gt;// &lt;br /&gt;// BOOL CuImageLoaderBMP::_Load565Bmp16(BYTE * pbits)&lt;br /&gt;// {&lt;br /&gt;//  return FALSE;&lt;br /&gt;// }&lt;br /&gt;&lt;br /&gt;BOOL CuImageLoaderBMP::_Load565Bmp24(BYTE * pbits)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    int nSrcTotalByte = m_tempImageEx-&amp;gt;Width() * m_tempImageEx-&amp;gt;Height() * 3;&lt;br /&gt;    int nDescTotalByte = m_tempImageEx-&amp;gt;Width() * m_tempImageEx-&amp;gt;Height() * 2;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // our copy pointer&lt;br /&gt;    WORD *ptr = (WORD *)m_tempImageEx-&amp;gt;Data();&lt;br /&gt;&lt;br /&gt;    BYTE r, g, b;&lt;br /&gt;&lt;br /&gt;    // Convert From BGR To RGB Format And Copy over&lt;br /&gt;    for( long i = 0; i &amp;lt; nSrcTotalByte; i += 3 ) // Loop Through All Of The Pixels&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        BYTE* pPixel=&amp;pbits[i];                 // Grab The Current Pixel&lt;br /&gt;&lt;br /&gt;        r = pPixel[2];//br;                                 // copy red&lt;br /&gt;        g = pPixel[1];//bg;                                 // copy green&lt;br /&gt;        b = pPixel[0];//bb;                                 // copy blue&lt;br /&gt;&lt;br /&gt;        *(ptr++) = (WORD)( ( r &amp;gt;&amp;gt; 3 &amp;lt;&amp;lt; 11) | &lt;br /&gt;            ( g &amp;gt;&amp;gt; 2 &amp;lt;&amp;lt; 5) | &lt;br /&gt;            ( b &amp;gt;&amp;gt; 3 ) );&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return TRUE;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BOOL CuImageLoaderBMP::_Load1555Bmp(BYTE * pbits)&lt;br /&gt;{&lt;br /&gt;    BOOL bResult = false;&lt;br /&gt;&lt;br /&gt;    switch( m_pInfo-&amp;gt;biBitCount )&lt;br /&gt;    {&lt;br /&gt;    case 24:&lt;br /&gt;        bResult = this-&amp;gt;_Load1555Bmp24(pbits);&lt;br /&gt;        break;&lt;br /&gt;    case 16:&lt;br /&gt;        bResult = this-&amp;gt;_Load1555Bmp16(pbits);&lt;br /&gt;        break;&lt;br /&gt;    case 8:&lt;br /&gt;        bResult = this-&amp;gt;_Load1555Bmp8(pbits);&lt;br /&gt;        break;&lt;br /&gt;    default:&lt;br /&gt;        {&lt;br /&gt;            Assert(0, L"CuBitmap::LoadFile /n biBitCount not support.");&lt;br /&gt;        }&lt;br /&gt;        break;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return bResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuImageLoaderBMP::_Load1555Bmp8(BYTE * pbits)&lt;br /&gt;{&lt;br /&gt;    int nSrcTotalByte = m_tempImageEx-&amp;gt;Width() * m_tempImageEx-&amp;gt;Height();&lt;br /&gt;    int nDescTotalByte = m_tempImageEx-&amp;gt;Width() * m_tempImageEx-&amp;gt;Height() * 2;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    RGBQUAD *pPalette = (RGBQUAD*)(pbits);&lt;br /&gt;&lt;br /&gt;    pbits += m_bmfh.bfOffBits - sizeof(BITMAPFILEHEADER) - sizeof(BITMAPINFOHEADER);&lt;br /&gt;&lt;br /&gt;    // 來源圖 做 4byte 對齊&lt;br /&gt;    int nSrcJumpByte = 4 - (m_tempImageEx-&amp;gt;Width() % 4);&lt;br /&gt;    if( nSrcJumpByte == 4 )&lt;br /&gt;        nSrcJumpByte = 0;&lt;br /&gt;&lt;br /&gt;    int nDescJumpByte = 2 - ( (m_tempImageEx-&amp;gt;Width() ) % 2 );&lt;br /&gt;    if( nDescJumpByte == 2 )&lt;br /&gt;        nDescJumpByte = 0;&lt;br /&gt;&lt;br /&gt;//  nDescJumpByte = 1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // our copy pointer&lt;br /&gt;    WORD *ptr = (WORD *)m_tempImageEx-&amp;gt;Data();//_bits;&lt;br /&gt;&lt;br /&gt;//  BYTE r, g, b;&lt;br /&gt;&lt;br /&gt;    // Convert From BGR To RGB Format And Copy over&lt;br /&gt;    //for( long i = 0; i &amp;lt; nSrcTotalByte; i += 1 )   // Loop Through All Of The Pixels&lt;br /&gt;&lt;br /&gt;    int i = 0;&lt;br /&gt;    for( int nHeight = 0 ; nHeight &amp;lt; m_tempImageEx-&amp;gt;Height() ; nHeight += 1 )&lt;br /&gt;    {&lt;br /&gt;        for( int nWidth = 0 ; nWidth &amp;lt; m_tempImageEx-&amp;gt;Width() ; nWidth += 1)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            int nColorIndex = pbits[i++];                   // Grab The Current Pixel&lt;br /&gt;            RGBQUAD Color = pPalette[nColorIndex];&lt;br /&gt;&lt;br /&gt;            *(ptr++) = (WORD)( ( Color.rgbRed &amp;gt;&amp;gt; 3 &amp;lt;&amp;lt; 10) | &lt;br /&gt;                                ( Color.rgbGreen &amp;gt;&amp;gt; 3 &amp;lt;&amp;lt; 5) | &lt;br /&gt;                                ( Color.rgbBlue &amp;gt;&amp;gt; 3 ) );&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;        i += nSrcJumpByte; &lt;br /&gt;        ptr += nDescJumpByte;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BOOL CuImageLoaderBMP::_Load1555Bmp16(BYTE * pbits)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    int nTotalByte = m_tempImageEx-&amp;gt;Width() * m_tempImageEx-&amp;gt;Height() * 2;&lt;br /&gt;    BYTE *pData = m_tempImageEx-&amp;gt;Data();&lt;br /&gt;    memcpy( pData, pbits, nTotalByte);&lt;br /&gt;    return TRUE;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuImageLoaderBMP::_Load1555Bmp24(BYTE * pbits)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;        int nSrcTotalByte = m_tempImageEx-&amp;gt;Width() * m_tempImageEx-&amp;gt;Height() * 3;&lt;br /&gt;        int nDescTotalByte = m_tempImageEx-&amp;gt;Width() * m_tempImageEx-&amp;gt;Height() * 2;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // our copy pointer&lt;br /&gt;        WORD *ptr = (WORD *)m_tempImageEx-&amp;gt;Data();&lt;br /&gt;&lt;br /&gt;        BYTE r, g, b;&lt;br /&gt;&lt;br /&gt;        // Convert From BGR To RGB Format And Copy over&lt;br /&gt;        for( long i = 0; i &amp;lt; nSrcTotalByte; i += 3 ) // Loop Through All Of The Pixels&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            BYTE* pPixel=&amp;pbits[i];                 // Grab The Current Pixel&lt;br /&gt;            &lt;br /&gt;            r = pPixel[2];//br;                                 // copy red&lt;br /&gt;            g = pPixel[1];//bg;                                 // copy green&lt;br /&gt;            b = pPixel[0];//bb;                                 // copy blue&lt;br /&gt;&lt;br /&gt;            *(ptr++) = (WORD)( ( r &amp;gt;&amp;gt; 3 &amp;lt;&amp;lt; 10) | &lt;br /&gt;                                      ( g &amp;gt;&amp;gt; 3 &amp;lt;&amp;lt; 5) | &lt;br /&gt;                                      ( b &amp;gt;&amp;gt; 3 ) );&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    return TRUE;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;功能複合的太多就會像上面這樣, 整個看起來好像很好用, 但真的要改的時後, 會有點頭大的感覺&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-6803275593770474950?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/6803275593770474950/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuimageloaderbmp.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6803275593770474950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6803275593770474950'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuimageloaderbmp.html' title='CuImageLoaderBMP'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-3087400148378338032</id><published>2010-02-17T15:00:00.000-08:00</published><updated>2010-02-17T15:00:00.855-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuResetSystemIdleTimer</title><content type='html'>&lt;pre class="brush: cpp;"&gt;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuResetSystemIdleTimer&lt;br /&gt;{&lt;br /&gt;    TuWinTimer&amp;lt;CuResetSystemIdleTimer&amp;gt; m_WinTimer;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuResetSystemIdleTimer();&lt;br /&gt;    virtual ~CuResetSystemIdleTimer();&lt;br /&gt;    BOOL Init(HANDLE hParent);&lt;br /&gt;    void OnTimeOut();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuResetSystemIdleTimer::CuResetSystemIdleTimer()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuResetSystemIdleTimer::~CuResetSystemIdleTimer()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuResetSystemIdleTimer::Init(HANDLE hParent)&lt;br /&gt;{&lt;br /&gt;    OnTimeOut();&lt;br /&gt;&lt;br /&gt;    m_WinTimer.Init(30000);&lt;br /&gt;    m_WinTimer.CombineElement(this, &amp;CuResetSystemIdleTimer::OnTimeOut, (HWND)hParent);&lt;br /&gt;    m_WinTimer.OnStardTime();&lt;br /&gt;    return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuResetSystemIdleTimer::OnTimeOut()&lt;br /&gt;{&lt;br /&gt;    keybd_event(VK_F24 , 0, KEYEVENTF_SILENT, 0);    &lt;br /&gt;    keybd_event(VK_F24 , 0, KEYEVENTF_SILENT | KEYEVENTF_KEYUP, 0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;猜看看這個是幹嘛的!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-3087400148378338032?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/3087400148378338032/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/curesetsystemidletimer.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3087400148378338032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3087400148378338032'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/curesetsystemidletimer.html' title='CuResetSystemIdleTimer'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-6899922212196005544</id><published>2010-02-16T15:00:00.000-08:00</published><updated>2010-02-16T15:00:02.318-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>CuHtmlGeneric</title><content type='html'>&lt;pre class="brush: php;"&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuHtmlGeneric&lt;br /&gt;{&lt;br /&gt;    function OnHTML()&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;    }   &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuHTMLString extends CuHtmlGeneric&lt;br /&gt;{&lt;br /&gt;    var $m_string;&lt;br /&gt;    &lt;br /&gt;    function CuHTMLString()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;m_string = "";&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function OnAdd($str)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;m_string .= $str;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function OnHTML()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;m_string;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class CuWebControl extends CuHtmlGeneric&lt;br /&gt;{&lt;br /&gt;    var $Attribute;&lt;br /&gt;    &lt;br /&gt;    function CuWebControl()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;Attribute = array();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    function __set($member, $val){&lt;br /&gt;        $this-&amp;gt;Attribute[$member] = $val;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function Set($member, $val)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;__set($member, $val);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function __get($member)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;Attribute[$member];&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function Get($member)&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;__get($member);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function Remove($member)&lt;br /&gt;    {&lt;br /&gt;        $Attribute = $this-&amp;gt;Attribute[$member];&lt;br /&gt;        unset($this-&amp;gt;Attribute[$member]);&lt;br /&gt;        return $Attribute;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function MakeAttribute()&lt;br /&gt;    {&lt;br /&gt;        foreach($this-&amp;gt;Attribute as $key =&amp;gt; $value)&lt;br /&gt;        {&lt;br /&gt;            if( $value != "" )&lt;br /&gt;                $str = "$key=\"$value\" ";&lt;br /&gt;            else&lt;br /&gt;                $str = "$key ";&lt;br /&gt;            &lt;br /&gt;            $html .= $str;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        return $html;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    function OnHTML()&lt;br /&gt;    {&lt;br /&gt;        $html = "&amp;lt;" . $this-&amp;gt;MakeAttribute() . "&amp;gt;";&lt;br /&gt;        return $html;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/************************************************&lt;br /&gt;* 類別名稱: CuHTMLAnchor&lt;br /&gt;* 類別說明: 將HTML 的 連結控制項 Tag &amp;lt;a&amp;gt;&lt;br /&gt;************************************************/&lt;br /&gt;class CuHTMLAnchor extends CuWebControl&lt;br /&gt;{&lt;br /&gt;    &lt;br /&gt;    function CuHTMLAnchor()&lt;br /&gt;    {&lt;br /&gt;        //CuHTMLAnchor&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function OnHTML()&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        $value = $this-&amp;gt;Remove("value");&lt;br /&gt;        &lt;br /&gt;        $html = "&amp;lt;" . $this-&amp;gt;MakeAttribute() . "&amp;gt;" . $value . "&amp;lt;/a&amp;gt;";&lt;br /&gt;        &lt;br /&gt;        return $html;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;支援 CuPage 的相關類別, 控制項類別, 組合字串類別, 方便用來操做HTML組裝&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-6899922212196005544?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/6899922212196005544/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuhtmlgeneric.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6899922212196005544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6899922212196005544'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuhtmlgeneric.html' title='CuHtmlGeneric'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-1147723762996519547</id><published>2010-02-15T15:00:00.000-08:00</published><updated>2010-02-15T04:33:06.509-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>CuPage</title><content type='html'>// Task.form.html&lt;br /&gt;&lt;pre class="brush: xml;"&gt;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;    &amp;lt;form method="POST" action=""&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="msg" value="#?msg?#"&amp;gt;&lt;br /&gt;&lt;br /&gt;    主旨:&amp;lt;input type="text" name="title" size="80"&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;內容:&amp;lt;br&amp;gt;&lt;br /&gt;    &amp;lt;textarea rows="5" name="description" cols="80"&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;&amp;lt;input type="submit" value="送出" name="B1"&amp;gt;&amp;lt;input type="reset" value="重新設定" name="B2"&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php;"&gt;//&lt;br /&gt;&lt;br /&gt;class CuTestTaskForm extends CuPage &lt;br /&gt;{&lt;br /&gt;    function OnProcess()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;title-&amp;gt;Set("value", "哦哦更爽的");&lt;br /&gt;        $this-&amp;gt;msg-&amp;gt;Set("value", "這樣行嗎?");&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$page = new CuTestTaskForm;&lt;br /&gt;&lt;br /&gt;$filename = "resource/Task.form.html";&lt;br /&gt;$page-&amp;gt;LoadFile($filename);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$nIndex = $page-&amp;gt;GetObjectIndex("msg");&lt;br /&gt;$this-&amp;gt;debug-&amp;gt;debug($nIndex, "msg nIndex");&lt;br /&gt;$this-&amp;gt;assertTrue($nIndex == 5, "msg nIndex from CuPageGetObjectIndex");&lt;br /&gt;&lt;br /&gt;$msg = $page-&amp;gt;GetObject("msg");&lt;br /&gt;$msg-&amp;gt;Set("value", "抓出來的是考備版");&lt;br /&gt;$this-&amp;gt;debug-&amp;gt;debug($msg, "CuPage::GetObject 抓出來的是考備版");&lt;br /&gt;$page-&amp;gt;SetObject($msg); // 再蓋回去囉&lt;br /&gt;$this-&amp;gt;debug-&amp;gt;innerText($page-&amp;gt;OnHTML(), "CuPage-&amp;gt;SetObject 再蓋回去囉");&lt;br /&gt;&lt;br /&gt;$page-&amp;gt;OnProcess();&lt;br /&gt;$this-&amp;gt;debug-&amp;gt;innerText($page-&amp;gt;OnHTML(), "from CuPage::OnHTML");&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush: php;"&gt;// CuPage.php&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/************************************************&lt;br /&gt;* 類別名稱: CuPage&lt;br /&gt;* 類別說明: 將HTML 的 form 載入後轉為PHP控制物件 CuWebControl&lt;br /&gt;* 現在只支援 &amp;lt;INPUT &amp;gt;&lt;br /&gt;************************************************/&lt;br /&gt;class CuPage&lt;br /&gt;{&lt;br /&gt;    var $m_Control;&lt;br /&gt;    var $m_Index;&lt;br /&gt;    &lt;br /&gt;    function CuPage()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;m_Control = array();&lt;br /&gt;        $this-&amp;gt;m_Index = 0;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: LoadFile&lt;br /&gt;    * 函式說明: 載入html檔&lt;br /&gt;    ************************************************/   &lt;br /&gt;    function LoadFile($filename)&lt;br /&gt;    {&lt;br /&gt;        $html = LoadFile("resource/Task.form.html");&lt;br /&gt;        $this-&amp;gt;ExplodeForm($html);&lt;br /&gt;        $this-&amp;gt;CombineControl();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: ExplodeForm&lt;br /&gt;    * 函式說明: 將Html Form 轉為 控制項陣列&lt;br /&gt;    ************************************************/       &lt;br /&gt;    function ExplodeForm($html)&lt;br /&gt;    {&lt;br /&gt;        $html_array = explode("&amp;lt;", $html);&lt;br /&gt;        &lt;br /&gt;        foreach( $html_array as $key =&amp;gt; $value )&lt;br /&gt;        {&lt;br /&gt;            if( ereg( "^input", $value ) )&lt;br /&gt;            {&lt;br /&gt;                list($webcode, $str) = explode("&amp;gt;", $value);&lt;br /&gt;                &lt;br /&gt;                $object_Attribute = explode(" ", $webcode);&lt;br /&gt;                $this-&amp;gt;CreateWebControl($object_Attribute);&lt;br /&gt;                &lt;br /&gt;                $this-&amp;gt;CreateHTMLString( $str );&lt;br /&gt;            }&lt;br /&gt;            else if( $value != "" )&lt;br /&gt;            {&lt;br /&gt;                $this-&amp;gt;CreateHTMLString( "&amp;lt;" . $value );&lt;br /&gt;            }&lt;br /&gt;        }       &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: CombineControl&lt;br /&gt;    * 函式說明: 叫用這個函式, 來派發form 物件到類別內&lt;br /&gt;    ************************************************/&lt;br /&gt;    function CombineControl()&lt;br /&gt;    {&lt;br /&gt;        foreach( $this-&amp;gt;m_Control as $key =&amp;gt; $value )&lt;br /&gt;        {&lt;br /&gt;            if( $value-&amp;gt;Attribute["name"] == "" )&lt;br /&gt;                continue;&lt;br /&gt;            &lt;br /&gt;            $name = $value-&amp;gt;Attribute["name"];&lt;br /&gt;            $this-&amp;gt;$name = &amp;$this-&amp;gt;m_Control[$key];&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: OnProcess&lt;br /&gt;    * 函式說明: 子類別繼承這個函式後對表單的操作函式&lt;br /&gt;    ************************************************/&lt;br /&gt;    function OnProcess()&lt;br /&gt;    {&lt;br /&gt;            &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: AddObject&lt;br /&gt;    * 函式說明: 將CuWebControl加入CuPage陣列&lt;br /&gt;    ************************************************/   &lt;br /&gt;    function AddObject($object)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;m_Index = $this-&amp;gt;m_Index + 1;&lt;br /&gt;        $this-&amp;gt;m_Control[$this-&amp;gt;m_Index] = $object;       &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: SetObject&lt;br /&gt;    * 函式說明: 將CuWebControl加入CuPage陣列, 這裡會掃name參數, 找到一樣的就蓋掉, 找不到就轉叫 AddObject&lt;br /&gt;    ************************************************/&lt;br /&gt;    function SetObject($object)&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        $index = $this-&amp;gt;GetObjectIndex($object-&amp;gt;Get("name"));&lt;br /&gt;        if( $index == 0 )&lt;br /&gt;            $this-&amp;gt;AddObject($object);&lt;br /&gt;        else&lt;br /&gt;            $this-&amp;gt;m_Control[$index] = $object;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: GetObjectIndex&lt;br /&gt;    * 函式說明: 依名稱尋找索引值&lt;br /&gt;    ************************************************/&lt;br /&gt;    function GetObjectIndex($name)&lt;br /&gt;    {&lt;br /&gt;        foreach( $this-&amp;gt;m_Control as $key =&amp;gt; $value )&lt;br /&gt;        {&lt;br /&gt;            if( $name == $value-&amp;gt;Attribute["name"] )&lt;br /&gt;                return $key;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: GetObject&lt;br /&gt;    * 函式說明: 依名稱尋找元件 -- 這裡傳回的是copy版, &lt;br /&gt;    ************************************************/   &lt;br /&gt;    function GetObject($name)&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        foreach( $this-&amp;gt;m_Control as $key =&amp;gt; $value )&lt;br /&gt;        {&lt;br /&gt;            if( $name == $value-&amp;gt;Attribute["name"] )&lt;br /&gt;                return $this-&amp;gt;m_Control[$key];&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: CreateWebControl&lt;br /&gt;    * 函式說明: 將處理好一半的HTML碼轉為CuWebControl, 並且叫用SetObject&lt;br /&gt;    ************************************************/       &lt;br /&gt;    function CreateWebControl($html_tag_array)&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        $Control = new CuWebControl;&lt;br /&gt;        foreach($html_tag_array as $Attribute_key =&amp;gt; $Attribute_value)&lt;br /&gt;        {&lt;br /&gt;            list($key, $value) = explode("=", $Attribute_value);&lt;br /&gt;            $value = split("\"", $value);&lt;br /&gt;            $Control-&amp;gt;Set($key, $value[1]);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        $this-&amp;gt;AddObject($Control);&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: CreateHTMLString&lt;br /&gt;    * 函式說明: 建構HTML字串元件除了可以轉換的 FORM INPUT 外, 其他的文字直接建文字元件&lt;br /&gt;    ************************************************/           &lt;br /&gt;    function CreateHTMLString($string)&lt;br /&gt;    {&lt;br /&gt;        if( $string == "" )&lt;br /&gt;            return;&lt;br /&gt;        &lt;br /&gt;        $Control = new CuHTMLString();&lt;br /&gt;        $Control-&amp;gt;OnAdd( $string );&lt;br /&gt;        $this-&amp;gt;AddObject($Control);&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    function OnHTML()&lt;br /&gt;    {&lt;br /&gt;        $html = "";&lt;br /&gt;        foreach( $this-&amp;gt;m_Control as $key =&amp;gt; $value )&lt;br /&gt;        {&lt;br /&gt;            if( $value != null )&lt;br /&gt;                $html .= $value-&amp;gt;OnHTML();&lt;br /&gt;        }&lt;br /&gt;        return $html;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Form 的載入一般都直接使用HTML並且替換字串, 在這裡將form.html當做外部介面設定檔, &lt;br /&gt;將 input 生成為可控制類別, 使用類別操控的方式來處理表單, 可以很方便的操作內容元件,&lt;br /&gt;上面拿 tag input 來做範例.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-1147723762996519547?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/1147723762996519547/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cupage.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1147723762996519547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1147723762996519547'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cupage.html' title='CuPage'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-515956958300285742</id><published>2010-02-14T15:00:00.000-08:00</published><updated>2010-02-14T21:14:06.893-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>CuTaskDlg</title><content type='html'>&lt;pre class="brush: php;"&gt;//&lt;br /&gt;&lt;br /&gt;//***************************************&lt;br /&gt;// 類別名稱：CuTask&lt;br /&gt;// 功　　能：工作記錄 對資料表 task 資料維護&lt;br /&gt;//***************************************/&lt;br /&gt;class CuTaskDlg  {&lt;br /&gt;&lt;br /&gt;    // 成員變數&lt;br /&gt;    // private&lt;br /&gt;    var $created;&lt;br /&gt;    &lt;br /&gt;    // public&lt;br /&gt;    var $title;&lt;br /&gt;    var $description;&lt;br /&gt;    var $account_id;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // 資料庫關聯&lt;br /&gt;    var $ado;&lt;br /&gt;    var $record;&lt;br /&gt;    &lt;br /&gt;    // 靜態變數&lt;br /&gt;    var $table_name = "hrc_task";&lt;br /&gt;    &lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: CuTaskDlg&lt;br /&gt;    * 函式說明: 使用CuRecord作業&lt;br /&gt;    ************************************************/       &lt;br /&gt;    function CuTaskDlg($ado) {&lt;br /&gt;&lt;br /&gt;        $this-&amp;gt;ado = $ado;&lt;br /&gt;        $this-&amp;gt;record = new CuRecord($ado, $this-&amp;gt;table_name, "sn");&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: Save&lt;br /&gt;    * 函式說明: 儲存 這個 啞資料類別不處理&lt;br /&gt;    ************************************************/   &lt;br /&gt;    function Save()&lt;br /&gt;    {&lt;br /&gt;        if(!($this-&amp;gt;title))&lt;br /&gt;            return;&lt;br /&gt;            &lt;br /&gt;        &lt;br /&gt;        $this-&amp;gt;created = date("Y-m-d H:i:s", time());&lt;br /&gt;        $record = &amp;$this-&amp;gt;record;&lt;br /&gt;        &lt;br /&gt;        // 檢查是否有留言過&lt;br /&gt;        $sn = $record-&amp;gt;Load("title", "$this-&amp;gt;title");&lt;br /&gt;        if( $sn != "" )&lt;br /&gt;            return;&lt;br /&gt;        &lt;br /&gt;        $record-&amp;gt;SetField("created", $this-&amp;gt;created );&lt;br /&gt;        $record-&amp;gt;SetField("title", $this-&amp;gt;title);&lt;br /&gt;        $record-&amp;gt;SetField("description", $this-&amp;gt;description);&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        $record-&amp;gt;SetField("account_id", $this-&amp;gt;account_id);&lt;br /&gt;        $record-&amp;gt;Save(); &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    /************************************************&lt;br /&gt;    * 函式名稱: Load&lt;br /&gt;    * 函式說明: 指定SN值 載入指定的資料項&lt;br /&gt;    ************************************************/       &lt;br /&gt;    function Load($sn)&lt;br /&gt;    {&lt;br /&gt;        $record = &amp;$this-&amp;gt;record;&lt;br /&gt;        $record-&amp;gt;Load("sn", $sn);&lt;br /&gt;        &lt;br /&gt;        $this-&amp;gt;created  = $record-&amp;gt;GetField("created");&lt;br /&gt;        $this-&amp;gt;title = $record-&amp;gt;GetField("title");&lt;br /&gt;        $this-&amp;gt;description = $record-&amp;gt;GetField("description");&lt;br /&gt;        $this-&amp;gt;account_id = $record-&amp;gt;GetField("account_id");&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&lt;br /&gt;-- &lt;br /&gt;-- 資料表格式： `hrc_task`&lt;br /&gt;-- &lt;br /&gt;&lt;br /&gt;CREATE TABLE `hrc_task` (&lt;br /&gt;  `sn` int(11) NOT NULL auto_increment,&lt;br /&gt;  `created` timestamp NOT NULL default '0000-00-00 00:00:00',&lt;br /&gt;  `title` varchar(256) NOT NULL,&lt;br /&gt;  `description` text,&lt;br /&gt;  `account_id` int(11) NOT NULL DEFAULT '0',&lt;br /&gt;  PRIMARY KEY  (`sn`)&lt;br /&gt;) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;&lt;br /&gt;&lt;br /&gt; created 記錄建立日期&lt;br /&gt; title 項目主旨&lt;br /&gt; description 詳細內容&lt;br /&gt; account_id 帳號索引 用來關聯是那位使用者寫入的 預設為0 &lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-515956958300285742?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/515956958300285742/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cutaskdlg.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/515956958300285742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/515956958300285742'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cutaskdlg.html' title='CuTaskDlg'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-6919698350581563277</id><published>2010-02-13T16:39:00.000-08:00</published><updated>2010-02-13T16:39:36.062-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>CuCount</title><content type='html'>&lt;pre class="brush: php;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuCount.php&lt;br /&gt;&lt;br /&gt;class CuCount&lt;br /&gt;{&lt;br /&gt;    var $ado;&lt;br /&gt;    var $count_name;&lt;br /&gt;    var $record;&lt;br /&gt;    &lt;br /&gt;    function CuCount(/*CuAdo*/ $ado, $count_name)&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        $this-&amp;gt;ado = &amp;$ado;&lt;br /&gt;        $this-&amp;gt;count_name = $count_name;&lt;br /&gt;        $this-&amp;gt;record = new CuRecord(&amp;$ado, "hrc_count", "id");&lt;br /&gt;        $this-&amp;gt;record-&amp;gt;Load("name", $this-&amp;gt;count_name);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function Inc()&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        $record = &amp;$this-&amp;gt;record;&lt;br /&gt;        &lt;br /&gt;        $count = $record-&amp;gt;GetField("count");&lt;br /&gt;        $count = $count + 1;&lt;br /&gt;        $record-&amp;gt;SetField("count", $count);&lt;br /&gt;        $record-&amp;gt;SetField("name", $this-&amp;gt;count_name);&lt;br /&gt;        $record-&amp;gt;Save();&lt;br /&gt;        &lt;br /&gt;        $this-&amp;gt;AddLog();&lt;br /&gt;        $CountLog = $this-&amp;gt;CountLog();&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;        $TotalCount = $record-&amp;gt;GetField("totalcount");&lt;br /&gt;        $TotalCount = $TotalCount + $CountLog;&lt;br /&gt;&lt;br /&gt;        return $TotalCount;&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function CountLog( $date = "" )&lt;br /&gt;    {&lt;br /&gt;        $id = $this-&amp;gt;record-&amp;gt;GetField('id');&lt;br /&gt;        if( $date != "" )&lt;br /&gt;            $created_stmt = " AND created = '$date' ";&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;        $stmt = "SELECT * FROM hrc_countlog WHERE `count_id` = '". $id ."'" . $created_stmt;&lt;br /&gt;        $this-&amp;gt;ado-&amp;gt;sql($stmt);   &lt;br /&gt;        $result_table = $this-&amp;gt;ado-&amp;gt;fetch_array();&lt;br /&gt;        return count($result_table);&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function AddLog()&lt;br /&gt;    {&lt;br /&gt;                &lt;br /&gt;        $CountLog = new CuRecord(&amp;$this-&amp;gt;ado, "hrc_countlog", "id");&lt;br /&gt;        $created = date("Y-m-d", time());       &lt;br /&gt;        $CountLog-&amp;gt;SetField("created", $created);&lt;br /&gt;        $CountLog-&amp;gt;SetField("count_id", $this-&amp;gt;record-&amp;gt;GetField("id"));&lt;br /&gt;        $CountLog-&amp;gt;SetField("user_agent",  $GLOBALS["HTTP_USER_AGENT"]);&lt;br /&gt;        $CountLog-&amp;gt;Save();&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;CREATE TABLE `hrc_count` (&lt;br /&gt;`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,&lt;br /&gt;`name` VARCHAR( 64 ) NOT NULL ,&lt;br /&gt;`count` INT( 11 ) NOT NULL ,&lt;br /&gt;`totalcount` INT( 11 ) NOT NULL default '0',&lt;br /&gt;INDEX ( `name` ) &lt;br /&gt;) ENGINE = MYISAM ;&lt;br /&gt;&lt;br /&gt;CREATE TABLE `hrc_countlog` (&lt;br /&gt;`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,&lt;br /&gt;`count_id` INT NOT NULL ,&lt;br /&gt;`created` DATE NOT NULL default '0000-00-00',&lt;br /&gt;`user_agent` varchar(256) NOT NULL,&lt;br /&gt;INDEX ( `count_id` ) &lt;br /&gt;) ENGINE = MYISAM ;&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;有了CuRecord &amp; CuADO 後. 在處理資料表時就簡明多了&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-6919698350581563277?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/6919698350581563277/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cucount.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6919698350581563277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6919698350581563277'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cucount.html' title='CuCount'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2825623828097532698</id><published>2010-02-12T15:00:00.000-08:00</published><updated>2010-02-12T06:11:51.919-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>TuPokerRule - 分析牌型</title><content type='html'>&lt;pre class="brush: delphi;"&gt;// u_TPokerRule.pas&lt;br /&gt;&lt;br /&gt;unit u_TPokerRule;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;uses&lt;br /&gt;        Windows, Classes, SysUtils,&lt;br /&gt;        StdCtrls,&lt;br /&gt;        ch_LogMessages,&lt;br /&gt;&lt;br /&gt;        u_TList,&lt;br /&gt;        u_TDeck,&lt;br /&gt;        u_TexasHoldConst;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 類別名稱：TuPokerRule&lt;br /&gt;// 功　　能：分析牌型&lt;br /&gt;//******************************************************************************&lt;br /&gt;        TuPokerRule = class&lt;br /&gt;          private&lt;br /&gt;            m_PokerRuleMessToFiles : TLogMessToFiles;&lt;br /&gt;            m_nPokerRule : integer; // 牌型&lt;br /&gt;&lt;br /&gt;            // 計算每個花色的牌有幾張&lt;br /&gt;            m_aCategory : array[0..3] of integer;&lt;br /&gt;            // 記錄 每種 數字 有幾張&lt;br /&gt;            m_aSumIndex: array[0..CARD_INDEX_LIMIT] of integer;&lt;br /&gt;            // 記錄有幾種牌型&lt;br /&gt;            m_aSumRules: array[0..POKER_RULES_LIMIT - 1]of integer;&lt;br /&gt;&lt;br /&gt;            // 暫存要分析的撲克&lt;br /&gt;            m_TempPokerList : TuList; // type TCardData.nListIndex;&lt;br /&gt;            m_CardDataList: TuList; // type TCardData;&lt;br /&gt;            m_MaxRulePoker : TuList; // type TCardData; 最大的五張牌&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            m_pDeck : TuDeck;&lt;br /&gt;&lt;br /&gt;            function _GetFlushIndex(): Integer; // 抓同花是那一個花色&lt;br /&gt;&lt;br /&gt;            function _GetMaxRules : Integer; // 取最大的牌型&lt;br /&gt;            procedure _OnRanderMaxPoker( nRuleType:Integer ); // 依牌型抓最大的五張&lt;br /&gt;&lt;br /&gt;            procedure _OnMaxPokerZilch;         // 抓 最大的五張&lt;br /&gt;            procedure _OnMaxPokerOnePair;       // 抓 一對 最大的五張&lt;br /&gt;            procedure _OnMaxPokerTwoPair;       // 抓 兩對 最大的五張&lt;br /&gt;            procedure _OnMaxPokerThreeKind;     // 抓 三條 最大的五張&lt;br /&gt;            procedure _OnMaxPokerStraight;      // 抓 順子 最大的五張&lt;br /&gt;            procedure _OnMaxPokerFlush;         // 抓 同花 最大的五張&lt;br /&gt;            procedure _OnMaxPokerFullHouse;     // 抓 葫蘆 最大的五張&lt;br /&gt;            procedure _OnMaxPokerFourKind;      // 抓 鐵支 最大的五張&lt;br /&gt;            procedure _OnMaxPokerStraightFlush; // 抓 同花順 最大的五張&lt;br /&gt;&lt;br /&gt;            function _PokerRulesTwoPair:Integer;         // 檢查有沒有 兩對&lt;br /&gt;            function _PokerRulesStraight : Integer;      // 檢查有沒有 順子&lt;br /&gt;            function _PokerRulesFlush :Integer;          // 檢查有沒有 同花&lt;br /&gt;            function _PokerRulesFullHouse: Integer;      // 檢查有沒有 葫蘆&lt;br /&gt;            function _PokerRulesStraightFlush():Integer; // 檢查有沒有 同花順&lt;br /&gt;            function _PokerRulesRoyalFlush():Integer;    // 檢查有沒有 同花順&lt;br /&gt;&lt;br /&gt;            procedure _debug_LogPoker;// 將 牌 匯出&lt;br /&gt;          public&lt;br /&gt;            constructor Create(var pDeck: TuDeck);&lt;br /&gt;            destructor Destroy(); override;&lt;br /&gt;&lt;br /&gt;            procedure Init();&lt;br /&gt;            procedure OnAddCard(nIndex:Integer);        // 將牌加入&lt;br /&gt;            function GetPokerRule(): Integer;           // 取出最大的牌型&lt;br /&gt;            procedure GetMaxRulePoker(var MaxPoker:TuList); // 將最大的五張牌寫入 MaxPoker&lt;br /&gt;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 類別名稱：TuUITextPokerRule&lt;br /&gt;// 功　　能：牌型顯示 文字版本&lt;br /&gt;//******************************************************************************&lt;br /&gt;        TuTextPokerRule = class&lt;br /&gt;          private&lt;br /&gt;            //m_uiText : TuUIText;&lt;br /&gt;            m_strPokerRule : string; // 轉換完成的字串&lt;br /&gt;            m_AToKTextList : TStringList; // A 到 K 的文字 字串&lt;br /&gt;            m_PokerRulesFormat : TStringList; //&lt;br /&gt;          public&lt;br /&gt;            constructor Create();&lt;br /&gt;            destructor Destroy(); override;&lt;br /&gt;            procedure OnProcess(PokerRules: Word; var CardDataList : TuList ); // 牌型 五張牌&lt;br /&gt;            property Text: string read m_strPokerRule;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;// { TuUITextPokerRule }&lt;br /&gt;&lt;br /&gt;constructor TuTextPokerRule.Create;&lt;br /&gt;begin&lt;br /&gt;        m_AToKTextList := TStringList.Create();&lt;br /&gt;        if( Assigned( m_AToKTextList ) = True ) then begin&lt;br /&gt;            m_AToKTextList.LoadFromFile( INI_DATA_PATH + 'AToKText_en.ini' );&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        m_PokerRulesFormat := TStringList.Create();&lt;br /&gt;        if( Assigned( m_PokerRulesFormat ) = True ) then begin&lt;br /&gt;            m_PokerRulesFormat.LoadFromFile( INI_DATA_PATH + 'PokerRulesTextFormat_en.ini' );&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;destructor TuTextPokerRule.Destroy;&lt;br /&gt;begin&lt;br /&gt;        m_PokerRulesFormat.Free;&lt;br /&gt;        m_AToKTextList.Free;&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TuTextPokerRule.OnProcess(PokerRules: Word;&lt;br /&gt;  var CardDataList: TuList);&lt;br /&gt;var&lt;br /&gt;        strP1:string;&lt;br /&gt;        strP2:string;&lt;br /&gt;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;        TmpCardDataList : TuList;&lt;br /&gt;        nIndex : Integer;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        if CardDataList.Count = 0 then&lt;br /&gt;            exit;&lt;br /&gt;&lt;br /&gt;        strP1 := '';&lt;br /&gt;        strP2 := '';&lt;br /&gt;        // 牌型&lt;br /&gt;        case PokerRules of&lt;br /&gt;          POKER_RULES_ZILCH: begin&lt;br /&gt;&lt;br /&gt;              TmpCardData := CardDataList.GetItems(0);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP1 := m_AToKTextList.Strings[ nIndex ];&lt;br /&gt;          end;&lt;br /&gt;          POKER_RULES_ONE_PAIR: begin&lt;br /&gt;              TmpCardData := CardDataList.GetItems(0);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP1 := Format('%ss',[m_AToKTextList.Strings[ nIndex ]]);&lt;br /&gt;&lt;br /&gt;          end;&lt;br /&gt;&lt;br /&gt;          POKER_RULES_TWO_PAIRS: begin&lt;br /&gt;              TmpCardData := CardDataList.GetItems(0);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP1 := Format('%ss',[m_AToKTextList.Strings[ nIndex ]]);&lt;br /&gt;&lt;br /&gt;              TmpCardData := CardDataList.GetItems(3);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP2 := Format('%ss',[m_AToKTextList.Strings[ nIndex ]]);&lt;br /&gt;          end;&lt;br /&gt;&lt;br /&gt;          POKER_RULES_THREE_KIND: begin&lt;br /&gt;              TmpCardData := CardDataList.GetItems(0);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP1 := Format('%ss',[m_AToKTextList.Strings[ nIndex ]]);&lt;br /&gt;          end;&lt;br /&gt;&lt;br /&gt;          POKER_RULES_STRAIGHT: begin&lt;br /&gt;              TmpCardData := CardDataList.GetItems(4);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP1 := m_AToKTextList.Strings[ nIndex ];&lt;br /&gt;&lt;br /&gt;              TmpCardData := CardDataList.GetItems(0);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP2 := m_AToKTextList.Strings[ nIndex ];&lt;br /&gt;          end;&lt;br /&gt;&lt;br /&gt;          POKER_RULES_FLUSH: begin&lt;br /&gt;              TmpCardData := CardDataList.GetItems(0);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP1 := m_AToKTextList.Strings[ nIndex ];&lt;br /&gt;&lt;br /&gt;          end;&lt;br /&gt;&lt;br /&gt;          POKER_RULES_FULLHOUSE: begin&lt;br /&gt;              TmpCardData := CardDataList.GetItems(0);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP1 := Format('%ss',[m_AToKTextList.Strings[ nIndex ]]);&lt;br /&gt;&lt;br /&gt;              TmpCardData := CardDataList.GetItems(3);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP2 := Format('%ss',[m_AToKTextList.Strings[ nIndex ]]);&lt;br /&gt;          end;&lt;br /&gt;&lt;br /&gt;          POKER_RULES_FOUR_KIND: begin&lt;br /&gt;              TmpCardData := CardDataList.GetItems(0);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP1 := Format('%ss',[m_AToKTextList.Strings[ nIndex ]]);&lt;br /&gt;          end;&lt;br /&gt;&lt;br /&gt;          POKER_RULES_STRAIGHT_FLUSH: begin&lt;br /&gt;              TmpCardData := CardDataList.GetItems(4);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP1 := m_AToKTextList.Strings[ nIndex ];&lt;br /&gt;&lt;br /&gt;              TmpCardData := CardDataList.GetItems(0);&lt;br /&gt;              nIndex := TmpCardData.Index - 1;&lt;br /&gt;              strP2 := m_AToKTextList.Strings[ nIndex ];&lt;br /&gt;          end;&lt;br /&gt;&lt;br /&gt;//          POKER_RULES_STRAIGHT_FLUSH: begin&lt;br /&gt;//              TmpCardData := CardDataList.GetItems(0);&lt;br /&gt;//              nIndex := TmpCardData.Index - 1;&lt;br /&gt;//              strP1 := m_AToKTextList.Strings[ nIndex ];&lt;br /&gt;//&lt;br /&gt;//              TmpCardData := CardDataList.GetItems(4);&lt;br /&gt;//              nIndex := TmpCardData.Index - 1;&lt;br /&gt;//              strP2 := m_AToKTextList.Strings[ nIndex ];&lt;br /&gt;//          end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        m_strPokerRule := Format(m_PokerRulesFormat.Strings[PokerRules], [strP1, strP2]);&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TuPokerRule.Create(var pDeck: TuDeck);&lt;br /&gt;begin&lt;br /&gt;        m_pDeck := pDeck;&lt;br /&gt;        m_TempPokerList := TuList.Create();&lt;br /&gt;        m_MaxRulePoker := TuList.Create();&lt;br /&gt;        m_CardDataList := TuList.Create();&lt;br /&gt;&lt;br /&gt;        m_PokerRuleMessToFiles := TLogMessToFiles.Create('PokerRuleMessage.txt');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TuPokerRule.Destroy;&lt;br /&gt;begin&lt;br /&gt;        m_PokerRuleMessToFiles.Free;&lt;br /&gt;        m_TempPokerList.Free;&lt;br /&gt;        m_MaxRulePoker.Free;&lt;br /&gt;        m_CardDataList.Free;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：Init&lt;br /&gt;// 功　　能：使用TuPokerRule 之前要先呼叫Init 用來清除所有資料&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule.Init;&lt;br /&gt;var&lt;br /&gt;        i:integer;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        // 初始化 PokerRules 記錄&lt;br /&gt;        m_nPokerRule := POKER_RULES_ZILCH;&lt;br /&gt;&lt;br /&gt;        // 清除花色記錄器&lt;br /&gt;        for i := 0 to High(m_aCategory) do begin&lt;br /&gt;            m_aCategory[i] := 0;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 清除牌數字記錄器&lt;br /&gt;        for i := 0 to High(m_aSumIndex) do begin&lt;br /&gt;            m_aSumIndex[i] := 0;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 清除牌數字記錄器&lt;br /&gt;        for i := 0 to High(m_aSumRules) do begin&lt;br /&gt;            m_aSumRules[i] := 0;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 清除暫存陣列&lt;br /&gt;        m_TempPokerList.Clear();&lt;br /&gt;        m_MaxRulePoker.Clear();&lt;br /&gt;        m_CardDataList.Clear();&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：OnAddCard&lt;br /&gt;// 功　　能：將要運牌的牌加入TuPokerRule&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule.OnAddCard(nIndex:Integer);&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        if( nIndex = - 1 ) then begin&lt;br /&gt;            exit;&lt;br /&gt;        end;&lt;br /&gt;        m_TempPokerList.Add(Pointer(nIndex));&lt;br /&gt;        m_CardDataList.Add(m_pDeck.Items(nIndex));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：GetPokerRule&lt;br /&gt;// 功　　能：TuPokerRule 最主要的函式 計算牌型 計算最大的五張牌&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuPokerRule.GetPokerRule():Integer ;&lt;br /&gt;var&lt;br /&gt;&lt;br /&gt;        i: integer;&lt;br /&gt;        nNum: integer;&lt;br /&gt;        nListIndex: integer;&lt;br /&gt;        nCategory : integer;&lt;br /&gt;        // 有幾對&lt;br /&gt;        nPairCount : integer;&lt;br /&gt;        nThreeCount : integer;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;    try&lt;br /&gt;        if m_TempPokerList.Count = 0 then  // 沒有牌不用處理&lt;br /&gt;          exit;&lt;br /&gt;&lt;br /&gt;        m_CardDataList.Sort(compareByPoker);&lt;br /&gt;&lt;br /&gt;        for i := 0 to m_TempPokerList.Count - 1 do begin&lt;br /&gt;&lt;br /&gt;            nListIndex := Integer(m_TempPokerList.GetItems(i));&lt;br /&gt;            nCategory := m_pDeck.Category(nListIndex);&lt;br /&gt;            nNum :=  m_pDeck.Index(nListIndex);&lt;br /&gt;&lt;br /&gt;            // 計數每種花色有幾張&lt;br /&gt;            m_aCategory[nCategory] := m_aCategory[nCategory] + 1;&lt;br /&gt;&lt;br /&gt;            // 計數 同樣數字的撲克牌有幾張&lt;br /&gt;            m_aSumIndex[nNum] :=  m_aSumIndex[nNum] + 1;&lt;br /&gt;&lt;br /&gt;            if nNum = 13 then&lt;br /&gt;                m_aSumIndex[0] :=  m_aSumIndex[0] + 1;&lt;br /&gt;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        for i := 1 to High(m_aSumIndex) do begin&lt;br /&gt;            case m_aSumIndex[i] of&lt;br /&gt;                2: m_aSumRules[POKER_RULES_ONE_PAIR] :=  m_aSumRules[POKER_RULES_ONE_PAIR] + 1;     // 計數對子&lt;br /&gt;                3: m_aSumRules[POKER_RULES_THREE_KIND] := m_aSumRules[POKER_RULES_THREE_KIND] + 1;  // 計數三條&lt;br /&gt;                4: m_aSumRules[POKER_RULES_FOUR_KIND] := m_aSumRules[POKER_RULES_FOUR_KIND] + 1;   // 計數四隻&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 這裡有牌型是互斥的 可以使用 if else 作區分加快計算&lt;br /&gt;        m_aSumRules[POKER_RULES_TWO_PAIRS] := _PokerRulesTwoPair();  // 檢查 兩對&lt;br /&gt;        m_aSumRules[POKER_RULES_STRAIGHT] := _PokerRulesStraight();  // 檢查 順子&lt;br /&gt;        m_aSumRules[POKER_RULES_FLUSH] := _PokerRulesFlush();        // 檢查 同花&lt;br /&gt;        m_aSumRules[POKER_RULES_FULLHOUSE] := _PokerRulesFullHouse(); // 檢查 葫蘆&lt;br /&gt;        m_aSumRules[POKER_RULES_STRAIGHT_FLUSH] := _PokerRulesStraightFlush();// 檢查 同花順&lt;br /&gt;        m_aSumRules[POKER_RULES_ROYAL_FLUSH] := _PokerRulesRoyalFlush();  // 檢查 大同花順&lt;br /&gt;&lt;br /&gt;        Result := _GetMaxRules();&lt;br /&gt;        _OnRanderMaxPoker(Result);&lt;br /&gt;&lt;br /&gt;      except&lt;br /&gt;          m_PokerRuleMessToFiles.m_WriteTXTOne('GetPokerRule', 1);&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_OnRanderMaxPoker&lt;br /&gt;// 功　　能：依牌型種類 抓出最大的五張牌&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule._OnRanderMaxPoker(nRuleType: Integer);&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        case nRuleType of&lt;br /&gt;            POKER_RULES_ZILCH:        _OnMaxPokerZilch;       // 沒有&lt;br /&gt;            POKER_RULES_ONE_PAIR:     _OnMaxPokerOnePair;     // 一對&lt;br /&gt;            POKER_RULES_TWO_PAIRS:    _OnMaxPokerTwoPair;     // 兩對&lt;br /&gt;            POKER_RULES_THREE_KIND:   _OnMaxPokerThreeKind;   // 三條&lt;br /&gt;//          POKER_RULES_SMALL_STRAIGHT:                     // 小順子&lt;br /&gt;            POKER_RULES_STRAIGHT:     _OnMaxPokerStraight;    // 順子&lt;br /&gt;            POKER_RULES_FLUSH:        _OnMaxPokerFlush;           // 同花&lt;br /&gt;            POKER_RULES_FULLHOUSE:    _OnMaxPokerFullHouse;   // 葫蘆&lt;br /&gt;            POKER_RULES_FOUR_KIND:    _OnMaxPokerFourKind;    // 鐵支&lt;br /&gt;            POKER_RULES_STRAIGHT_FLUSH:_OnMaxPokerStraightFlush;  // 同花順&lt;br /&gt;            POKER_RULES_ROYAL_FLUSH:  _OnMaxPokerStraightFlush;   // 大同花順&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_GetMaxRules&lt;br /&gt;// 功　　能：選出 最大的牌型&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuPokerRule._GetMaxRules() : Integer;&lt;br /&gt;var&lt;br /&gt;        i : Integer;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        for i := POKER_RULES_LIMIT - 1  downto POKER_RULES_ZILCH do begin&lt;br /&gt;            if( m_aSumRules[i] &amp;gt; 0 ) then begin&lt;br /&gt;                m_nPokerRule := i;&lt;br /&gt;                break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;        Result := m_nPokerRule;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：PokerRulesTwoPair&lt;br /&gt;// 功　　能：檢查有沒有兩對&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuPokerRule._PokerRulesTwoPair():integer;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        if  m_aSumRules[POKER_RULES_ONE_PAIR] &amp;lt; 2 then&lt;br /&gt;        begin&lt;br /&gt;            Result := 0;&lt;br /&gt;            exit;&lt;br /&gt;        end;&lt;br /&gt;        Result := 1;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：PokerRulesStraight&lt;br /&gt;// 功　　能：檢查牌型 順子 &amp; 順便檢查是不是最小順&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuPokerRule._PokerRulesStraight : integer;&lt;br /&gt;var&lt;br /&gt;        i : integer;&lt;br /&gt;        nCountStraight : integer;&lt;br /&gt;        nMaxCountStraight : integer;&lt;br /&gt;begin&lt;br /&gt;        nCountStraight := 0;&lt;br /&gt;        nMaxCountStraight := 0;&lt;br /&gt;&lt;br /&gt;        Result := 0;&lt;br /&gt;&lt;br /&gt;        for i := High(m_aSumIndex) downto 0  do begin&lt;br /&gt;            if m_aSumIndex[i] = 0 then&lt;br /&gt;                nCountStraight := 0;&lt;br /&gt;&lt;br /&gt;            if m_aSumIndex[i] &amp;gt; 0 then&lt;br /&gt;                nCountStraight := nCountStraight + 1;&lt;br /&gt;&lt;br /&gt;            if nMaxCountStraight &amp;lt; nCountStraight then&lt;br /&gt;                nMaxCountStraight := nCountStraight;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 有超過5張連續的牌 代表有順子&lt;br /&gt;        if nMaxCountStraight &amp;gt;= 5 then begin&lt;br /&gt;            Result := 1;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 這裡要另外檢查 是否為最小順  A 2 3 4 5&lt;br /&gt;&lt;br /&gt;        if( m_aSumIndex[1] &amp;gt; 0) And&lt;br /&gt;          ( m_aSumIndex[2] &amp;gt; 0) And&lt;br /&gt;          ( m_aSumIndex[3] &amp;gt; 0) And&lt;br /&gt;          ( m_aSumIndex[4] &amp;gt; 0) And&lt;br /&gt;          ( m_aSumIndex[0] &amp;gt; 0) then begin&lt;br /&gt;&lt;br /&gt;            if nMaxCountStraight = 5 then begin&lt;br /&gt;                m_aSumRules[POKER_RULES_SMALL_STRAIGHT] := 1;&lt;br /&gt;            end;&lt;br /&gt;            &lt;br /&gt;            Result := 1;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：PokerRulesFlush&lt;br /&gt;// 功　　能：檢查牌型 同花&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuPokerRule._PokerRulesFlush :integer;&lt;br /&gt;var&lt;br /&gt;        i : integer;&lt;br /&gt;        nListIndex : integer;&lt;br /&gt;        nNum : integer;&lt;br /&gt;        nCategory : integer;&lt;br /&gt;begin&lt;br /&gt;        Result := 0;&lt;br /&gt;        // 檢查是否有五張的花色&lt;br /&gt;        for i := 0 to High(m_aCategory) do begin&lt;br /&gt;            if( m_aCategory[i] &amp;gt;= 5 ) then begin&lt;br /&gt;                m_nPokerRule := POKER_RULES_FLUSH;&lt;br /&gt;                Result := 1;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：PokerRulesFullHouse&lt;br /&gt;// 功　　能：檢查牌型 葫蘆&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuPokerRule._PokerRulesFullHouse: integer;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        Result := 0;&lt;br /&gt;        case m_aSumRules[POKER_RULES_THREE_KIND] of&lt;br /&gt;            // 有兩組三條&lt;br /&gt;            2: Result := 1;&lt;br /&gt;            // 有一組三條 + 一組對子&lt;br /&gt;            1:&lt;br /&gt;                begin&lt;br /&gt;                if(m_aSumRules[POKER_RULES_ONE_PAIR] &amp;gt; 0 ) then&lt;br /&gt;                    Result := 1;&lt;br /&gt;                end;&lt;br /&gt;        end;&lt;br /&gt;    &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// 加入了 m_CardDataList 找時間改寫..&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：PokerRulesStraightFlush&lt;br /&gt;// 功　　能：檢查牌型 同花順&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuPokerRule._PokerRulesStraightFlush():Integer ;&lt;br /&gt;var&lt;br /&gt;        i : Integer;&lt;br /&gt;        nA : Integer;&lt;br /&gt;        nTemp : Integer;&lt;br /&gt;        nCategoryIndex: Integer;&lt;br /&gt;        nCategory2Index: Integer;&lt;br /&gt;        nCategory3Index: Integer;&lt;br /&gt;&lt;br /&gt;        nSum: Integer;&lt;br /&gt;        nMaxSum : Integer;&lt;br /&gt;&lt;br /&gt;        aArray : TuList;&lt;br /&gt;&lt;br /&gt;        str : String;&lt;br /&gt;        strFileName :string;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        Result := 0;&lt;br /&gt;        // 沒有同花 跟 順子 就不用檢查 同花順        &lt;br /&gt;        if ( m_aSumRules[POKER_RULES_STRAIGHT] = 0 ) Or&lt;br /&gt;           (m_aSumRules[POKER_RULES_FLUSH] = 0) then&lt;br /&gt;           exit;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        aArray := TuList.Create();&lt;br /&gt;&lt;br /&gt;        for i := 0 to m_TempPokerList.Count - 1  do begin&lt;br /&gt;            aArray.Add(m_TempPokerList.GetItems(i));&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        aArray.Sort(compareByInteger);&lt;br /&gt;&lt;br /&gt;        nCategoryIndex := _GetFlushIndex();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // 檢查有沒有連續的順子&lt;br /&gt;        nSum := 0;&lt;br /&gt;        nMaxSum := 0;&lt;br /&gt;        for i := 0 to m_TempPokerList.Count - 2 do&lt;br /&gt;        begin&lt;br /&gt;            nCategory2Index :=  m_pDeck.Category(Integer(aArray.GetItems(i + 1)));&lt;br /&gt;            nCategory3Index :=  m_pDeck.Category(Integer(aArray.GetItems(i)));&lt;br /&gt;&lt;br /&gt;            if( Integer(aArray.GetItems(i + 1)) - Integer(aArray.GetItems( i )) = 1 ) And&lt;br /&gt;            ( nCategory2Index = nCategory3Index ) then&lt;br /&gt;            begin&lt;br /&gt;                nSum := nSum + 1;&lt;br /&gt;                if( nMaxSum &amp;lt; nSum ) then&lt;br /&gt;                    nMaxSum := nMaxSum + 1;&lt;br /&gt;            end&lt;br /&gt;            else&lt;br /&gt;            begin&lt;br /&gt;                nSum := 0;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        if( nMaxSum &amp;gt;= 4 ) then&lt;br /&gt;        begin&lt;br /&gt;            Result := 1;&lt;br /&gt;            aArray.Free();&lt;br /&gt;            exit;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 如果有小順 要另外檢查  只要檢查 有沒有同花色A 就行了&lt;br /&gt;        if( nMaxSum &amp;lt;&amp;gt; 3 ) Or&lt;br /&gt;          (m_aSumRules[POKER_RULES_SMALL_STRAIGHT] = 0 )then begin&lt;br /&gt;            aArray.Free();&lt;br /&gt;            exit;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 計算同花色的A 的索引值&lt;br /&gt;        nA := nCategoryIndex * 13 + 12 ;&lt;br /&gt;        for i := 0 to m_TempPokerList.Count -1 do&lt;br /&gt;        begin&lt;br /&gt;            //nTemp := aArray[i];&lt;br /&gt;            if Integer(aArray.GetItems(i)) = nA then&lt;br /&gt;            begin&lt;br /&gt;                Result := 1;&lt;br /&gt;                break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        aArray.Free();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_PokerRulesRoyalFlush&lt;br /&gt;// 功　　能：檢查牌型 大同花順&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuPokerRule._PokerRulesRoyalFlush: Integer;&lt;br /&gt;var&lt;br /&gt;        i:Integer;&lt;br /&gt;        j:integer;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;        nCategory:integer;&lt;br /&gt;        nCardIndex:integer;&lt;br /&gt;begin&lt;br /&gt;        Result := 0;&lt;br /&gt;        // 沒有同花順 就不用檢查 大同花順&lt;br /&gt;        if ( m_aSumRules[POKER_RULES_STRAIGHT_FLUSH] = 0 ) then&lt;br /&gt;           exit;&lt;br /&gt;&lt;br /&gt;        nCategory := _GetFlushIndex();&lt;br /&gt;        nCardIndex := 13;&lt;br /&gt;&lt;br /&gt;        // 抓滿五張&lt;br /&gt;        j := m_CardDataList.Count - 1;&lt;br /&gt;        for i := 0 to 4 do begin&lt;br /&gt;            TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;            if (TmpCardData.Index &amp;lt;&amp;gt; nCardIndex) Or&lt;br /&gt;               (TmpCardData.Category &amp;lt;&amp;gt; nCategory) then begin &lt;br /&gt;               Result := 0;&lt;br /&gt;               exit;&lt;br /&gt;&lt;br /&gt;            end;&lt;br /&gt;            j := j - 1;&lt;br /&gt;            nCardIndex := nCardIndex - 1;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        Result := 1;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：GetMaxRulePoker&lt;br /&gt;// 功　　能：計算最大的牌型&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule.GetMaxRulePoker(var MaxPoker: TuList);&lt;br /&gt;var&lt;br /&gt;        i : integer;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        MaxPoker.Clear();&lt;br /&gt;        for i := 0 to m_MaxRulePoker.Count -1 do begin&lt;br /&gt;            MaxPoker.Add(m_MaxRulePoker.GetItems(i));&lt;br /&gt;        end;&lt;br /&gt;        &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_OnMaxPokerOnePair&lt;br /&gt;// 功　　能：將沒有任何牌形 的最大五張牌抓出來&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule._OnMaxPokerZilch;&lt;br /&gt;var&lt;br /&gt;        i: integer;&lt;br /&gt;        j: integer;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;        // 抓五張&lt;br /&gt;        for j := m_CardDataList.Count - 1 downto 0 do begin&lt;br /&gt;            TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;            m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;            if m_MaxRulePoker.Count = 5 then begin&lt;br /&gt;                Break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_OnMaxPokerOnePair&lt;br /&gt;// 功　　能：將牌形一對 的最大五張牌抓出來&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule._OnMaxPokerOnePair;&lt;br /&gt;var&lt;br /&gt;        i: integer;&lt;br /&gt;        j: integer;&lt;br /&gt;        nNum: integer;&lt;br /&gt;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;        // 抓最大的一對牌&lt;br /&gt;        for i := High(m_aSumIndex) downto 1 do begin&lt;br /&gt;            if m_aSumIndex[i] = 2 then begin&lt;br /&gt;                for j := 0 to m_CardDataList.Count - 1 do begin&lt;br /&gt;                    TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;                    //nListIndex := TmpCardData.ListIndex;&lt;br /&gt;                    nNum :=  TmpCardData.Index;&lt;br /&gt;                    if nNum = i then begin&lt;br /&gt;                        m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;                    end;&lt;br /&gt;                end;&lt;br /&gt;                Break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 抓剩下的三張&lt;br /&gt;        for j := m_CardDataList.Count - 1 downto 0 do begin&lt;br /&gt;            TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;            if m_aSumIndex[TmpCardData.Index] = 2 then begin&lt;br /&gt;                Continue;&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;            if m_MaxRulePoker.Count = 5 then begin&lt;br /&gt;                Break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_OnMaxPokerTwoPair&lt;br /&gt;// 功　　能：將牌形兩對 的最大五張牌抓出來&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule._OnMaxPokerTwoPair;&lt;br /&gt;var&lt;br /&gt;&lt;br /&gt;        i: integer;&lt;br /&gt;        j: integer;&lt;br /&gt;        nNum: integer;&lt;br /&gt;        nListIndex: integer;&lt;br /&gt;        nPairCount: integer;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        // 抓最大的兩對牌&lt;br /&gt;        nPairCount := 0;&lt;br /&gt;        for i := High(m_aSumIndex) downto 1 do begin&lt;br /&gt;            if m_aSumIndex[i] = 2 then begin&lt;br /&gt;                nPairCount := nPairCount + 1;&lt;br /&gt;                for j := 0 to m_CardDataList.Count - 1 do begin&lt;br /&gt;                    TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;                    //nListIndex := TmpCardData.ListIndex;&lt;br /&gt;                    nNum :=  TmpCardData.Index;&lt;br /&gt;                    if nNum = i then begin&lt;br /&gt;                        m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;                    end;&lt;br /&gt;                end;&lt;br /&gt;                if nPairCount = 2 then begin&lt;br /&gt;                    break;&lt;br /&gt;                end;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 抓第五張&lt;br /&gt;        nPairCount := 0;&lt;br /&gt;        for j := m_CardDataList.Count - 1 downto 0 do begin&lt;br /&gt;            TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;&lt;br /&gt;            if m_aSumIndex[TmpCardData.Index] = 2 then begin&lt;br /&gt;                nPairCount := nPairCount + 1;&lt;br /&gt;                if nPairCount &amp;lt;= 4 then begin&lt;br /&gt;                    Continue;&lt;br /&gt;                end;&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;        end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_OnMaxPokerThreeKind&lt;br /&gt;// 功　　能：將牌形三條 的最大五張牌抓出來&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule._OnMaxPokerThreeKind;&lt;br /&gt;var&lt;br /&gt;        i: integer;&lt;br /&gt;        j: integer;&lt;br /&gt;        nNum: integer;&lt;br /&gt;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;        // 抓三條&lt;br /&gt;        for i := High(m_aSumIndex) downto 1 do begin&lt;br /&gt;            if m_aSumIndex[i] = 3 then begin&lt;br /&gt;                for j := 0 to m_CardDataList.Count - 1 do begin&lt;br /&gt;                    TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;                    //nListIndex := TmpCardData.ListIndex;&lt;br /&gt;                    nNum :=  TmpCardData.Index;&lt;br /&gt;                    if nNum = i then begin&lt;br /&gt;                        m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;                    end;&lt;br /&gt;                end;&lt;br /&gt;                Break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 抓滿五張&lt;br /&gt;        for j := m_CardDataList.Count - 1 downto 0 do begin&lt;br /&gt;            TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;            if m_aSumIndex[TmpCardData.Index] = 3 then begin&lt;br /&gt;                Continue;&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;            if m_MaxRulePoker.Count = 5 then begin&lt;br /&gt;                Break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_OnMaxPokerStraight&lt;br /&gt;// 功　　能：將牌形 順子 的最大五張牌抓出來&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule._OnMaxPokerStraight;&lt;br /&gt;var&lt;br /&gt;        i : integer;&lt;br /&gt;&lt;br /&gt;        nCardDataIndex : integer;&lt;br /&gt;        nCardDataNextIndex : Integer;&lt;br /&gt;        nCountStraight : integer;&lt;br /&gt;        nMaxCountStraight : integer;&lt;br /&gt;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;        TmpCardDataNext : TCardData;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        _debug_LogPoker();&lt;br /&gt;        &lt;br /&gt;        nCountStraight := 0;&lt;br /&gt;        nMaxCountStraight := 0;&lt;br /&gt;&lt;br /&gt;        nCardDataIndex := m_CardDataList.Count - 1;&lt;br /&gt;        nCardDataNextIndex := nCardDataIndex - 1;&lt;br /&gt;        for i := m_CardDataList.Count - 1 downto 1 do begin&lt;br /&gt;            TmpCardData := m_CardDataList.GetItems(nCardDataIndex);&lt;br /&gt;            TmpCardDataNext := m_CardDataList.GetItems(nCardDataNextIndex);&lt;br /&gt;&lt;br /&gt;            // 先加入第一張牌&lt;br /&gt;            if m_MaxRulePoker.Count = 0 then&lt;br /&gt;                m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;&lt;br /&gt;            // 如果 兩張牌面數字一樣 換下一張&lt;br /&gt;            while (nCardDataNextIndex &amp;gt; 0) And&lt;br /&gt;                (TmpCardData.Index = (TmpCardDataNext.Index )) do begin&lt;br /&gt;                nCardDataNextIndex := nCardDataNextIndex - 1;&lt;br /&gt;                TmpCardDataNext := m_CardDataList.GetItems(nCardDataNextIndex);&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            // 下一張是不是比前一張少一&lt;br /&gt;            if TmpCardData.Index = (TmpCardDataNext.Index + 1) then begin&lt;br /&gt;                m_MaxRulePoker.Add(TmpCardDataNext);&lt;br /&gt;            end else begin&lt;br /&gt;                m_MaxRulePoker.Clear;&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            // 超過五張&lt;br /&gt;            if m_MaxRulePoker.Count = 5 then&lt;br /&gt;                Break;&lt;br /&gt;&lt;br /&gt;            nCardDataIndex := nCardDataNextIndex;&lt;br /&gt;            nCardDataNextIndex := nCardDataNextIndex - 1;&lt;br /&gt;&lt;br /&gt;            if nCardDataIndex = 0 then begin&lt;br /&gt;                Break;&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 如果是小順 要另外處理A&lt;br /&gt;        if m_aSumRules[POKER_RULES_SMALL_STRAIGHT] &amp;lt;&amp;gt; 0 then begin&lt;br /&gt;            for i := m_CardDataList.Count - 1 downto 0 do begin&lt;br /&gt;                TmpCardData := m_CardDataList.GetItems(i);&lt;br /&gt;                if TmpCardData.Index = 13 then begin&lt;br /&gt;                    m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;                    break;&lt;br /&gt;                end;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_OnMaxPokerFlush&lt;br /&gt;// 功　　能：將牌形 同花 的最大五張牌抓出來&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule._OnMaxPokerFlush;&lt;br /&gt;var&lt;br /&gt;        i : integer;&lt;br /&gt;        nListIndex : integer;&lt;br /&gt;        nNum : integer;&lt;br /&gt;        nCategory : integer;&lt;br /&gt;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        nCategory := _GetFlushIndex();&lt;br /&gt;&lt;br /&gt;        for i := m_CardDataList.Count - 1 downto 0 do begin&lt;br /&gt;            TmpCardData := m_CardDataList.GetItems(i);&lt;br /&gt;            if TmpCardData.Category = nCategory then begin&lt;br /&gt;                m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            if m_MaxRulePoker.Count = 5 then&lt;br /&gt;                Break;&lt;br /&gt;        end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_OnMaxPokerFullHouse&lt;br /&gt;// 功　　能：將牌形 葫蘆 的最大五張牌抓出來&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule._OnMaxPokerFullHouse;&lt;br /&gt;var&lt;br /&gt;        i: integer;&lt;br /&gt;        j: integer;&lt;br /&gt;        nMaxThreeKind : integer;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;        // 抓最大的三條&lt;br /&gt;        for i := High(m_aSumIndex) downto 1 do begin&lt;br /&gt;            if m_aSumIndex[i] = 3 then begin&lt;br /&gt;&lt;br /&gt;                for j := m_CardDataList.Count - 1 downto 0 do begin&lt;br /&gt;                    TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;                    if TmpCardData.Index = i then begin&lt;br /&gt;                        m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;                    end;&lt;br /&gt;&lt;br /&gt;                    if m_MaxRulePoker.Count = 3 then&lt;br /&gt;                        Break;&lt;br /&gt;                end;&lt;br /&gt;                nMaxThreeKind := i;&lt;br /&gt;                Break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 抓最大的對子&lt;br /&gt;        for i := High(m_aSumIndex) downto 1 do begin&lt;br /&gt;            if m_aSumIndex[i] &amp;gt;= 2 then begin&lt;br /&gt;                if i = nMaxThreeKind then begin&lt;br /&gt;                    continue;&lt;br /&gt;                end;&lt;br /&gt;&lt;br /&gt;                for j := m_CardDataList.Count - 1 downto 0 do begin&lt;br /&gt;                    TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;                    if TmpCardData.Index = i then begin&lt;br /&gt;                        m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;                    end;&lt;br /&gt;&lt;br /&gt;                    if m_MaxRulePoker.Count = 5 then begin&lt;br /&gt;                        Exit;&lt;br /&gt;                    end;&lt;br /&gt;                end;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_OnMaxPokerFourKind&lt;br /&gt;// 功　　能：將牌形 鐵支 的最大五張牌抓出來&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule._OnMaxPokerFourKind;&lt;br /&gt;var&lt;br /&gt;        i: integer;&lt;br /&gt;        j: integer;&lt;br /&gt;        nMaxFourKind : integer;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;        // 抓最大的鐵支四張&lt;br /&gt;        for i := High(m_aSumIndex) downto 1 do begin&lt;br /&gt;            if m_aSumIndex[i] = 4 then begin&lt;br /&gt;&lt;br /&gt;                for j := m_CardDataList.Count - 1 downto 0 do begin&lt;br /&gt;                    TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;                    if TmpCardData.Index = i then begin&lt;br /&gt;                        m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;                    end;&lt;br /&gt;&lt;br /&gt;                    if m_MaxRulePoker.Count = 4 then&lt;br /&gt;                        Break;&lt;br /&gt;                end;&lt;br /&gt;                nMaxFourKind := i;&lt;br /&gt;                Break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 抓滿五張&lt;br /&gt;        for j := m_CardDataList.Count - 1 downto 0 do begin&lt;br /&gt;            TmpCardData := m_CardDataList.GetItems(j);&lt;br /&gt;            if TmpCardData.Index = nMaxFourKind then begin&lt;br /&gt;                Continue;&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;            if m_MaxRulePoker.Count = 5 then begin&lt;br /&gt;                Break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_OnMaxPokerStraightFlush&lt;br /&gt;// 功　　能：將牌形 同花順 的最大五張牌抓出來&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuPokerRule._OnMaxPokerStraightFlush;&lt;br /&gt;var&lt;br /&gt;        i : integer;&lt;br /&gt;&lt;br /&gt;        nCardDataIndex : integer;&lt;br /&gt;        nCardDataNextIndex : Integer;&lt;br /&gt;        nCountStraight : integer;&lt;br /&gt;        nMaxCountStraight : integer;&lt;br /&gt;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;        TmpCardDataNext : TCardData;&lt;br /&gt;&lt;br /&gt;        nCategory : integer;&lt;br /&gt;begin&lt;br /&gt;        _debug_LogPoker();&lt;br /&gt;&lt;br /&gt;        nCategory := _GetFlushIndex();&lt;br /&gt;&lt;br /&gt;        &lt;br /&gt;        nCountStraight := 0;&lt;br /&gt;        nMaxCountStraight := 0;&lt;br /&gt;&lt;br /&gt;        nCardDataIndex := m_CardDataList.Count - 1;&lt;br /&gt;        for i := m_CardDataList.Count - 1 downto 1 do begin&lt;br /&gt;&lt;br /&gt;            TmpCardData := m_CardDataList.GetItems(nCardDataIndex);&lt;br /&gt;            while TmpCardData.Category &amp;lt;&amp;gt; nCategory do begin&lt;br /&gt;                nCardDataIndex := nCardDataIndex - 1;&lt;br /&gt;                TmpCardData := m_CardDataList.GetItems(nCardDataIndex);&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            nCardDataNextIndex := nCardDataIndex - 1;&lt;br /&gt;            TmpCardDataNext := m_CardDataList.GetItems(nCardDataNextIndex);&lt;br /&gt;            while (nCardDataNextIndex &amp;gt; 0 ) And&lt;br /&gt;                (TmpCardDataNext.Category &amp;lt;&amp;gt; nCategory) do begin&lt;br /&gt;                nCardDataNextIndex := nCardDataNextIndex - 1;&lt;br /&gt;                TmpCardDataNext := m_CardDataList.GetItems(nCardDataNextIndex);&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            // 先加入第一張牌&lt;br /&gt;            if m_MaxRulePoker.Count = 0 then&lt;br /&gt;                m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;&lt;br /&gt;//            同樣花色不可能數字一樣 // 如果 兩張牌面數字一樣 換下一張&lt;br /&gt;//            while TmpCardData.Index = (TmpCardDataNext.Index ) do begin&lt;br /&gt;//                nCardDataNextIndex := nCardDataNextIndex - 1;&lt;br /&gt;//                TmpCardDataNext := m_CardDataList[nCardDataNextIndex];&lt;br /&gt;//            end;&lt;br /&gt;&lt;br /&gt;            // 下一張是不是比前一張少一&lt;br /&gt;            if TmpCardData.Index = (TmpCardDataNext.Index + 1) then begin&lt;br /&gt;                m_MaxRulePoker.Add(TmpCardDataNext);&lt;br /&gt;            end else begin&lt;br /&gt;                m_MaxRulePoker.Clear;&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;            // 超過五張&lt;br /&gt;            if m_MaxRulePoker.Count = 5 then&lt;br /&gt;                Break;&lt;br /&gt;&lt;br /&gt;            nCardDataIndex := nCardDataNextIndex;&lt;br /&gt;//            nCardDataNextIndex := nCardDataNextIndex - 1;&lt;br /&gt;&lt;br /&gt;            if nCardDataIndex = 0 then begin&lt;br /&gt;                Break;&lt;br /&gt;            end;&lt;br /&gt;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 如果是小順 要另外處理A&lt;br /&gt;        if m_aSumRules[POKER_RULES_SMALL_STRAIGHT] &amp;lt;&amp;gt; 0 then begin&lt;br /&gt;            for i := m_CardDataList.Count - 1 downto 0 do begin&lt;br /&gt;                TmpCardData := m_CardDataList.GetItems(i);&lt;br /&gt;                if TmpCardData.Index = 13 then begin&lt;br /&gt;                    m_MaxRulePoker.Add(TmpCardData);&lt;br /&gt;                    break;&lt;br /&gt;                end;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：_GetFlushIndex&lt;br /&gt;// 功　　能：傳回同花的花色索引&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuPokerRule._GetFlushIndex: Integer;&lt;br /&gt;var&lt;br /&gt;        i:integer;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        Result := -1 ;&lt;br /&gt;        // 查一下什麼同花&lt;br /&gt;        for i := 0 to High(m_aCategory) do&lt;br /&gt;        begin&lt;br /&gt;            if( m_aCategory[i] &amp;gt;= 5 ) then&lt;br /&gt;            begin&lt;br /&gt;                Result := i;&lt;br /&gt;                break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        if Result = -1 then begin&lt;br /&gt;            Result := 0;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TuPokerRule._debug_LogPoker;&lt;br /&gt;var&lt;br /&gt;        i:Integer;&lt;br /&gt;        str:String;&lt;br /&gt;        strPoker:string;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;        exit;&lt;br /&gt;        str := '';&lt;br /&gt;        strPoker := '';&lt;br /&gt;        for i := m_CardDataList.Count -1 downto 0 do begin&lt;br /&gt;            TmpCardData := m_CardDataList.GetItems(i);&lt;br /&gt;            str := Format('%d ', [TmpCardData.Index] );&lt;br /&gt;            strPoker := strPoker + str;&lt;br /&gt;        end;&lt;br /&gt;        m_PokerRuleMessToFiles.m_WriteTXTOne(strPoker, 1);&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;應該感受的出來這一份代碼表現的緊張, 在時間壓力下寫出來的代碼實在是慘無人道丫!&lt;br /&gt;&lt;br /&gt;在接下來的C++版時會大力的改善 Switch 實在是個使用多型的好地方!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2825623828097532698?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2825623828097532698/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tupokerrule.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2825623828097532698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2825623828097532698'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tupokerrule.html' title='TuPokerRule - 分析牌型'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2439274701468429858</id><published>2010-02-11T15:41:00.000-08:00</published><updated>2010-02-11T15:41:14.450-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuCompositeImage</title><content type='html'>&lt;pre class="brush: cpp;"&gt;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;class CuCompositeImage&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    vector&amp;lt;IuImageEx*&amp;gt; _itsImage;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    int GetSize();&lt;br /&gt;    virtual IuImageEx* Get(int i){ return i &amp;lt; _itsImage.size() ? _itsImage[i] : NULL; }&lt;br /&gt;&lt;br /&gt;    void clear();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    void add(IuImageEx* pImage){ _itsImage.push_back(pImage); }&lt;br /&gt;    void push_back(IuImageEx* pImage){ _itsImage.push_back(pImage); }&lt;br /&gt;&lt;br /&gt;    CuCompositeImage();&lt;br /&gt;    virtual ~CuCompositeImage();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuCompositeImage::CuCompositeImage()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuCompositeImage::~CuCompositeImage()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuCompositeImage::clear()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    IuImageEx *pImage;&lt;br /&gt;    vector&amp;lt;IuImageEx*&amp;gt;::iterator _itor; &lt;br /&gt;&lt;br /&gt;    _itor = _itsImage.begin();&lt;br /&gt;&lt;br /&gt;    while(  _itor != _itsImage.end() )&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        pImage = *(_itor++);&lt;br /&gt;        if( pImage )&lt;br /&gt;            pImage-&amp;gt;Release();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    _itsImage.clear();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuCompositeImage::GetSize()&lt;br /&gt;{&lt;br /&gt;    return _itsImage.size();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;在TuComposite還沒獨立出來之前, 每個需要Composite的部份都需要像上面這樣另外寫一份,也就是為何後來直接將Composite轉為Template的主要原因.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2439274701468429858?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2439274701468429858/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cucompositeimage.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2439274701468429858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2439274701468429858'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cucompositeimage.html' title='CuCompositeImage'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2700002017216174487</id><published>2010-02-10T15:30:00.001-08:00</published><updated>2010-02-10T15:30:29.955-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuFont</title><content type='html'>&lt;pre class="brush: cpp;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuFont  &lt;br /&gt;{&lt;br /&gt;    HDC m_hDC;&lt;br /&gt;    HFONT m_hFont;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    void Release();&lt;br /&gt;    void SetFontSize(int iFontSize);&lt;br /&gt;    CuFont(HDC hDC);&lt;br /&gt;    virtual ~CuFont();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    CuFont(){}&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuFont::CuFont(HDC hDC):&lt;br /&gt;m_hFont(NULL)&lt;br /&gt;{&lt;br /&gt;    m_hDC = hDC;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuFont::~CuFont()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if( m_hDC )&lt;br /&gt;        Release();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuFont::SetFontSize(int iFontSize)&lt;br /&gt;{&lt;br /&gt;    if( !m_hDC )&lt;br /&gt;        return;&lt;br /&gt;&lt;br /&gt;    HFONT hFontCreated = NULL;&lt;br /&gt;    HFONT hFont = (HFONT) GetStockObject(SYSTEM_FONT);&lt;br /&gt;&lt;br /&gt;    hFontCreated = CuFontManager::Instance()-&amp;gt;GetFontHandle(hFont, iFontSize);&lt;br /&gt;&lt;br /&gt;    m_hFont = (HFONT)::SelectObject(m_hDC, hFontCreated);&lt;br /&gt;&lt;br /&gt;    DeleteObject(hFont);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuFont::Release()&lt;br /&gt;{&lt;br /&gt;    if( m_hDC &amp;&amp; m_hFont )&lt;br /&gt;    {&lt;br /&gt;        HFONT hFontCreated = (HFONT)::SelectObject(m_hDC, m_hFont);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    m_hDC = NULL;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2700002017216174487?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2700002017216174487/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cufont.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2700002017216174487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2700002017216174487'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cufont.html' title='CuFont'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-931986499218529667</id><published>2010-02-09T15:17:00.000-08:00</published><updated>2010-02-09T15:17:54.351-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuTimeZone -</title><content type='html'>&lt;pre class="brush: cpp;"&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define RV_TIMEZONES    TEXT("Time Zones")&lt;br /&gt;#define RK_CLOCK        TEXT("Software\\Microsoft\\Clock")&lt;br /&gt;#define RV_INDST        TEXT("HomeDST")                     // are we currently in DST&lt;br /&gt;#define RV_AUTODST      TEXT("AutoDST")&lt;br /&gt;#define RV_DSTUI        TEXT("ShowDSTUI") &lt;br /&gt;#define RV_TIMEZONES    TEXT("Time Zones")&lt;br /&gt;#define RV_DISPLAY      TEXT("Display")&lt;br /&gt;#define RV_TZI          TEXT("TZI")&lt;br /&gt;#define RV_DLT          TEXT("Dlt")&lt;br /&gt;#define RV_STD          TEXT("Std")&lt;br /&gt;&lt;br /&gt;#define ZoneHasDaylightTime(tzi)    (tzi.DaylightDate.wMonth &amp;&amp; tzi.DaylightBias)&lt;br /&gt;&lt;br /&gt;struct TZREG {&lt;br /&gt;    LONG    Bias;&lt;br /&gt;    LONG    StandardBias;&lt;br /&gt;    LONG    DaylightBias;&lt;br /&gt;    SYSTEMTIME StandardDate;&lt;br /&gt;    SYSTEMTIME DaylightDate;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class CuTimeZone&lt;br /&gt;{&lt;br /&gt;    TIME_ZONE_INFORMATION m_TimeZoneInformation;&lt;br /&gt;&lt;br /&gt;    vector&amp;lt;wstring&amp;gt; m_vecTimeZoneList;&lt;br /&gt;    wstring m_strCurrZone;&lt;br /&gt;    int m_nCurrZone;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuTimeZone();&lt;br /&gt;    virtual ~CuTimeZone();&lt;br /&gt;&lt;br /&gt;    void Init();&lt;br /&gt;    vector&amp;lt;wstring&amp;gt; &amp;GetTimeZoneList(void);&lt;br /&gt;&lt;br /&gt;    wstring GetCurrZone(){ return m_strCurrZone; }&lt;br /&gt;    int GetCurrZoneIndex(){ return m_nCurrZone; }&lt;br /&gt;&lt;br /&gt;    void SetCurrZone(int nCurrZone);&lt;br /&gt;    void SetCurrZone(wstring strCurrZone);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;CuTimeZone::~CuTimeZone()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuTimeZone::CuTimeZone()&lt;br /&gt;{&lt;br /&gt;    CReg   Reg1(HKEY_LOCAL_MACHINE, RV_TIMEZONES), Reg2;&lt;br /&gt;&lt;br /&gt;    TCHAR  szTimeZone[64];&lt;br /&gt;    TCHAR  szTimeZoneStd[64];&lt;br /&gt;    &lt;br /&gt;//  TIME_ZONE_INFORMATION tziCurrent;&lt;br /&gt;    DWORD tzid = GetTimeZoneInformation(&amp;m_TimeZoneInformation);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // Get DAYLIGHT States&lt;br /&gt;    BOOL fInDST = (TIME_ZONE_ID_DAYLIGHT == tzid );&lt;br /&gt;&lt;br /&gt;    CReg reg(HKEY_LOCAL_MACHINE, RK_CLOCK);&lt;br /&gt;    reg.SetDW(RV_DSTUI, 1);&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;    while(Reg1.EnumKey(szTimeZone,64))&lt;br /&gt;    {&lt;br /&gt;        LPTSTR szTemp;&lt;br /&gt;        Reg2.Reset();&lt;br /&gt;        &lt;br /&gt;        if(Reg2.Open(Reg1,szTimeZone))&lt;br /&gt;        {&lt;br /&gt;        &lt;br /&gt;            // use the display name rather than the standard name &lt;br /&gt;            szTemp = (LPTSTR)Reg2.ValueSZ(RV_DISPLAY);&lt;br /&gt;&lt;br /&gt;            Reg2.ValueSZ(RV_STD, szTimeZoneStd, sizeof(szTimeZoneStd));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            if(szTemp &amp;&amp; &lt;br /&gt;                    ( !lstrcmp(szTimeZone, m_TimeZoneInformation.StandardName) ||&lt;br /&gt;                      !lstrcmp(szTimeZoneStd, m_TimeZoneInformation.StandardName) )&lt;br /&gt;                )&lt;br /&gt;            {&lt;br /&gt;                //lstrcpy(szZoneCurr,szTemp);&lt;br /&gt;                m_nCurrZone = m_vecTimeZoneList.size();&lt;br /&gt;                m_strCurrZone = szTemp;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            m_vecTimeZoneList.push_back(szTemp);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;vector&amp;lt;wstring&amp;gt; &amp;CuTimeZone::GetTimeZoneList(void)&lt;br /&gt;{&lt;br /&gt;    return m_vecTimeZoneList;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuTimeZone::SetCurrZone(int nCurrZone)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    wstring strCurrZone = m_vecTimeZoneList[nCurrZone];&lt;br /&gt;    SetCurrZone(strCurrZone);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuTimeZone::SetCurrZone(wstring strCurrZone)&lt;br /&gt;{&lt;br /&gt;    // Iterate over all timezones. Init new timezone to current just in case &lt;br /&gt;    TCHAR   szTimeZone[32];&lt;br /&gt;    CReg    Reg1(HKEY_LOCAL_MACHINE, RV_TIMEZONES), Reg2;&lt;br /&gt;    CReg reg(HKEY_LOCAL_MACHINE, RK_CLOCK);&lt;br /&gt;    BOOL fUseDST =  ZoneHasDaylightTime(m_TimeZoneInformation);&lt;br /&gt;&lt;br /&gt;    reg.SetDW(RV_AUTODST, fUseDST);&lt;br /&gt;    while(Reg1.EnumKey(szTimeZone,32))&lt;br /&gt;    {&lt;br /&gt;        Reg2.Reset();&lt;br /&gt;        if(Reg2.Open(Reg1,szTimeZone))&lt;br /&gt;        {&lt;br /&gt;            // if the display name matches the one in the combobox get the TZI data.&lt;br /&gt;            if(!lstrcmp(strCurrZone.c_str(), Reg2.ValueSZ(RV_DISPLAY)))&lt;br /&gt;            {&lt;br /&gt;                TZREG  *pTZR = (TZREG*)Reg2.ValueBinary(RV_TZI);&lt;br /&gt;                if(pTZR)&lt;br /&gt;                {&lt;br /&gt;                    m_TimeZoneInformation.Bias = pTZR-&amp;gt;Bias;&lt;br /&gt;                    m_TimeZoneInformation.StandardBias = pTZR-&amp;gt;StandardBias;&lt;br /&gt;                    m_TimeZoneInformation.DaylightBias = pTZR-&amp;gt;DaylightBias;&lt;br /&gt;                    m_TimeZoneInformation.StandardDate = pTZR-&amp;gt;StandardDate;&lt;br /&gt;                    m_TimeZoneInformation.DaylightDate = pTZR-&amp;gt;DaylightDate;&lt;br /&gt;                            &lt;br /&gt;                    Reg2.ValueSZ(RV_DLT, m_TimeZoneInformation.DaylightName, 32);&lt;br /&gt;                    lstrcpy(m_TimeZoneInformation.StandardName, szTimeZone);&lt;br /&gt;&lt;br /&gt;                    m_strCurrZone = strCurrZone;&lt;br /&gt;                    break;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    SetTimeZoneInformation(&amp;m_TimeZoneInformation);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;很特別的程式片段, 從APP裡移出來後就沒在理他, 等他被review 或需要改動功能時, 在來調整了&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-931986499218529667?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/931986499218529667/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cutimezone.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/931986499218529667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/931986499218529667'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cutimezone.html' title='CuTimeZone -'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-9145478587306799886</id><published>2010-02-08T15:00:00.000-08:00</published><updated>2010-02-08T15:00:00.431-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuFontManager</title><content type='html'>&lt;pre class="brush: cpp;"&gt;&lt;br /&gt;&lt;br /&gt;// CuFontManager.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuFontManager  &lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt;    static  CuFontManager   m_pInstance; &lt;br /&gt;    map&amp;lt;int, HFONT&amp;gt;       m_mapFontHandle;&lt;br /&gt;&lt;br /&gt;    CuFontManager();&lt;br /&gt;public:&lt;br /&gt;    virtual ~CuFontManager();&lt;br /&gt;&lt;br /&gt;    static CuFontManager *Instance()&lt;br /&gt;    {&lt;br /&gt;        return &amp;m_pInstance;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    HFONT GetFontHandle(HFONT hFont,int iFontSize);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuFontManager.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuFontManager CuFontManager::m_pInstance;&lt;br /&gt;&lt;br /&gt;CuFontManager::CuFontManager()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuFontManager::~CuFontManager()&lt;br /&gt;{&lt;br /&gt;    map&amp;lt;int, HFONT&amp;gt;::iterator it;&lt;br /&gt;&lt;br /&gt;    for(it = m_mapFontHandle.begin(); it != m_mapFontHandle.end(); it++) {&lt;br /&gt;        HFONT hFontCreated = it-&amp;gt;second;&lt;br /&gt;        DeleteObject(hFontCreated);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    m_mapFontHandle.clear();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;HFONT CuFontManager::GetFontHandle(HFONT hFont,int iFontSize)&lt;br /&gt;{&lt;br /&gt;    HFONT hFontCreated;&lt;br /&gt;    LOGFONT lf;&lt;br /&gt;    map&amp;lt;int, HFONT&amp;gt;::const_iterator it;&lt;br /&gt;&lt;br /&gt;    it = m_mapFontHandle.find(iFontSize);&lt;br /&gt;&lt;br /&gt;    if(it == m_mapFontHandle.end()) {&lt;br /&gt;        if (GetObject(hFont, sizeof LOGFONT, &amp;lf)) {&lt;br /&gt;            HDC hDC;&lt;br /&gt;&lt;br /&gt;            hDC = ::GetDC(NULL);&lt;br /&gt;            lf.lfHeight=-((iFontSize * GetDeviceCaps(hDC, LOGPIXELSY)) / 72);&lt;br /&gt;            lf.lfWeight = FW_SEMIBOLD;&lt;br /&gt;&lt;br /&gt;            hFontCreated = CreateFontIndirect(&amp;lf);&lt;br /&gt;            m_mapFontHandle.insert(map&amp;lt;int, HFONT&amp;gt;::value_type(iFontSize, hFontCreated));&lt;br /&gt;            ReleaseDC(NULL, hDC);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;        hFontCreated = it-&amp;gt;second;&lt;br /&gt;&lt;br /&gt;    return hFontCreated;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-9145478587306799886?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/9145478587306799886/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cufontmanager.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/9145478587306799886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/9145478587306799886'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cufontmanager.html' title='CuFontManager'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-5211060365257606193</id><published>2010-02-07T16:35:00.001-08:00</published><updated>2010-02-07T16:37:28.251-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuLight</title><content type='html'>&lt;pre class="brush: cpp;"&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuLight  &lt;br /&gt;{&lt;br /&gt;    // CuLight 一實體後預存的值&lt;br /&gt;    // 在解構時會將這個值寫回registey&lt;br /&gt;    int m_nDefaultValue;&lt;br /&gt;&lt;br /&gt;    LIGHT_INCVALUE  m_pfIncValue;&lt;br /&gt;    LIGHT_DECVALUE  m_pfDecValue;&lt;br /&gt;    LIGHT_GETVALUE  m_pfGetValue;&lt;br /&gt;    LIGHT_SETVALUE  m_pfSetValue;&lt;br /&gt;&lt;br /&gt;    LIGHT_GETMAXSTEP m_pfGetMaxStep;&lt;br /&gt;&lt;br /&gt;    CuDllManager m_LightDll;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    wstring strDllfile;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    CuLight();&lt;br /&gt;    virtual ~CuLight(); &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    void Init();&lt;br /&gt;    int OnGetValue(void);&lt;br /&gt;    void OnSetValue(int n);&lt;br /&gt;&lt;br /&gt;    void OnDecValue();&lt;br /&gt;    void OnIncValue();&lt;br /&gt;    void OnSave(){ m_nDefaultValue = OnGetValue(); }&lt;br /&gt;&lt;br /&gt;    int OnGetMaxStep(){ return m_pfGetMaxStep(); }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuLight::CuLight()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuLight::~CuLight()&lt;br /&gt;{&lt;br /&gt;    OnSetValue(m_nDefaultValue);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuLight::Init()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    CuFile f;&lt;br /&gt;    wstring strFile = f.GetModuleFileName(strDllfile.c_str());&lt;br /&gt;&lt;br /&gt;    Verify(m_LightDll.LoadLibrary(strFile.c_str()) != NULL, L"can't Load Light_dll.dll Error");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    m_pfIncValue = (LIGHT_INCVALUE)m_LightDll.GetProcAddress(L"IncValue");&lt;br /&gt;    Assert(m_pfIncValue != NULL, L"can't Load LIGHT_INCVALUE");&lt;br /&gt;&lt;br /&gt;    m_pfDecValue = (LIGHT_DECVALUE)m_LightDll.GetProcAddress(L"DecValue");&lt;br /&gt;    Assert(m_pfDecValue != NULL, L"can't Load LIGHT_DECVALUE");&lt;br /&gt;&lt;br /&gt;    m_pfGetValue = (LIGHT_GETVALUE)m_LightDll.GetProcAddress(L"GetValue");&lt;br /&gt;    Assert(m_pfGetValue != NULL, L"can't Load LIGHT_GETVALUE");&lt;br /&gt;&lt;br /&gt;    m_pfSetValue = (LIGHT_SETVALUE)m_LightDll.GetProcAddress(L"SetValue");&lt;br /&gt;    Assert(m_pfSetValue != NULL, L"can't Load LIGHT_SETVALUE");&lt;br /&gt;&lt;br /&gt;    m_pfGetMaxStep = (LIGHT_GETMAXSTEP)m_LightDll.GetProcAddress(L"GetMaxStep");&lt;br /&gt;    Assert(m_pfGetMaxStep != NULL, L"can't Load LIGHT_GETMAXSTEP");&lt;br /&gt;&lt;br /&gt;    m_nDefaultValue = OnGetValue();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuLight::OnGetValue(void)&lt;br /&gt;{ &lt;br /&gt;    int value;&lt;br /&gt;    value = m_pfGetValue(); &lt;br /&gt;    return value;&lt;br /&gt;}&lt;br /&gt;void CuLight::OnSetValue(int n)&lt;br /&gt;{ &lt;br /&gt;    m_pfSetValue(n); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuLight::OnDecValue()&lt;br /&gt;{&lt;br /&gt;    m_pfDecValue(); &lt;br /&gt;&lt;br /&gt;    int value;&lt;br /&gt;    value = m_pfGetValue(); &lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuLight::OnIncValue()&lt;br /&gt;{&lt;br /&gt;    m_pfIncValue(); &lt;br /&gt;    int value;&lt;br /&gt;    value = m_pfGetValue(); &lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;CE沒有標準, 所以定個介面元件對不同的機器實作獨一的DLL檔! 在設定檔裡指定要載入那一份DLL!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-5211060365257606193?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/5211060365257606193/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/culight.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5211060365257606193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5211060365257606193'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/culight.html' title='CuLight'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-7886994087791825172</id><published>2010-02-06T15:00:00.000-08:00</published><updated>2010-02-06T15:00:01.565-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuWinAppEx</title><content type='html'>&lt;pre class="brush: cpp;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuWinAppEx.h&lt;br /&gt;&lt;br /&gt;class CuWinAppEx&lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt;    static CuWinAppEx *m_pWinApp;&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;&lt;br /&gt;    class CuMainWnd : public CuWnd&lt;br /&gt;    {&lt;br /&gt;        virtual LRESULT OnMsg(MSG &amp;msg)&lt;br /&gt;        {&lt;br /&gt;            return CuWinAppEx::GetTheApp()-&amp;gt;OnMsg(msg);&lt;br /&gt;        };&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    CuMainWnd m_MainWnd;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuWinAppEx(void);&lt;br /&gt;    virtual ~CuWinAppEx(void);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    static CuWinAppEx* GetTheApp(); &lt;br /&gt;    virtual LRESULT OnMsg(MSG &amp; msg);&lt;br /&gt;    virtual BOOL Run();&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    int OnDestroy(void);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuWinAppEx.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuWinAppEx *CuWinAppEx::m_pWinApp;&lt;br /&gt;&lt;br /&gt;CuWinAppEx::CuWinAppEx(void)&lt;br /&gt;{&lt;br /&gt;    m_pWinApp = this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuWinAppEx::~CuWinAppEx(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuWinAppEx* CuWinAppEx::GetTheApp()&lt;br /&gt;{&lt;br /&gt;    return m_pWinApp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;LRESULT CuWinAppEx::OnMsg(MSG &amp; msg)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    switch(msg.message)&lt;br /&gt;    {&lt;br /&gt;    case WM_DESTROY:&lt;br /&gt;        OnDestroy();&lt;br /&gt;        break;&lt;br /&gt;&lt;br /&gt;    default:&lt;br /&gt;        return FALSE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuWinAppEx::OnDestroy(void)&lt;br /&gt;{&lt;br /&gt;     ::PostQuitMessage(0);&lt;br /&gt;&lt;br /&gt;     return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BOOL CuWinAppEx::Run()&lt;br /&gt;{&lt;br /&gt;    MSG msg;&lt;br /&gt;&lt;br /&gt;    // Main message loop:&lt;br /&gt;    while (GetMessage(&amp;msg, NULL, 0, 0)) &lt;br /&gt;    {&lt;br /&gt;        //      if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) &lt;br /&gt;        {&lt;br /&gt;            TranslateMessage(&amp;msg);&lt;br /&gt;            DispatchMessage(&amp;msg);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return msg.wParam;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;雖然函式裡有virtual 但有時後並不代表這個類別是打算被繼承的, 有一半是這個類別繼承了別人, 但在解構式定為virtual就表示, 這個類別100%是可以被繼承的, 或是一定要被繼承!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-7886994087791825172?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/7886994087791825172/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuwinappex.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7886994087791825172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7886994087791825172'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuwinappex.html' title='CuWinAppEx'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2822485125321944046</id><published>2010-02-05T15:00:00.000-08:00</published><updated>2010-02-05T16:19:14.436-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>IuImageEx</title><content type='html'>&lt;pre class="brush: cpp;"&gt;class IuImageEx : public IuUnknown&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    virtual BOOL    Create( int nWidth, int nHeight, int nBPP = 16) = 0;&lt;br /&gt;&lt;br /&gt;    virtual BYTE*   Data(void) = 0; &lt;br /&gt;&lt;br /&gt;    virtual UINT    Height() = 0;&lt;br /&gt;    virtual void    Height(UINT nHeight) = 0;&lt;br /&gt;&lt;br /&gt;    virtual UINT    Width() = 0;&lt;br /&gt;    virtual void    Width(UINT nWidth) = 0;&lt;br /&gt;&lt;br /&gt;    virtual UINT    BitCount() = 0;&lt;br /&gt;    virtual void    BitCount(UINT nBitCount) = 0;&lt;br /&gt;&lt;br /&gt;    virtual COLORREF GetPixel( int x, int y) = 0;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;圖型編碼太多種, 但實際使用時, 也只有用到部份函式, 整個拉出介面時, 才發現用到的不多!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2822485125321944046?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2822485125321944046/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/iuimageex.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2822485125321944046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2822485125321944046'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/iuimageex.html' title='IuImageEx'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-7037092014742034584</id><published>2010-02-04T15:00:00.000-08:00</published><updated>2010-02-04T15:20:59.407-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>IuImageWnd</title><content type='html'>&lt;pre class="brush: cpp;"&gt;class IuImageWnd : public IuImageEx&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    virtual HDC GetDC() = 0;&lt;br /&gt;    virtual void ReleaseDC() = 0;&lt;br /&gt;&lt;br /&gt;    virtual BOOL BitBlt( HDC hDestDC, int xDest, int yDest, int nDestWidth, &lt;br /&gt;        int nDestHeight, int xSrc, int ySrc, DWORD dwROP = SRCCOPY ) = 0;&lt;br /&gt;&lt;br /&gt;    virtual BOOL StretchBlt( HDC hDestDC, int xDest, int yDest, &lt;br /&gt;        int nDestWidth, int nDestHeight, int xSrc, int ySrc, int nSrcWidth, &lt;br /&gt;        int nSrcHeight, DWORD dwROP = SRCCOPY ) = 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    virtual operator HBITMAP() const = 0;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;不管學院派對介面的定義為何! 在這裡介面獨立最好的地方是, 看起來就是輕巧, 使用起來壓力會小很多, 不必為了看到源碼或是太多功能搞的自己頭大!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-7037092014742034584?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/7037092014742034584/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/iuimagewnd.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7037092014742034584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7037092014742034584'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/iuimagewnd.html' title='IuImageWnd'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-1138246123712905989</id><published>2010-02-03T15:00:00.000-08:00</published><updated>2010-02-03T17:00:35.345-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuImageEx</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// CuImageEx.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuImageEx : public IuImageEx &lt;br /&gt;{&lt;br /&gt;    //圖高&lt;br /&gt;    UINT    _nHeight;&lt;br /&gt;&lt;br /&gt;    //圖寬&lt;br /&gt;    UINT    _nWidth;&lt;br /&gt;&lt;br /&gt;    // 圖的色素  :  16  &lt;br /&gt;    UINT    _nBitCount;&lt;br /&gt;&lt;br /&gt;    // 存放 圖形點陣列&lt;br /&gt;    BYTE    *_bits;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuImageEx();&lt;br /&gt;    virtual ~CuImageEx();&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////&lt;br /&gt;    // IuUnknown 公開虛擬界面 &lt;br /&gt;    virtual ULONG Release();&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////&lt;br /&gt;    // IuImage 公開虛擬界面 &lt;br /&gt;    virtual BOOL Create(int nWidth, int nHeight, int nBPP = 16);&lt;br /&gt;&lt;br /&gt;    virtual UINT    Height(){ return _nHeight; }&lt;br /&gt;    virtual void    Height(UINT nHeight){ _nHeight = nHeight; }&lt;br /&gt;&lt;br /&gt;    virtual UINT    Width(){ return _nWidth; }&lt;br /&gt;    virtual void    Width(UINT nWidth){ _nWidth = nWidth; }&lt;br /&gt;&lt;br /&gt;    virtual UINT    BitCount(){ return _nBitCount; }&lt;br /&gt;    virtual void    BitCount(UINT nBitCount){ _nBitCount = nBitCount; }&lt;br /&gt;&lt;br /&gt;    virtual COLORREF GetPixel( int x, int y);&lt;br /&gt;    virtual BYTE*   Data(void){ return _bits; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////&lt;br /&gt;    // 未公開虛擬界面 的 public 函式&lt;br /&gt;&lt;br /&gt;    void Data(BYTE *pDate){ _bits = pDate; }&lt;br /&gt;&lt;br /&gt;    void Destroy();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    CuImageEx&amp; operator =(CuImageEx&amp; img);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;// CuImageEx.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuImageEx::CuImageEx()&lt;br /&gt;:_nHeight(0)&lt;br /&gt;,_nWidth(0)&lt;br /&gt;,_nBitCount(0)&lt;br /&gt;,_bits(NULL)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuImageEx::~CuImageEx()&lt;br /&gt;{&lt;br /&gt;    Destroy();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ULONG CuImageEx::Release()&lt;br /&gt;{&lt;br /&gt;    delete this;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuImageEx::Create(int nWidth, int nHeight, int nBPP)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    Destroy();&lt;br /&gt;&lt;br /&gt;    Height(nHeight);&lt;br /&gt;    Width(nWidth);&lt;br /&gt;    BitCount(nBPP);&lt;br /&gt;&lt;br /&gt;    _bits = new BYTE[nWidth * nHeight * (nBPP &amp;gt;&amp;gt; 3)];&lt;br /&gt;&lt;br /&gt;    return (_bits != NULL);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuImageEx::Destroy()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    Height(0);&lt;br /&gt;    Width(0);&lt;br /&gt;    BitCount(0);&lt;br /&gt;&lt;br /&gt;    delete [] _bits;&lt;br /&gt;    _bits = NULL;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;COLORREF CuImageEx::GetPixel( int x, int y)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    WORD *pBits = (WORD*)this-&amp;gt;Data();&lt;br /&gt;&lt;br /&gt;    if( !pBits )&lt;br /&gt;        return RGB(0, 0, 0);&lt;br /&gt;&lt;br /&gt;    int nW = Width() ;&lt;br /&gt;&lt;br /&gt;    // &lt;br /&gt;    if( nW % 2 )&lt;br /&gt;        nW++;&lt;br /&gt;&lt;br /&gt;    WORD wPixel = pBits[y * nW + x];&lt;br /&gt;&lt;br /&gt;    return RGB( (wPixel &amp;gt;&amp;gt; 10 ) &amp; 0x1f,&lt;br /&gt;        (wPixel &amp;gt;&amp;gt; 5) &amp; 0x1f,&lt;br /&gt;        wPixel &amp; 0x1f);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuImageEx&amp; CuImageEx::operator =(CuImageEx&amp; img)&lt;br /&gt;{&lt;br /&gt;    &lt;br /&gt;    if( this == &amp;img )&lt;br /&gt;        return *this;&lt;br /&gt;    &lt;br /&gt;    this-&amp;gt;Create(img.Width() , img.Height(), img.BitCount() );&lt;br /&gt;&lt;br /&gt;    memcpy(_bits, img._bits, _nWidth  * _nHeight * ( _nBitCount &amp;gt;&amp;gt; 3 ) );&lt;br /&gt;        &lt;br /&gt;    return *this;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;與CuImageWnd 相異的地方在於, 若已經有一份點陣DC時, 其實其他的圖型運算是可以使用自製效能優化過的元件! 在這裡縮小圖結構方便替換運算元件!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-1138246123712905989?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/1138246123712905989/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuimageex.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1138246123712905989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1138246123712905989'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuimageex.html' title='CuImageEx'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2294681189831609567</id><published>2010-02-02T15:00:00.000-08:00</published><updated>2010-02-03T15:02:48.306-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuImageWnd</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// CuImageWnd.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuImageWnd : public IuImageWnd&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    // Image 的控制代碼&lt;br /&gt;    HBITMAP m_hBitmap;&lt;br /&gt;&lt;br /&gt;    // GetDC 時　暫存用的控制代碼&lt;br /&gt;    HBITMAP m_hOldBitmap;&lt;br /&gt;&lt;br /&gt;    // GetDC 時　暫存的DC控制代碼&lt;br /&gt;    HDC m_hDC;&lt;br /&gt;&lt;br /&gt;    // DC使用參考計數&lt;br /&gt;    UINT m_nDCRefCount;&lt;br /&gt;&lt;br /&gt;    CuImageEx m_ImageEx;&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;    CuImageWnd();&lt;br /&gt;    virtual ~CuImageWnd();&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////&lt;br /&gt;    // IuUnknown 公開虛擬界面 &lt;br /&gt;    virtual ULONG Release();&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////&lt;br /&gt;    // IuImage 公開虛擬界面 &lt;br /&gt;    virtual BOOL Create( int nWidth, int nHeight, int nBPP);&lt;br /&gt;&lt;br /&gt;    virtual UINT    Height(){ return m_ImageEx.Height(); }&lt;br /&gt;    virtual void    Height(UINT nHeight){ m_ImageEx.Height(nHeight); }&lt;br /&gt;&lt;br /&gt;    virtual UINT    Width(){ return m_ImageEx.Width(); }&lt;br /&gt;    virtual void    Width(UINT nWidth){ m_ImageEx.Width(nWidth); }&lt;br /&gt;&lt;br /&gt;    virtual UINT    BitCount(){ return m_ImageEx.BitCount(); }&lt;br /&gt;    virtual void    BitCount(UINT nBitCount){ m_ImageEx.BitCount(nBitCount); }&lt;br /&gt;&lt;br /&gt;    virtual COLORREF GetPixel( int x, int y){ return m_ImageEx.GetPixel(x,y); }&lt;br /&gt;    virtual BYTE*   Data(void){ return m_ImageEx.Data(); }&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////&lt;br /&gt;    // IuImageWnd 公開虛擬界面 &lt;br /&gt;&lt;br /&gt;        // window 支援函式&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    virtual HDC GetDC();&lt;br /&gt;    virtual void ReleaseDC();&lt;br /&gt;&lt;br /&gt;    virtual BOOL BitBlt( HDC hDestDC, int xDest, int yDest, int nDestWidth, &lt;br /&gt;        int nDestHeight, int xSrc, int ySrc, DWORD dwROP = SRCCOPY );&lt;br /&gt;&lt;br /&gt;    virtual BOOL StretchBlt( HDC hDestDC, int xDest, int yDest, &lt;br /&gt;        int nDestWidth, int nDestHeight, int xSrc, int ySrc, int nSrcWidth, &lt;br /&gt;        int nSrcHeight, DWORD dwROP = SRCCOPY );&lt;br /&gt;&lt;br /&gt;    virtual operator HBITMAP() const;&lt;br /&gt;&lt;br /&gt;    ///////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////&lt;br /&gt;    // 未公開虛擬界面 的 public 函式&lt;br /&gt;    void Destroy();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuImageWnd.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuImageWnd::CuImageWnd()&lt;br /&gt;:m_hBitmap(NULL)&lt;br /&gt;,m_hOldBitmap(NULL)&lt;br /&gt;,m_hDC(NULL)&lt;br /&gt;,m_nDCRefCount(0)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuImageWnd::~CuImageWnd()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    Destroy();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ULONG CuImageWnd::Release()&lt;br /&gt;{&lt;br /&gt;    delete this;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuImageWnd::Create( int nWidth, int nHeight, int nBPP)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    Destroy();&lt;br /&gt;&lt;br /&gt;    BITMAPINFO  dibInfo;&lt;br /&gt;    dibInfo.bmiHeader.biBitCount = nBPP;&lt;br /&gt;    dibInfo.bmiHeader.biClrImportant = 0;&lt;br /&gt;    dibInfo.bmiHeader.biClrUsed = 0;&lt;br /&gt;    dibInfo.bmiHeader.biCompression = BI_RGB;&lt;br /&gt;    dibInfo.bmiHeader.biHeight = nHeight;&lt;br /&gt;    dibInfo.bmiHeader.biPlanes = 1;&lt;br /&gt;    dibInfo.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );&lt;br /&gt;    dibInfo.bmiHeader.biSizeImage = nWidth * nHeight * (nBPP &amp;gt;&amp;gt; 3 );&lt;br /&gt;    dibInfo.bmiHeader.biWidth = nWidth;&lt;br /&gt;    dibInfo.bmiHeader.biXPelsPerMeter = 0;&lt;br /&gt;    dibInfo.bmiHeader.biYPelsPerMeter = 0;&lt;br /&gt;    dibInfo.bmiColors[0].rgbBlue = 0;&lt;br /&gt;    dibInfo.bmiColors[0].rgbGreen = 0;&lt;br /&gt;    dibInfo.bmiColors[0].rgbRed = 0;&lt;br /&gt;    dibInfo.bmiColors[0].rgbReserved = 0;&lt;br /&gt;&lt;br /&gt;    Height(nHeight);&lt;br /&gt;    Width(nWidth);&lt;br /&gt;    BitCount(nBPP);&lt;br /&gt;&lt;br /&gt;    void* ppvBits ;//= Data();&lt;br /&gt;&lt;br /&gt;    m_hBitmap = ::CreateDIBSection(NULL, &amp;dibInfo, DIB_RGB_COLORS,&lt;br /&gt;        (void**)&amp;ppvBits, NULL, 0);&lt;br /&gt;&lt;br /&gt;    m_ImageEx.Data((BYTE*)ppvBits);&lt;br /&gt;    &lt;br /&gt;    return (BOOL)m_hBitmap;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuImageWnd::Destroy()&lt;br /&gt;{&lt;br /&gt;    if( m_hBitmap )&lt;br /&gt;    {&lt;br /&gt;        ::DeleteObject(m_hBitmap);&lt;br /&gt;        m_hBitmap = NULL;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    m_ImageEx.Data(0);&lt;br /&gt;&lt;br /&gt;    Height(0);&lt;br /&gt;    Width(0);&lt;br /&gt;    BitCount(0);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;HDC CuImageWnd::GetDC() &lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    Assert(m_hBitmap != NULL, L" CuImage::GetDC() m_hBitmap != NULL");&lt;br /&gt;    &lt;br /&gt;    m_nDCRefCount++;&lt;br /&gt;    if( m_hDC == NULL )&lt;br /&gt;    {&lt;br /&gt;        m_hDC = ::CreateCompatibleDC(NULL);&lt;br /&gt;        m_hOldBitmap = HBITMAP(::SelectObject( m_hDC, m_hBitmap ));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return m_hDC;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuImageWnd::ReleaseDC() &lt;br /&gt;{&lt;br /&gt;    HBITMAP hBitmap;&lt;br /&gt;&lt;br /&gt;    Assert( m_hDC != NULL, L"");&lt;br /&gt;&lt;br /&gt;    m_nDCRefCount--;&lt;br /&gt;    if( m_nDCRefCount == 0 )&lt;br /&gt;    {&lt;br /&gt;        hBitmap = HBITMAP( ::SelectObject( m_hDC, m_hOldBitmap ) );&lt;br /&gt;        Assert( hBitmap == m_hBitmap ,L"");&lt;br /&gt;        ::DeleteDC( m_hDC );&lt;br /&gt;        m_hDC = NULL;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BOOL CuImageWnd::StretchBlt( HDC hDestDC, int xDest, int yDest, &lt;br /&gt;    int nDestWidth, int nDestHeight, int xSrc, int ySrc, int nSrcWidth, &lt;br /&gt;    int nSrcHeight, DWORD dwROP ) &lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    BOOL bResult;&lt;br /&gt;&lt;br /&gt;    Assert( m_hBitmap != NULL, L"" );&lt;br /&gt;    Assert( hDestDC != NULL, L"" );&lt;br /&gt;&lt;br /&gt;    HDC hDC = this-&amp;gt;GetDC();&lt;br /&gt;&lt;br /&gt;    bResult = ::StretchBlt( hDestDC, xDest, yDest, nDestWidth, nDestHeight, hDC,&lt;br /&gt;        xSrc, ySrc, nSrcWidth, nSrcHeight, dwROP );&lt;br /&gt;&lt;br /&gt;    this-&amp;gt;ReleaseDC();&lt;br /&gt;&lt;br /&gt;    return( bResult );&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BOOL CuImageWnd::BitBlt( HDC hDestDC, int xDest, int yDest, int nDestWidth, &lt;br /&gt;    int nDestHeight, int xSrc, int ySrc, DWORD dwROP )&lt;br /&gt;{&lt;br /&gt;    BOOL bResult;&lt;br /&gt; &lt;br /&gt;    Assert( m_hBitmap != NULL, L"");&lt;br /&gt;    Assert( hDestDC != NULL, L"");&lt;br /&gt;&lt;br /&gt;    GetDC();&lt;br /&gt;&lt;br /&gt;    bResult = ::BitBlt( hDestDC, xDest, yDest, nDestWidth, nDestHeight, m_hDC, &lt;br /&gt;        xSrc, ySrc, dwROP );&lt;br /&gt;&lt;br /&gt;    ReleaseDC();&lt;br /&gt;&lt;br /&gt;    return( bResult );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuImageWnd::operator HBITMAP() const&lt;br /&gt;    { return m_hBitmap; }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;支援Windows 專用的部份函式型別轉換: HDC HBITMAP 當然還有最重要的 點陣資料集&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2294681189831609567?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2294681189831609567/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuimagewnd.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2294681189831609567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2294681189831609567'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuimagewnd.html' title='CuImageWnd'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-6524467511104957865</id><published>2010-02-01T15:00:00.000-08:00</published><updated>2010-02-01T19:14:54.661-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuWaitKeyEven - 等待外部文字檔標示的EVENT</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// CuWaitKeyEven.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuWaitKeyEven  &lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    CuWinThread *m_pProcessThread;&lt;br /&gt;public:&lt;br /&gt;    wstring m_strSys;&lt;br /&gt;&lt;br /&gt;    HANDLE  *_pHandleArray;&lt;br /&gt;&lt;br /&gt;    wstring *_pStrEven;&lt;br /&gt;&lt;br /&gt;    int _nNumEvent;&lt;br /&gt;&lt;br /&gt;    // 程式設定檔&lt;br /&gt;&lt;br /&gt;    CuWaitKeyEven();&lt;br /&gt;    virtual ~CuWaitKeyEven();&lt;br /&gt;&lt;br /&gt;    void Init();&lt;br /&gt;    static DWORD Process(LPVOID lpVoid);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuWaitKeyEven.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuWaitKeyEven::CuWaitKeyEven()&lt;br /&gt;:m_strSys(L"HardKey_sys.cfg")&lt;br /&gt;,_pHandleArray(NULL)&lt;br /&gt;,_nNumEvent(0)&lt;br /&gt;,_pStrEven(NULL)&lt;br /&gt;,m_pProcessThread(NULL)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuWaitKeyEven::~CuWaitKeyEven()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if( m_pProcessThread )&lt;br /&gt;    {&lt;br /&gt;        m_pProcessThread-&amp;gt;Delete();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if( _pHandleArray )&lt;br /&gt;    {&lt;br /&gt;        for( int i = 0 ; i &amp;lt; _nNumEvent ; i++ )&lt;br /&gt;        {&lt;br /&gt;            CloseHandle(_pHandleArray[i]);&lt;br /&gt;        }&lt;br /&gt;        delete [] _pHandleArray;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if( _pStrEven )&lt;br /&gt;        delete [] _pStrEven;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DWORD CuWaitKeyEven::Process(LPVOID lpVoid)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    CuWaitKeyEven *pWaitKeyEven = (CuWaitKeyEven *)lpVoid;&lt;br /&gt; &lt;br /&gt;    DWORD dwResult;&lt;br /&gt;    int nIndex;&lt;br /&gt;    while (1)&lt;br /&gt;    {&lt;br /&gt;        dwResult = WaitForMultipleObjects(pWaitKeyEven-&amp;gt;_nNumEvent, pWaitKeyEven-&amp;gt;_pHandleArray, FALSE, INFINITE);&lt;br /&gt;&lt;br /&gt;        keybd_event(VK_F12, 0, 0 ,0);&lt;br /&gt;        keybd_event(VK_F12, 0, KEYEVENTF_KEYUP,0);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        nIndex = dwResult - WAIT_OBJECT_0;&lt;br /&gt;&lt;br /&gt;        ResetEvent(pWaitKeyEven-&amp;gt;_pHandleArray[nIndex]);&lt;br /&gt;&lt;br /&gt;        PostMessage(GetTheApp()-&amp;gt;m_hWnd, WM_HR_PROCESS, (WPARAM)(void*)pWaitKeyEven-&amp;gt;_pStrEven[nIndex].c_str(), (LPARAM)pWaitKeyEven);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuWaitKeyEven::Init()&lt;br /&gt;{&lt;br /&gt;    &lt;br /&gt;    CuModuleFile mf;&lt;br /&gt;    wstring strTempSysName = mf.GetModuleFileName(m_strSys.c_str());&lt;br /&gt;&lt;br /&gt;    IuFileLex *pFileLex;&lt;br /&gt;    pFileLex = new CuFileLex;&lt;br /&gt;    &lt;br /&gt;    pFileLex-&amp;gt;Open(strTempSysName.c_str(), L"r");&lt;br /&gt;    &lt;br /&gt;    pFileLex-&amp;gt;_readInt(_nNumEvent);&lt;br /&gt;    &lt;br /&gt;    if( _nNumEvent )&lt;br /&gt;    {&lt;br /&gt;        _pHandleArray = new HANDLE[_nNumEvent];&lt;br /&gt;        _pStrEven = new wstring[_nNumEvent];&lt;br /&gt;        &lt;br /&gt;        wstring strEven;&lt;br /&gt;        for( int i = 0 ; i &amp;lt; _nNumEvent ; i++ )&lt;br /&gt;        {&lt;br /&gt;            pFileLex-&amp;gt;_readString(strEven);&lt;br /&gt;            _pStrEven[i] = strEven;&lt;br /&gt;            _pHandleArray[i] =  CreateEvent( NULL, TRUE, FALSE, strEven.c_str()) ;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        m_pProcessThread = ::_BeginThread((_THREADPROC)CuWaitKeyEven::Process, (LPVOID)this);&lt;br /&gt;    }&lt;br /&gt;    pFileLex-&amp;gt;Release();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-6524467511104957865?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/6524467511104957865/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuwaitkeyeven.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6524467511104957865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6524467511104957865'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/02/cuwaitkeyeven.html' title='CuWaitKeyEven - 等待外部文字檔標示的EVENT'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-485901343093479378</id><published>2010-01-31T15:00:00.000-08:00</published><updated>2010-01-31T15:00:02.745-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuToolhelp - Takes a snapshot of the specified processes</title><content type='html'>&lt;pre class="brush: cpp;"&gt;//  Takes a snapshot of the specified processes&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuToolhelp.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuToolhelp  &lt;br /&gt;{&lt;br /&gt;    HANDLE  m_hSnapshot;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuToolhelp();&lt;br /&gt;    virtual ~CuToolhelp();&lt;br /&gt;&lt;br /&gt;    BOOL CreateSnapshot(DWORD dwFlags, DWORD dwProcessID = 0);&lt;br /&gt;    void CloseSnapshot();&lt;br /&gt;&lt;br /&gt;    BOOL ProcessFirst(PPROCESSENTRY32 ppe) const;&lt;br /&gt;    BOOL ProcessNext(PPROCESSENTRY32 ppe) const;&lt;br /&gt;    BOOL ProcessFind(DWORD dwProcessID, PPROCESSENTRY32 ppe) ;&lt;br /&gt;    BOOL ProcessFind(wstring strExeFile, PPROCESSENTRY32 ppe) ;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuToolhelp.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuToolhelp::CuToolhelp()&lt;br /&gt;:m_hSnapshot(INVALID_HANDLE_VALUE)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuToolhelp::~CuToolhelp()&lt;br /&gt;{&lt;br /&gt;    CloseSnapshot();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuToolhelp::CreateSnapshot(DWORD dwFlags, DWORD dwProcessID)&lt;br /&gt;{&lt;br /&gt;    CloseSnapshot();&lt;br /&gt;&lt;br /&gt;    if( dwFlags == 0 )&lt;br /&gt;    {&lt;br /&gt;        m_hSnapshot = INVALID_HANDLE_VALUE;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        m_hSnapshot = CreateToolhelp32Snapshot(dwFlags, dwProcessID);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return (m_hSnapshot != INVALID_HANDLE_VALUE);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuToolhelp::CloseSnapshot()&lt;br /&gt;{&lt;br /&gt;    if( m_hSnapshot != INVALID_HANDLE_VALUE )&lt;br /&gt;        CloseToolhelp32Snapshot(m_hSnapshot);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuToolhelp::ProcessFirst(PPROCESSENTRY32 ppe) const&lt;br /&gt;{&lt;br /&gt;    BOOL fOk = ::Process32First(m_hSnapshot, ppe);&lt;br /&gt;&lt;br /&gt;    // Remove the "[ System Process]" (PID = 0)&lt;br /&gt;    if( fOk &amp;&amp; (ppe-&amp;gt;th32ProcessID == 0 ))&lt;br /&gt;        fOk = ProcessNext(ppe);&lt;br /&gt;&lt;br /&gt;    return (fOk);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuToolhelp::ProcessNext(PPROCESSENTRY32 ppe) const&lt;br /&gt;{&lt;br /&gt;    BOOL fOk = ::Process32Next(m_hSnapshot, ppe);&lt;br /&gt;&lt;br /&gt;    // Remove the "[ System Process]" (PID = 0)&lt;br /&gt;    if( fOk &amp;&amp; (ppe-&amp;gt;th32ProcessID == 0 ))&lt;br /&gt;        fOk = ProcessNext(ppe);&lt;br /&gt;&lt;br /&gt;    return (fOk);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuToolhelp::ProcessFind(DWORD dwProcessID, PPROCESSENTRY32 ppe) &lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    BOOL bFound = FALSE;&lt;br /&gt;    for( BOOL fOk = ProcessFirst(ppe); fOk; fOk = ProcessNext(ppe) )&lt;br /&gt;    {&lt;br /&gt;        bFound = ( ppe-&amp;gt;th32ProcessID == dwProcessID );&lt;br /&gt;        if( bFound )&lt;br /&gt;            break;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return (bFound);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;BOOL CuToolhelp::ProcessFind(wstring strExeFile, PPROCESSENTRY32 ppe) &lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    BOOL bFound = FALSE;&lt;br /&gt;    for( BOOL fOk = ProcessFirst(ppe); fOk; fOk = ProcessNext(ppe) )&lt;br /&gt;    {&lt;br /&gt;        bFound = (strExeFile == ppe-&amp;gt;szExeFile);&lt;br /&gt;        if( bFound )&lt;br /&gt;            break;&lt;br /&gt;    }&lt;br /&gt;    return (bFound);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-485901343093479378?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/485901343093479378/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cutoolhelp-takes-snapshot-of-specified.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/485901343093479378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/485901343093479378'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cutoolhelp-takes-snapshot-of-specified.html' title='CuToolhelp - Takes a snapshot of the specified processes'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-1691484968689470133</id><published>2010-01-30T15:00:00.000-08:00</published><updated>2010-01-30T15:00:01.075-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>TuPowerNotification -</title><content type='html'>&lt;pre class="brush: cpp;"&gt;//&lt;br /&gt;class PowerNotificationTest&lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt;    TuPowerNotification&amp;lt;PowerNotificationTest&amp;gt; uPowerNotification;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    PowerNotificationTest() {}&lt;br /&gt;    ~PowerNotificationTest() {}&lt;br /&gt;&lt;br /&gt;    void Init()&lt;br /&gt;    {&lt;br /&gt;        //初始化 TuPowerNotification&lt;br /&gt;        uPowerNotification.CombineElement(this, PowerNotificationTest::PowerNotify);&lt;br /&gt;        uPowerNotification.RequestPowerNotifications();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    void PowerNotify(PPOWER_BROADCAST ppower_broadcast)&lt;br /&gt;    {&lt;br /&gt;        switch(ppower_broadcast-&amp;gt;Message)&lt;br /&gt;        {&lt;br /&gt;           //取得 power status&lt;br /&gt;            case PBT_TRANSITION:&lt;br /&gt;&lt;br /&gt;                break;&lt;br /&gt;            case PBT_RESUME:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                break;&lt;br /&gt;            case PBT_POWERSTATUSCHANGE:&lt;br /&gt;&lt;br /&gt;                break;&lt;br /&gt;&lt;br /&gt;            case PBT_POWERINFOCHANGE:&lt;br /&gt;                break;&lt;br /&gt;        }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// TuPowerNotification.h&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;class TuPowerNotification : public CuPowerNotification&lt;br /&gt;{&lt;br /&gt;    typedef void ( T::*POWER_NOTIFICATION_PROC)(PPOWER_BROADCAST ppower_broadcast);&lt;br /&gt;    POWER_NOTIFICATION_PROC m_fpPowerNotificationProc;&lt;br /&gt;    T *m_pElement;&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;    TuPowerNotification();&lt;br /&gt;    ~TuPowerNotification();&lt;br /&gt;    void CombineElement(T *pElement, POWER_NOTIFICATION_PROC fpTimeOutProc);    &lt;br /&gt;    virtual void OnPowerNotification(PPOWER_BROADCAST ppower_broadcast);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;TuPowerNotification&amp;lt;T&amp;gt;::TuPowerNotification()&lt;br /&gt;:m_fpPowerNotificationProc(NULL)&lt;br /&gt;,m_pElement(NULL)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;TuPowerNotification&amp;lt;T&amp;gt;::~TuPowerNotification()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;void TuPowerNotification&amp;lt;T&amp;gt;::OnPowerNotification(PPOWER_BROADCAST ppower_broadcast)&lt;br /&gt;{&lt;br /&gt;    if(m_fpPowerNotificationProc)&lt;br /&gt;        (m_pElement-&amp;gt;*m_fpPowerNotificationProc)(ppower_broadcast);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;void TuPowerNotification&amp;lt;T&amp;gt;::CombineElement(T *pElement, POWER_NOTIFICATION_PROC fpTimeOutProc)&lt;br /&gt;{ &lt;br /&gt;    m_pElement = pElement; &lt;br /&gt;    m_fpPowerNotificationProc = fpTimeOutProc;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-1691484968689470133?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/1691484968689470133/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tupowernotification.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1691484968689470133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1691484968689470133'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tupowernotification.html' title='TuPowerNotification -'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-8614013895720431656</id><published>2010-01-29T15:00:00.000-08:00</published><updated>2010-01-29T15:37:34.182-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuFileLex - 文字檔剖析</title><content type='html'>// config.sys&lt;br /&gt;--------------------------------------------&lt;br /&gt;&lt;pre&gt;TOTAL_ELEMENT_NUM   8&lt;br /&gt;&lt;br /&gt;    ELEMENT_NUM 1&lt;br /&gt;        ELEMENT_TYPE        "element"&lt;br /&gt;        ELEMENT_NAME            "background"&lt;br /&gt;        ELEMENT_POINT       0   0&lt;br /&gt;        ELEMENT_NEEDALPHA   0&lt;br /&gt;        TOTAL_PHOTO_NUM     1&lt;br /&gt;            PHOTO_NAME  "media_bg.bmp" 4&lt;br /&gt;        ELEMENT_END&lt;br /&gt;&lt;br /&gt;    ELEMENT_NUM 2&lt;br /&gt;        ELEMENT_TYPE        "button"&lt;br /&gt;        ELEMENT_NAME            "close" &lt;br /&gt;        ELEMENT_POINT       3   3&lt;br /&gt;        ELEMENT_NEEDALPHA   1&lt;br /&gt;        TOTAL_PHOTO_NUM     4&lt;br /&gt;            PHOTO_NAME  "close.bmp" 0&lt;br /&gt;            PHOTO_NAME  "close_alpha.bmp" 1&lt;br /&gt;            PHOTO_NAME  "close_down.bmp" 2&lt;br /&gt;            PHOTO_NAME  "close_down_alpha.bmp" 3&lt;br /&gt;        ELEMENT_END&lt;br /&gt;        BUTTON_END&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    ELEMENT_NUM 3&lt;br /&gt;        ELEMENT_TYPE        "commandbt"&lt;br /&gt;        ELEMENT_NAME            "goto-photo"        &lt;br /&gt;        ELEMENT_POINT       208 85&lt;br /&gt;        ELEMENT_NEEDALPHA   1&lt;br /&gt;        TOTAL_PHOTO_NUM     4&lt;br /&gt;            PHOTO_NAME  "photoviewer_Icon.bmp" 13&lt;br /&gt;            PHOTO_NAME  "photoviewer_Icon_alpha.bmp" 14&lt;br /&gt;            PHOTO_NAME  "photoviewer_animation01.bmp" 15&lt;br /&gt;            PHOTO_NAME  "photoviewer_animation01_alpha.bmp" 16&lt;br /&gt;        ELEMENT_END&lt;br /&gt;        BUTTON_END&lt;br /&gt;        COMMANDBT_ACTIVE_NAME   "photoviewv350.exe"&lt;br /&gt;        COMMANDBT_END&lt;br /&gt;&lt;br /&gt;    ELEMENT_NUM 4&lt;br /&gt;        ELEMENT_TYPE        "commandbt"&lt;br /&gt;        ELEMENT_NAME            "goto-music"        &lt;br /&gt;        ELEMENT_POINT       14  85&lt;br /&gt;        ELEMENT_NEEDALPHA   1&lt;br /&gt;        TOTAL_PHOTO_NUM     4&lt;br /&gt;            PHOTO_NAME  "music_Icon.bmp" 9&lt;br /&gt;            PHOTO_NAME  "music_Icon_alpha.bmp" 10&lt;br /&gt;            PHOTO_NAME  "music_animation01.bmp" 11&lt;br /&gt;            PHOTO_NAME  "music_animation01_alpha.bmp" 12&lt;br /&gt;        ELEMENT_END&lt;br /&gt;        BUTTON_END&lt;br /&gt;        COMMANDBT_ACTIVE_NAME   "musicv350.exe"&lt;br /&gt;        COMMANDBT_END&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    ELEMENT_NUM 5&lt;br /&gt;        ELEMENT_TYPE        "commandbt"&lt;br /&gt;        ELEMENT_NAME            "goto-video"        &lt;br /&gt;        ELEMENT_POINT       113 85&lt;br /&gt;        ELEMENT_NEEDALPHA   1&lt;br /&gt;        TOTAL_PHOTO_NUM     4&lt;br /&gt;            PHOTO_NAME  "movie_Icon.bmp" 5&lt;br /&gt;            PHOTO_NAME  "movie_Icon_alpha.bmp" 6&lt;br /&gt;            PHOTO_NAME  "movie_animation01.bmp" 7&lt;br /&gt;            PHOTO_NAME  "movie_animation01_alpha.bmp" 8&lt;br /&gt;        ELEMENT_END&lt;br /&gt;        BUTTON_END&lt;br /&gt;        COMMANDBT_ACTIVE_NAME   "video\videov350.exe"&lt;br /&gt;        COMMANDBT_END&lt;br /&gt;&lt;br /&gt;    ELEMENT_NUM 6&lt;br /&gt;        ELEMENT_TYPE        "statictext" &lt;br /&gt;        "PhotoView"&lt;br /&gt;        "text-photoview"&lt;br /&gt;        208 180 98  30&lt;br /&gt;        12&lt;br /&gt;        255 255 255&lt;br /&gt;&lt;br /&gt;    ELEMENT_NUM 7&lt;br /&gt;        ELEMENT_TYPE        "statictext" &lt;br /&gt;        "Music"&lt;br /&gt;        "text-music"&lt;br /&gt;        14  180 98  30&lt;br /&gt;        12&lt;br /&gt;        255 255 255&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    ELEMENT_NUM 8&lt;br /&gt;        ELEMENT_TYPE        "statictext" &lt;br /&gt;        "Video"&lt;br /&gt;        "text-Video"&lt;br /&gt;        113 180 98  30&lt;br /&gt;        12&lt;br /&gt;        255 255 255&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush: cpp;"&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuFileLex.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuFileLex&lt;br /&gt;{&lt;br /&gt;    BOOL    m_bUnicode;&lt;br /&gt;    BOOL    _IsUnicodeFile();&lt;br /&gt;    int     _lexw(void);&lt;br /&gt;    int     _lexa(void);&lt;br /&gt;&lt;br /&gt;    CuFile  m_File;&lt;br /&gt;public:&lt;br /&gt;    CuFileLex(void);&lt;br /&gt;    ~CuFileLex(void);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    BOOL Open( LPCSTR lpszFileName, LPCSTR lpszOpenMode);&lt;br /&gt;    virtual BOOL Open( LPCTSTR lpszFileName, LPCTSTR lpszOpenMode);&lt;br /&gt;&lt;br /&gt;    int _type; // 最後呼叫 _lex() 的字串類型&lt;br /&gt;    wstring _text; // 將讀到的字串 放到這裡&lt;br /&gt;&lt;br /&gt;    enum {UNKNOW = 0, INTEGER = 1, FLOAT, SYMBOL, INDEX, STRING, NODE, BLOCKSTART, BLOCKEND};&lt;br /&gt;    // 讀一段字 並分析字串 傳回字串類型&lt;br /&gt;    int _lex(void);&lt;br /&gt;&lt;br /&gt;    void _readInt(int &amp;i);&lt;br /&gt;    void _readInt3(int i[3]);&lt;br /&gt;    void _readInt4(int i[4]);&lt;br /&gt;    void _readFloat(float &amp;f);&lt;br /&gt;    void _readFloat3(float f[3]);&lt;br /&gt;    void _readSymbol(wstring &amp;str);&lt;br /&gt;    void _readIndex();&lt;br /&gt;    void _readString(wstring &amp;str);&lt;br /&gt;    void _readNode();&lt;br /&gt;    void _readBlockStart();&lt;br /&gt;    &lt;br /&gt;    int _skip();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuFileLex.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuFileLex::CuFileLex(void) : _type(UNKNOW)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuFileLex::~CuFileLex(void)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuFileLex::_lex(void)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;//  static &lt;br /&gt;//  char check[] = "-0123456789._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"{}:*";&lt;br /&gt;                 //"12345678901234567890123456789012345678901234567890123456789012345 678901234&lt;br /&gt;                 //"0        1         2         3         4         5         6          7 &lt;br /&gt;                // 1~11  = INTEGER&lt;br /&gt;                // 12 = FLOAT&lt;br /&gt;                // 13~65 = SYMBOL&lt;br /&gt;                // 69 = INDEX&lt;br /&gt;                // 66 = STRING&lt;br /&gt;                // 70 = NODE  &lt;br /&gt;                // 67 = BLOCKSTART&lt;br /&gt;                // 68 = BLOCKEND&lt;br /&gt;&lt;br /&gt;    // 字串分析的權位 左邊比較低 右邊比較高 &lt;br /&gt;//  enum {UNKNOW = 0, INTEGER = 1, FLOAT, SYMBOL, INDEX, STRING, NODE, BLOCKSTART, BLOCKEND};&lt;br /&gt;&lt;br /&gt;    _text = L"";&lt;br /&gt;&lt;br /&gt;    int result;&lt;br /&gt;&lt;br /&gt;    int current_type = 0;  &lt;br /&gt;    int type = UNKNOW; // 分析字串的類型&lt;br /&gt;&lt;br /&gt;    bool baString = false; // 當正在讀字串時 會一直讀到 下一個 '\"' &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // 排除前置空白 換行 定位 字元&lt;br /&gt;    do&lt;br /&gt;    {&lt;br /&gt;        result = m_File.get();&lt;br /&gt;    }while( result != EOF &amp;&amp; (result == 9 || result == 32 || result == 13 || result == 10 ));&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    while(result != EOF)&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        // ---------------+---------------&lt;br /&gt;        // 字串種類判段&lt;br /&gt;&lt;br /&gt;        if( baString )&lt;br /&gt;        {&lt;br /&gt;            if( result == 0x22 )&lt;br /&gt;                baString = !baString;&lt;br /&gt;&lt;br /&gt;        }else if( (result &amp;gt;= 0x41 &amp;&amp; result &amp;lt;= 0x5a) ||&lt;br /&gt;                (result &amp;gt;= 0x61 &amp;&amp; result &amp;lt;= 0x7a) ||&lt;br /&gt;                (result == 0x5f) )&lt;br /&gt;            current_type = SYMBOL;&lt;br /&gt;        else if( (result &amp;gt;= 0x30 &amp;&amp; result &amp;lt;= 0x39) || result == 0x2d  )&lt;br /&gt;            current_type = INTEGER;&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            switch( result )&lt;br /&gt;            {&lt;br /&gt;            case 0x2e:&lt;br /&gt;                current_type = FLOAT;&lt;br /&gt;                break;&lt;br /&gt;            case 0x3a:&lt;br /&gt;                current_type = INDEX;&lt;br /&gt;                break;&lt;br /&gt;            case 0x22:&lt;br /&gt;                current_type = STRING;&lt;br /&gt;                baString = !baString;&lt;br /&gt;                break;&lt;br /&gt;            case 0x2a:&lt;br /&gt;                current_type = NODE;&lt;br /&gt;                break;&lt;br /&gt;            case 0x7b:&lt;br /&gt;                current_type = BLOCKSTART;&lt;br /&gt;                break;&lt;br /&gt;            case 0x7d:&lt;br /&gt;                current_type = BLOCKEND;&lt;br /&gt;                break;&lt;br /&gt;            default:&lt;br /&gt;                {&lt;br /&gt;                    _type = type;&lt;br /&gt;                    return type;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        if( type &amp;lt; current_type )&lt;br /&gt;            type = current_type;&lt;br /&gt;        // ---------------+---------------&lt;br /&gt;&lt;br /&gt;        _text += result;&lt;br /&gt;        result = m_File.get();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    _type = type;&lt;br /&gt;&lt;br /&gt;    return type;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int CuFileLex::_lexw(void)&lt;br /&gt;{&lt;br /&gt;//  static &lt;br /&gt;//  TCHAR check[] = L"-0123456789._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"{}:*";&lt;br /&gt;                   //"12345678901234567890123456789012345678901234567890123456789012345 678901234&lt;br /&gt;                   //"0        1         2         3         4         5         6          7 &lt;br /&gt;                // 1~11  = INTEGER&lt;br /&gt;                // 12 = FLOAT&lt;br /&gt;                // 13~65 = SYMBOL&lt;br /&gt;                // 69 = INDEX&lt;br /&gt;                // 66 = STRING&lt;br /&gt;                // 70 = NODE  &lt;br /&gt;                // 67 = BLOCKSTART&lt;br /&gt;                // 68 = BLOCKEND&lt;br /&gt;&lt;br /&gt;    // 字串分析的權位 左邊比較低 右邊比較高 &lt;br /&gt;//  enum {UNKNOW = 0, INTEGER = 1, FLOAT, SYMBOL, INDEX, STRING, NODE, BLOCKSTART, BLOCKEND};&lt;br /&gt;&lt;br /&gt;    _text = L"";&lt;br /&gt;&lt;br /&gt;    WORD result;&lt;br /&gt;&lt;br /&gt;    int current_type = 0;  &lt;br /&gt;    int type = UNKNOW; // 分析字串的類型&lt;br /&gt;&lt;br /&gt;    bool baString = false; // 當正在讀字串時 會一直讀到 下一個 '\"' &lt;br /&gt;&lt;br /&gt;    int nSizeT = 0;&lt;br /&gt;&lt;br /&gt;    // 排除前置空白 換行 定位 字元&lt;br /&gt;    do&lt;br /&gt;    {&lt;br /&gt;        nSizeT = m_File.Read(&amp;result, sizeof(result) );&lt;br /&gt;    }while( nSizeT != 0 &amp;&amp; (result != EOF &amp;&amp; result == 9 || result == 32 || result == 13 || result == 10 ));&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    while(result != EOF &amp;&amp; nSizeT != 0 )&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        // ---------------+---------------&lt;br /&gt;        // 字串種類判段&lt;br /&gt;&lt;br /&gt;        if( baString )&lt;br /&gt;        {&lt;br /&gt;            if( result == 0x22 )&lt;br /&gt;                baString = !baString;&lt;br /&gt;&lt;br /&gt;        }else if( (result &amp;gt;= 0x41 &amp;&amp; result &amp;lt;= 0x5a) ||&lt;br /&gt;                (result &amp;gt;= 0x61 &amp;&amp; result &amp;lt;= 0x7a) ||&lt;br /&gt;                (result == 0x5f) )&lt;br /&gt;                current_type = SYMBOL;&lt;br /&gt;        else if( (result &amp;gt;= 0x30 &amp;&amp; result &amp;lt;= 0x39) || result == 0x2d  )&lt;br /&gt;            current_type = INTEGER;&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            switch( result )&lt;br /&gt;            {&lt;br /&gt;            case 0x2e:&lt;br /&gt;                current_type = FLOAT;&lt;br /&gt;                break;&lt;br /&gt;            case 0x3a:&lt;br /&gt;                current_type = INDEX;&lt;br /&gt;                break;&lt;br /&gt;            case 0x22:&lt;br /&gt;                current_type = STRING;&lt;br /&gt;                baString = !baString;&lt;br /&gt;                break;&lt;br /&gt;            case 0x2a:&lt;br /&gt;                current_type = NODE;&lt;br /&gt;                break;&lt;br /&gt;            case 0x7b:&lt;br /&gt;                current_type = BLOCKSTART;&lt;br /&gt;                break;&lt;br /&gt;            case 0x7d:&lt;br /&gt;                current_type = BLOCKEND;&lt;br /&gt;                break;&lt;br /&gt;            default:&lt;br /&gt;                {&lt;br /&gt;                    _type = type;&lt;br /&gt;                    return type;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        if( type &amp;lt; current_type )&lt;br /&gt;            type = current_type;&lt;br /&gt;        // ---------------+---------------&lt;br /&gt;&lt;br /&gt;        _text += result;&lt;br /&gt;        nSizeT = m_File.Read(&amp;result, sizeof(result) );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    _type = type;&lt;br /&gt;&lt;br /&gt;    return type;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// 讀一段字 並分析字串 傳回字串類型&lt;br /&gt;int CuFileLex::_lex(void)&lt;br /&gt;{&lt;br /&gt;    if( m_bUnicode )&lt;br /&gt;        return _lexw();&lt;br /&gt;    else&lt;br /&gt;        return _lexa();&lt;br /&gt;&lt;br /&gt;    return m_bUnicode ? _lexw() : _lexa();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// 讀一段字 並分析字串 傳回字串類型&lt;br /&gt;&lt;br /&gt;void CuFileLex::_readInt(int &amp;i)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _lex();&lt;br /&gt;    Assert( _type == INTEGER , L"CuFileLex::_readInt: Expected an integer\n");&lt;br /&gt;    swscanf(_text.c_str(), L"%i", &amp;i);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuFileLex::_readInt3(int i[3])&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _readInt(i[0]);&lt;br /&gt;    _readInt(i[1]);&lt;br /&gt;    _readInt(i[2]);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuFileLex::_readInt4(int i[4])&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _readInt(i[0]);&lt;br /&gt;    _readInt(i[1]);&lt;br /&gt;    _readInt(i[2]);&lt;br /&gt;    _readInt(i[3]);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuFileLex::_readFloat(float &amp;f)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _lex();&lt;br /&gt;    Assert( _type == FLOAT , L"CuFileLex::_readFloat: Expected an float\n");&lt;br /&gt;    swscanf(_text.c_str(), L"%f", &amp;f);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuFileLex::_readFloat3(float f[3])&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _readFloat(f[0]);&lt;br /&gt;    _readFloat(f[1]);&lt;br /&gt;    _readFloat(f[2]);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuFileLex::_readSymbol(wstring &amp;str)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _lex();&lt;br /&gt;    Assert( _type == SYMBOL , L"CuFileLex::_readSymbol: Expected a symbol\n");&lt;br /&gt;    str = _text;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuFileLex::_readIndex()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _lex();&lt;br /&gt;    Assert( _type == INDEX , L"CuFileLex::_readIndex: Expected a index\n");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuFileLex::_readString(wstring &amp;str)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _lex();&lt;br /&gt;    Assert( _type == STRING , L"CuFileLex::_readString: Expected a string\n");&lt;br /&gt;&lt;br /&gt;    // 脫溢字串兩頭的 雙引號&lt;br /&gt;    if( _text.size() != 0 )&lt;br /&gt;        str.assign( _text, 1, _text.size() - 2);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;void CuFileLex::_readNode()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _lex();&lt;br /&gt;    Assert( _type == NODE , L"CuFileLex::_readNode: Expected a node\n");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuFileLex::_readBlockStart()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _lex();&lt;br /&gt;    Assert( _type == BLOCKSTART , L"CuFileLex::_readBlockStart: Expected an open brace\n");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuFileLex::_skip()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    int nextToken;&lt;br /&gt;    int depth = 0;&lt;br /&gt;    char neednext = 1;&lt;br /&gt;&lt;br /&gt;    do {&lt;br /&gt;        if(neednext) &lt;br /&gt;            nextToken = _lex();&lt;br /&gt;        else &lt;br /&gt;            neednext = 1;&lt;br /&gt;&lt;br /&gt;        if(nextToken == BLOCKSTART) &lt;br /&gt;            depth++;&lt;br /&gt;        if(nextToken == BLOCKEND) &lt;br /&gt;            if(depth &amp;gt; 0) {&lt;br /&gt;            /*printf("skipping %s\n", ASE_text);*/&lt;br /&gt;            depth--;&lt;br /&gt;            nextToken = _lex();&lt;br /&gt;            neednext = 0;&lt;br /&gt;        }&lt;br /&gt;        /*printf("skipping %s (%i) (depth %i)\n", ASE_text, ASE_linenum, depth);*/&lt;br /&gt;    } while(nextToken &amp;&amp; (depth || (nextToken != NODE &amp;&amp; nextToken != BLOCKEND)));&lt;br /&gt;    /*printf("done (got %s)\n", ASE_text);*/&lt;br /&gt;    return nextToken;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuFileLex::_IsUnicodeFile()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    FILE* pFileStream = m_File.GetFILE();&lt;br /&gt;&lt;br /&gt;    WORD result = 0;&lt;br /&gt;    fseek( pFileStream, 0, SEEK_SET);&lt;br /&gt;    int nSizeT = m_File.Read(&amp;result, sizeof(result) );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    if( result != 0xfeff )&lt;br /&gt;    {&lt;br /&gt;        fseek( pFileStream, 0, SEEK_SET);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return (result == 0xfeff);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;BOOL CuFileLex::Open( LPCSTR lpszFileName, LPCSTR lpszOpenMode)&lt;br /&gt;{&lt;br /&gt;    string strFileName = lpszFileName;&lt;br /&gt;    string strOpenMode = lpszOpenMode;&lt;br /&gt;&lt;br /&gt;    wstring wstrFileName(strFileName.begin(), strFileName.end());&lt;br /&gt;    wstring wstrOpenMode(strOpenMode.begin(), strOpenMode.end());&lt;br /&gt;&lt;br /&gt;    return Open(wstrFileName.c_str(),wstrOpenMode.c_str() );&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuFileLex::Open( LPCTSTR lpszFileName, LPCTSTR lpszOpenMode)&lt;br /&gt;{&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    BOOL bResult = m_File.Open(lpszFileName, lpszOpenMode);&lt;br /&gt;&lt;br /&gt;    Assert(bResult != FALSE, L"can't open file" );&lt;br /&gt;    Assert(bResult != FALSE, const_cast&amp;lt;TCHAR *&amp;gt;(lpszFileName) );&lt;br /&gt;&lt;br /&gt;    if( bResult == FALSE )&lt;br /&gt;        return FALSE;&lt;br /&gt;&lt;br /&gt;    m_bUnicode = this-&amp;gt;_IsUnicodeFile();&lt;br /&gt;&lt;br /&gt;    if( m_bUnicode )&lt;br /&gt;    {&lt;br /&gt;        if( wcscmp (lpszOpenMode , L"r") == 0 )&lt;br /&gt;        {&lt;br /&gt;            lpszOpenMode = L"rb";&lt;br /&gt;            m_File.Close();&lt;br /&gt;            bResult = m_File.Open(lpszFileName, lpszOpenMode);&lt;br /&gt;            m_bUnicode = this-&amp;gt;_IsUnicodeFile();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        m_File.Close();&lt;br /&gt;        bResult = m_File.Open(lpszFileName, lpszOpenMode);&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return bResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;從某一隻ASE檔載入器中抓出來的, &lt;br /&gt;CuFileLex 跟CuStringList 相比, 能載入較多格式的文字串, 組合後可以使用更豐富的設定檔&lt;br /&gt;上面有兩大段分別支援一般文字檔跟UNICODE文字檔, 很顯示需要重構! 現在沒打算重構!&lt;br /&gt;重構時間點在何時呢? 在他出錯的時後, 或是下次程式碼"review"的時後!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-8614013895720431656?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/8614013895720431656/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cufilelex.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/8614013895720431656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/8614013895720431656'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cufilelex.html' title='CuFileLex - 文字檔剖析'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2731928902333048437</id><published>2010-01-28T15:00:00.000-08:00</published><updated>2010-01-28T15:00:01.194-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>CuMicroTime - the current timestamp with microseconds.</title><content type='html'>&lt;pre class="brush: php;"&gt;// the current timestamp with microseconds.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuMicroTime.php &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuMicroTime  {&lt;br /&gt;&lt;br /&gt;    var $usec;&lt;br /&gt;    var $sec;&lt;br /&gt;    &lt;br /&gt;    function CuMicroTime(/* CuMicroTime */ $MicroTime = null) {&lt;br /&gt;&lt;br /&gt;        if( $this-&amp;gt;CheckClassType($MicroTime) )&lt;br /&gt;        {&lt;br /&gt;            $this-&amp;gt;usec = $MicroTime-&amp;gt;usec;&lt;br /&gt;            $this-&amp;gt;sec = $MicroTime-&amp;gt;sec;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            list($this-&amp;gt;usec, $this-&amp;gt;sec) = explode(" ", microtime());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function Dec( /* CuMicroTime */ $MicroTime)&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        if( CheckClassType($MicroTime) )&lt;br /&gt;            return NULL;&lt;br /&gt;&lt;br /&gt;        $usec = (float)$this-&amp;gt;usec - (float)$MicroTime-&amp;gt;usec;&lt;br /&gt;        $sec = $this-&amp;gt;sec - $MicroTime-&amp;gt;sec;&lt;br /&gt;&lt;br /&gt;        $usec = substr($usec, 1);&lt;br /&gt;        return $sec.$usec;&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function CheckClassType($MicroTime)&lt;br /&gt;    {&lt;br /&gt;        if( gettype($MicroTime) != 'object' || get_class($MicroTime) != "cumicrotime" )&lt;br /&gt;            return false;&lt;br /&gt;        else&lt;br /&gt;            return true;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2731928902333048437?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2731928902333048437/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cumicrotime-current-timestamp-with.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2731928902333048437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2731928902333048437'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cumicrotime-current-timestamp-with.html' title='CuMicroTime - the current timestamp with microseconds.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-3627069723336708015</id><published>2010-01-27T15:00:00.000-08:00</published><updated>2010-01-27T15:00:00.827-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuShellExecuteEx  - Performs an operation on a specified file.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Performs an operation on a specified file.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuShellExecuteEx.h&lt;br /&gt;&lt;br /&gt;class CuShellExecuteEx  &lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    void SetExecuteFile(wstring strFile, BOOL bAutoModuleFile = FALSE);&lt;br /&gt;    BOOL OnShellExecuteEx();&lt;br /&gt;&lt;br /&gt;    SHELLEXECUTEINFO m_sei;&lt;br /&gt;    wstring m_strExecuteFile;&lt;br /&gt;&lt;br /&gt;    CuShellExecuteEx();&lt;br /&gt;    ~CuShellExecuteEx();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuShellExecuteEx.cpp&lt;br /&gt;&lt;br /&gt;CuShellExecuteEx::CuShellExecuteEx()&lt;br /&gt;{&lt;br /&gt;    m_sei.cbSize = sizeof(SHELLEXECUTEINFO);&lt;br /&gt;    m_sei.fMask = 0;&lt;br /&gt;    m_sei.hwnd = NULL;&lt;br /&gt;    m_sei.lpVerb = TEXT("open");&lt;br /&gt;    m_sei.lpFile = NULL;&lt;br /&gt;    m_sei.lpParameters = NULL;&lt;br /&gt;    m_sei.lpDirectory = NULL;&lt;br /&gt;    m_sei.nShow = SW_SHOW;&lt;br /&gt;    m_sei.hInstApp = NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuShellExecuteEx::~CuShellExecuteEx()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuShellExecuteEx::OnShellExecuteEx()&lt;br /&gt;{&lt;br /&gt;    return ::ShellExecuteEx(&amp;m_sei);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuShellExecuteEx::SetExecuteFile(wstring strFile, BOOL bAutoModuleFile /*= FALSE*/)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if( bAutoModuleFile )&lt;br /&gt;    {&lt;br /&gt;        CuModuleFile mf;&lt;br /&gt;        strFile = mf.GetModuleFileName(strFile);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    m_strExecuteFile = strFile;&lt;br /&gt;    m_sei.lpFile = m_strExecuteFile.c_str();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-3627069723336708015?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/3627069723336708015/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cushellexecuteex-performs-operation-on.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3627069723336708015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3627069723336708015'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cushellexecuteex-performs-operation-on.html' title='CuShellExecuteEx  - Performs an operation on a specified file.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-3602124280147305065</id><published>2010-01-26T15:00:00.000-08:00</published><updated>2010-01-26T15:00:00.727-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuModuleFile  - Retrieves the fully-qualified path for the file that contains the onwer module.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Retrieves the fully-qualified path for the file that contains the onwer module.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuModuleFile.h&lt;br /&gt;&lt;br /&gt;class CuModuleFile //: public IuModuleFile&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    CuModuleFile();&lt;br /&gt;    ~CuModuleFile();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    wstring GetModuleFileName(wstring strFileName);&lt;br /&gt;&lt;br /&gt;   // 傳入空的字串 會傳回執行檔檔名&lt;br /&gt;    wstring GetUnModuleFileName(wstring strFileName = L""); &lt;br /&gt;    wstring CutRFind(wstring str, TCHAR ch);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuModuleFile.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuModuleFile::CuModuleFile()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuModuleFile::~CuModuleFile()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// 函式名稱:GetModuleFileName&lt;br /&gt;// 函式說明:將strFileName 前面加上 主執行緒執行檔同目錄的路徑&lt;br /&gt;// 使用範例:&lt;br /&gt;// 啟動 C:\Documents and Settings\Eric Wang\My Documents\Work\test.exe&lt;br /&gt;// strFileName = L"sample.ini"&lt;br /&gt;// str = mf.GetModuleFileName(strFileName);&lt;br /&gt;// Access(str = L"C:\Documents and Settings\Eric Wang\My Documents\Work\sample.ini");&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;wstring CuModuleFile::GetModuleFileName(wstring strFileName)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    wstring filename;&lt;br /&gt;    wstring strFile = strFileName;&lt;br /&gt;&lt;br /&gt;    wstring::size_type npos = -1;&lt;br /&gt;    wstring::size_type indexCh1a;&lt;br /&gt;&lt;br /&gt;    int nCount = 0;&lt;br /&gt;    while   ( (indexCh1a = strFile.find(L"..\\")) != npos )&lt;br /&gt;    {&lt;br /&gt;        nCount++;&lt;br /&gt;        strFile = strFile.substr(indexCh1a + 3);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    TCHAR szModule[255] = L"";&lt;br /&gt;    LPTSTR psz;&lt;br /&gt;&lt;br /&gt;    ::GetModuleFileName(GetModuleHandle(NULL), szModule, MAX_PATH);&lt;br /&gt;&lt;br /&gt;    do&lt;br /&gt;    {&lt;br /&gt;        psz = wcsrchr(szModule, L'\\');&lt;br /&gt;        if (psz)&lt;br /&gt;        {&lt;br /&gt;            *psz = L'\0';&lt;br /&gt;        }&lt;br /&gt;    }while( nCount-- );&lt;br /&gt;&lt;br /&gt;    wcscat(szModule, L"\\");&lt;br /&gt;    wcscat(szModule, strFile.c_str());&lt;br /&gt;&lt;br /&gt;    return szModule;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// 函式名稱:GetUnModuleFileName&lt;br /&gt;// 函式說明:函路徑的檔名前面的路徑清掉, strFileName = NULL 時 會傳回主執行緒的執行檔檔名&lt;br /&gt;// 使用範例:&lt;br /&gt;// strFileName = L"C:\\Documents and Settings\\Eric Wang\My Documents\\Work\\temp.txt"&lt;br /&gt;// str = mf.GetUnModuleFileName(strFileName);&lt;br /&gt;// Access(str = L"temp.txt");&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;wstring CuModuleFile::GetUnModuleFileName(wstring strFileName /* = L"" */)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    wstring filename;&lt;br /&gt;    wstring strFull;&lt;br /&gt;    &lt;br /&gt;    if( strFileName.size() == 0 )&lt;br /&gt;    {&lt;br /&gt;        TCHAR szModule[255] = L"";&lt;br /&gt;        ::GetModuleFileName(GetModuleHandle(NULL), szModule, MAX_PATH);&lt;br /&gt;        strFull = szModule;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;        strFull = strFileName;&lt;br /&gt;&lt;br /&gt;    static const wstring::size_type npos = -1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    wstring::size_type indexCh1a;&lt;br /&gt;    indexCh1a = strFull.rfind('\\');&lt;br /&gt;&lt;br /&gt;    if( indexCh1a != npos )&lt;br /&gt;        filename = strFull.substr(indexCh1a + 1);&lt;br /&gt;    else&lt;br /&gt;        filename = strFull;&lt;br /&gt;&lt;br /&gt;    return filename;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// 函式名稱: CutRFind&lt;br /&gt;// 函式說明: 去掉 ch 右邊的字串&lt;br /&gt;// 使用範例: &lt;br /&gt;// str = text.txt&lt;br /&gt;// str2 = mf.GetRFind(str, '.');&lt;br /&gt;// Assert( str2 = L"text");&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;wstring CuModuleFile::CutRFind(wstring str, TCHAR ch)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    wstring strResult;&lt;br /&gt;    static const wstring::size_type npos = -1;&lt;br /&gt;    wstring::size_type indexCh1a;&lt;br /&gt;    indexCh1a = str.rfind(ch);&lt;br /&gt;&lt;br /&gt;    if( indexCh1a != npos )&lt;br /&gt;        strResult = str.substr(0, indexCh1a);&lt;br /&gt;    else&lt;br /&gt;        strResult = str;&lt;br /&gt;&lt;br /&gt;    return strResult;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-3602124280147305065?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/3602124280147305065/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cumodulefile-retrieves-fully-qualified.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3602124280147305065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3602124280147305065'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cumodulefile-retrieves-fully-qualified.html' title='CuModuleFile  - Retrieves the fully-qualified path for the file that contains the onwer module.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-6560971626910007219</id><published>2010-01-25T15:00:00.000-08:00</published><updated>2010-01-25T15:00:01.564-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuVolume - sets the volume of a waveform output device.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// sets the volume of a waveform output device.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DWORD dw, dw2;&lt;br /&gt;// dw : 0x0000~0xffff&lt;br /&gt;// dw2: 0~MAX&lt;br /&gt;&lt;br /&gt;CuVolume Volume;&lt;br /&gt;dw = Volume.GetVolume();&lt;br /&gt;dw2 = Volume.GetVolume(MAX);&lt;br /&gt;&lt;br /&gt;Volume.SetVolume(dw);&lt;br /&gt;Volume.SetVolume(dw2, MAX);&lt;br /&gt;&lt;br /&gt;Volume.IncVolume(MAX);&lt;br /&gt;Volume.DecVolume(MAX);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuVolume.h&lt;br /&gt;&lt;br /&gt;class CuVolume  &lt;br /&gt;{&lt;br /&gt;    BOOL    m_bMute;&lt;br /&gt;    unsigned long   m_nVolume;&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////////&lt;br /&gt;    // &lt;br /&gt;    CuDllManager dll;&lt;br /&gt;    typedef DWORD (*pAudio)  ();&lt;br /&gt;    pAudio pProc;&lt;br /&gt;&lt;br /&gt;    void UpdateVolumeFromRegistry();&lt;br /&gt;    //////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuVolume();&lt;br /&gt;    virtual ~CuVolume();&lt;br /&gt;&lt;br /&gt;    void IncVolume(int nMax);&lt;br /&gt;    void DecVolume(int nMax);&lt;br /&gt;&lt;br /&gt;    BOOL GetMute(void){ return m_bMute; }&lt;br /&gt;    BOOL SetMute(BOOL b);&lt;br /&gt;&lt;br /&gt;    // 直接指定值 v = 0 ~ 0xffff&lt;br /&gt;    BOOL SetVolume(unsigned long v);&lt;br /&gt;    unsigned long GetVolume(void);&lt;br /&gt;&lt;br /&gt;    // 正規化過的值  指定max  Ex: v = 50 , nMAx = 100 , 會設定 50%&lt;br /&gt;    // v = 1, nMax = 5, 會設定 20%&lt;br /&gt;    BOOL SetVolume(int v, int nMax);&lt;br /&gt;&lt;br /&gt;    // 取回正規化過的值&lt;br /&gt;    int GetVolume(int nMax);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuVolume.cpp&lt;br /&gt;&lt;br /&gt;#define MAX_VALUES 0xffff&lt;br /&gt;&lt;br /&gt;void CuVolume::UpdateVolumeFromRegistry()&lt;br /&gt;{&lt;br /&gt;    if( pProc )&lt;br /&gt;        pProc();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuVolume::CuVolume()&lt;br /&gt;:m_bMute(FALSE)&lt;br /&gt;{&lt;br /&gt;    GetVolume();&lt;br /&gt;&lt;br /&gt;    dll.LoadLibrary(_T("coredll.dll"));&lt;br /&gt;    pProc = (pAudio)dll.GetProcAddress(_T("AudioUpdateFromRegistry"));&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuVolume::~CuVolume()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuVolume::SetMute(BOOL b)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    static unsigned long nVolume = GetVolume();&lt;br /&gt;&lt;br /&gt;    m_bMute = b;&lt;br /&gt;    if (m_bMute)&lt;br /&gt;    {&lt;br /&gt;        nVolume = GetVolume();&lt;br /&gt;        SetVolume(0);&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        SetVolume(nVolume);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return TRUE;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuVolume::SetVolume(unsigned long v)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    m_nVolume = v;&lt;br /&gt;    waveOutSetVolume(NULL, 0x10001 * v) ;&lt;br /&gt;&lt;br /&gt;    CReg reg(HKEY_CURRENT_USER, _T("ControlPanel\\Volume"));&lt;br /&gt;    reg.SetDW(_T("Volume"), 0x10001 * v);&lt;br /&gt;&lt;br /&gt;    UpdateVolumeFromRegistry();&lt;br /&gt;&lt;br /&gt;    return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;unsigned long CuVolume::GetVolume(void)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    unsigned long Value;&lt;br /&gt;    if (waveOutGetVolume(NULL,&amp;Value) == MMSYSERR_NOERROR)&lt;br /&gt;    {&lt;br /&gt;        m_nVolume = ( (LOWORD(Value)+HIWORD(Value)) ) / 2 ;&lt;br /&gt;    }&lt;br /&gt;    return m_nVolume;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuVolume::SetVolume(int v, int nMax)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    DWORD Value = v * MAX_VALUES / nMax;&lt;br /&gt;    SetVolume(Value);&lt;br /&gt;&lt;br /&gt;    return TRUE;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuVolume::GetVolume(int nMax)&lt;br /&gt;{&lt;br /&gt;    unsigned long Value;&lt;br /&gt;    Value = (float)nMax * ((float)GetVolume() + 600) / (float)MAX_VALUES;&lt;br /&gt;    return Value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuVolume::IncVolume(int nMax)&lt;br /&gt;{&lt;br /&gt;    &lt;br /&gt;    if( GetMute() )&lt;br /&gt;        SetMute(FALSE);&lt;br /&gt;&lt;br /&gt;    unsigned long offset_Value = (float)MAX_VALUES / nMax;&lt;br /&gt;    unsigned long Value = (float)GetVolume();&lt;br /&gt;&lt;br /&gt;    Value += offset_Value;&lt;br /&gt;    if( Value &amp;gt; MAX_VALUES)&lt;br /&gt;        Value = MAX_VALUES;&lt;br /&gt;&lt;br /&gt;    SetVolume(Value);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;void CuVolume::DecVolume(int nMax)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if( GetMute() )&lt;br /&gt;        SetMute(FALSE);&lt;br /&gt;&lt;br /&gt;    float offset_Value = (float)MAX_VALUES / nMax;&lt;br /&gt;    float Value = (float)GetVolume();&lt;br /&gt;&lt;br /&gt;    if( Value &amp;lt;= offset_Value)&lt;br /&gt;        Value = 0;&lt;br /&gt;    else&lt;br /&gt;        Value -= offset_Value;&lt;br /&gt;&lt;br /&gt;    SetVolume(Value);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-6560971626910007219?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/6560971626910007219/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cuvolume-sets-volume-of-waveform-output.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6560971626910007219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6560971626910007219'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cuvolume-sets-volume-of-waveform-output.html' title='CuVolume - sets the volume of a waveform output device.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-7762434352160208060</id><published>2010-01-24T15:00:00.000-08:00</published><updated>2010-01-24T15:00:01.686-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuPowerNotification  - to register for power notification events.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// to register for power notification events.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuPowerNotification.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuPowerNotification  &lt;br /&gt;{&lt;br /&gt;    HANDLE m_hRequestPowerNotifications;&lt;br /&gt;&lt;br /&gt;    CuWinThread *m_pWinThread;&lt;br /&gt;&lt;br /&gt;    CuMsgQueue m_MsgQueue;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    virtual void OnPowerNotification(PPOWER_BROADCAST ppower_broadcast){};&lt;br /&gt;    BOOL StopPowerNotifications();&lt;br /&gt;    HANDLE RequestPowerNotifications(DWORD Flags = POWER_NOTIFY_ALL, wstring strMsgQueueName = L"");&lt;br /&gt;    CuPowerNotification();&lt;br /&gt;    virtual ~CuPowerNotification();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    static DWORD Process(LPVOID lpVoid);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuPowerNotification.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define QUEUE_ENTRIES 3&lt;br /&gt;#define QUEUE_SIZE ( QUEUE_ENTRIES * (sizeof(POWER_BROADCAST) + sizeof(POWER_BROADCAST_POWER_INFO)) )&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Construction/Destruction&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;CuPowerNotification::CuPowerNotification()&lt;br /&gt;:m_hRequestPowerNotifications(NULL)&lt;br /&gt;,m_pWinThread(NULL)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuPowerNotification::~CuPowerNotification()&lt;br /&gt;{&lt;br /&gt;    StopPowerNotifications();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;HANDLE CuPowerNotification::RequestPowerNotifications(&lt;br /&gt;DWORD Flags /* = POWER_NOTIFY_ALL */&lt;br /&gt;, wstring strMsgQueueName /*= L""*/)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    StopPowerNotifications();&lt;br /&gt;&lt;br /&gt;    MSGQUEUEOPTIONS MsgQueueOptions;&lt;br /&gt;&lt;br /&gt;    memset(&amp;MsgQueueOptions , 0, sizeof( MsgQueueOptions));&lt;br /&gt;    &lt;br /&gt;    MsgQueueOptions.dwSize = sizeof( MSGQUEUEOPTIONS );&lt;br /&gt;    MsgQueueOptions.dwFlags = 0  ;&lt;br /&gt;    MsgQueueOptions.dwMaxMessages = QUEUE_ENTRIES;&lt;br /&gt;    MsgQueueOptions.cbMaxMessage =  QUEUE_SIZE;&lt;br /&gt;    MsgQueueOptions.bReadAccess = TRUE ;&lt;br /&gt;    //TCHAR *pszMsgQueue = strMsgQueueName.c_str();&lt;br /&gt;    TCHAR szMsgQueueName[64] = L"";&lt;br /&gt;&lt;br /&gt;    if( strMsgQueueName.empty() )&lt;br /&gt;        wsprintf( szMsgQueueName, L"%x", (int)this );&lt;br /&gt;    else&lt;br /&gt;        wsprintf( szMsgQueueName, L"%s", strMsgQueueName.c_str());&lt;br /&gt;    m_MsgQueue.CreateMsgQueue(szMsgQueueName, &amp;MsgQueueOptions);&lt;br /&gt;&lt;br /&gt;    m_hRequestPowerNotifications = ::RequestPowerNotifications(  m_MsgQueue, Flags );&lt;br /&gt;&lt;br /&gt;    if( m_hRequestPowerNotifications )&lt;br /&gt;        m_pWinThread = _BeginThread((_THREADPROC)CuPowerNotification::Process,&lt;br /&gt;          (LPVOID)this);&lt;br /&gt;&lt;br /&gt;    return m_hRequestPowerNotifications;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuPowerNotification::StopPowerNotifications()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if( m_pWinThread )&lt;br /&gt;        m_pWinThread-&amp;gt;Delete();&lt;br /&gt;&lt;br /&gt;    m_pWinThread = NULL;&lt;br /&gt;&lt;br /&gt;    return ::StopPowerNotifications(m_hRequestPowerNotifications);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DWORD CuPowerNotification::Process(LPVOID lpVoid)&lt;br /&gt;{&lt;br /&gt;    CuPowerNotification *pPowerNotification = (CuPowerNotification *)lpVoid;&lt;br /&gt;&lt;br /&gt;    static BYTE buf[QUEUE_SIZE];&lt;br /&gt;    static unsigned long nRead = 0;&lt;br /&gt;    static unsigned long flags = 0;&lt;br /&gt;    &lt;br /&gt;    DWORD dwResult;&lt;br /&gt;    while(1)&lt;br /&gt;    {&lt;br /&gt;        dwResult = WaitForSingleObject(pPowerNotification-&amp;gt;m_MsgQueue, INFINITE);&lt;br /&gt;        if( dwResult == WAIT_OBJECT_0 )&lt;br /&gt;        {&lt;br /&gt;            memset(&amp;buf , 0, QUEUE_SIZE);&lt;br /&gt;            dwResult = pPowerNotification-&amp;gt;m_MsgQueue.ReadMsgQueue( &lt;br /&gt;            &amp;buf, QUEUE_SIZE, &amp;nRead, INFINITE, &amp;flags);&lt;br /&gt;            if( dwResult != FALSE )&lt;br /&gt;                pPowerNotification-&amp;gt;OnPowerNotification((PPOWER_BROADCAST)buf);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-7762434352160208060?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/7762434352160208060/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cupowernotification-to-register-for.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7762434352160208060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7762434352160208060'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cupowernotification-to-register-for.html' title='CuPowerNotification  - to register for power notification events.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-620006680480579354</id><published>2010-01-23T15:00:00.000-08:00</published><updated>2010-01-24T02:47:57.938-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>TuWinTimer - creates a timer with the specified time-out value.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// creates a timer with the specified time-out value.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuMyClass&lt;br /&gt;{&lt;br /&gt;    TuWinTimer&amp;lt;CuMyClass&amp;gt; m_winTimer;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;    void OnMyFunction(void);&lt;br /&gt;    void Init(void);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;void CuMyClass::Init()&lt;br /&gt;{&lt;br /&gt;    m_winTimer.Init(1000); &lt;br /&gt;    m_winTimer.CombineElement(this, &amp;CuMyClass::OnMyFunction, g_hWnd);&lt;br /&gt;&lt;br /&gt;    ...&lt;br /&gt;    m_winTimer.OnStardTime();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuMyClass::OnMyFunction(void)&lt;br /&gt;{&lt;br /&gt;    ...&lt;br /&gt;    m_winTimer.OnStopTime();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// TuWinTimer.h&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;class TuWinTimer &lt;br /&gt;    &lt;br /&gt;    UINT m_uElapse;&lt;br /&gt;&lt;br /&gt;    T *m_pElement;&lt;br /&gt;&lt;br /&gt;    HWND m_hWnd;&lt;br /&gt;&lt;br /&gt;    typedef void ( T::*ELEMENTTIME_TIMEOUTPROC)(void);&lt;br /&gt;    ELEMENTTIME_TIMEOUTPROC m_fpTimeOutProc;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    static VOID CALLBACK TuWinTimerTimerProc( HWND hwnd,&lt;br /&gt;        UINT uMsg,&lt;br /&gt;        UINT_PTR idEvent,&lt;br /&gt;        DWORD dwTime&lt;br /&gt;    )&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        TuWinTimer&amp;lt;T&amp;gt; *pElement = (TuWinTimer&amp;lt;T&amp;gt;*)idEvent;&lt;br /&gt;        T *pActiveElement = pElement-&amp;gt;m_pElement;&lt;br /&gt;        (pActiveElement-&amp;gt;*(pElement-&amp;gt;m_fpTimeOutProc))();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;public:&lt;br /&gt;    &lt;br /&gt;    TuWinTimer();&lt;br /&gt;    ~TuWinTimer();&lt;br /&gt;&lt;br /&gt;    void Init(UINT uElapse);&lt;br /&gt;    void CombineElement(T *pElement, ELEMENTTIME_TIMEOUTPROC fpTimeOutProc, HWND hWnd);&lt;br /&gt;&lt;br /&gt;    void OnStardTime();&lt;br /&gt;    void OnStopTime();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;TuWinTimer&amp;lt;T&amp;gt;::TuWinTimer()&lt;br /&gt;:m_uElapse(0)&lt;br /&gt;,m_pElement(NULL)&lt;br /&gt;,m_fpTimeOutProc(NULL)&lt;br /&gt;,m_hWnd(NULL)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;TuWinTimer&amp;lt;T&amp;gt;::~TuWinTimer()&lt;br /&gt;{&lt;br /&gt;    OnStopTime();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;void TuWinTimer&amp;lt;T&amp;gt;::Init(UINT uElapse)&lt;br /&gt;{&lt;br /&gt;    m_uElapse = uElapse;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;void TuWinTimer&amp;lt;T&amp;gt;::OnStardTime()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    OnStopTime();&lt;br /&gt;    ::SetTimer(m_hWnd, (UINT)this, m_uElapse, TuWinTimer&amp;lt;T&amp;gt;::TuWinTimerTimerProc );&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;void TuWinTimer&amp;lt;T&amp;gt;::OnStopTime()&lt;br /&gt;{&lt;br /&gt;    ::KillTimer(m_hWnd, (UINT)this);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;void TuWinTimer&amp;lt;T&amp;gt;::CombineElement(T *pElement, ELEMENTTIME_TIMEOUTPROC fpTimeOutProc, HWND hWnd)&lt;br /&gt;{ &lt;br /&gt;    m_pElement = pElement; &lt;br /&gt;    m_fpTimeOutProc = fpTimeOutProc;&lt;br /&gt;&lt;br /&gt;    Assert( hWnd != NULL , L"Error : hWnd == NULL");&lt;br /&gt;    m_hWnd = hWnd;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-620006680480579354?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/620006680480579354/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tuwintimer-creates-timer-with-specified.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/620006680480579354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/620006680480579354'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tuwintimer-creates-timer-with-specified.html' title='TuWinTimer - creates a timer with the specified time-out value.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-5455338862366670650</id><published>2010-01-22T15:00:00.000-08:00</published><updated>2010-01-23T01:20:15.617-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuMsgQueue - pass information between different programs.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// pass information between different programs.&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;MSGQUEUEOPTIONS msg_queue_options;&lt;br /&gt;&lt;br /&gt;msg_queue_options.dwSize    = sizeof(MSGQUEUEOPTIONS);&lt;br /&gt;msg_queue_options.dwMaxMessages    = 0;&lt;br /&gt;msg_queue_options.cbMaxMessage    = TEST_BUFFER_SIZE;&lt;br /&gt;msg_queue_options.bReadAccess    = TRUE;&lt;br /&gt;msg_queue_options.dwFlags    = MSGQUEUE_NOPRECOMMIT;&lt;br /&gt;&lt;br /&gt;MsgReadQueue.CreateMsgQueue(lpszName, &amp;msg_queue_options);&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;wchar_t test_text[TEST_BUFFER_SIZE];&lt;br /&gt;ret = WaitForSingleObject(MsgReadQueue, INFINITE);&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;if (ret == WAIT_OBJECT_0) {&lt;br /&gt;        DWORD    read_bytes;&lt;br /&gt;        DWORD    flag;&lt;br /&gt;&lt;br /&gt;        MsgReadQueue.ReadMsgQueue(test_text, sizeof(wchar_t) * TEST_BUFFER_SIZE, &amp;read_bytes, INFINITE, &amp;flag);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuMsgQueue.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuMsgQueue  &lt;br /&gt;{&lt;br /&gt;    HANDLE m_hCreateMsgQueue;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    BOOL ReadMsgQueue(LPVOID lpBuffer,&lt;br /&gt;                        DWORD cbBufferSize,&lt;br /&gt;                        LPDWORD lpNumberOfBytesRead,&lt;br /&gt;                        DWORD dwTimeout,&lt;br /&gt;                        DWORD* pdwFlags);&lt;br /&gt;    HANDLE CreateMsgQueue(LPWSTR lpszName,LPMSGQUEUEOPTIONS lpOptions);&lt;br /&gt;    BOOL CloseMsgQueue(  );&lt;br /&gt;    operator HANDLE() const;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    CuMsgQueue();&lt;br /&gt;    virtual ~CuMsgQueue();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuMsgQueue.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuMsgQueue::CuMsgQueue()&lt;br /&gt;:m_hCreateMsgQueue(NULL)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuMsgQueue::~CuMsgQueue()&lt;br /&gt;{&lt;br /&gt;    CloseMsgQueue();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuMsgQueue::CloseMsgQueue()&lt;br /&gt;{&lt;br /&gt;    return ::CloseMsgQueue(m_hCreateMsgQueue);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;HANDLE CuMsgQueue::CreateMsgQueue(LPWSTR lpszName, LPMSGQUEUEOPTIONS lpOptions)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    CloseMsgQueue();&lt;br /&gt;    m_hCreateMsgQueue = ::CreateMsgQueue(lpszName, lpOptions);&lt;br /&gt;    return m_hCreateMsgQueue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuMsgQueue::operator HANDLE() const&lt;br /&gt;    { return (HANDLE)(this == NULL ? NULL : m_hCreateMsgQueue); }&lt;br /&gt;&lt;br /&gt;BOOL CuMsgQueue::ReadMsgQueue(LPVOID lpBuffer,&lt;br /&gt;                        DWORD cbBufferSize,&lt;br /&gt;                        LPDWORD lpNumberOfBytesRead,&lt;br /&gt;                        DWORD dwTimeout,&lt;br /&gt;                        DWORD* pdwFlags)&lt;br /&gt;{&lt;br /&gt;    return ::ReadMsgQueue(m_hCreateMsgQueue, lpBuffer, cbBufferSize, lpNumberOfBytesRead, dwTimeout, pdwFlags);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;像這種 MSGQUEUEOPTIONS msg_queue_options; 有結構設定的部份, 實在很想把他包到類別裡, 在使用函式參數傳遞,並且設定部份參數為預設值!&lt;br /&gt;&lt;br /&gt;不僅使用起來美觀! 而且還不用特別去查結構!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-5455338862366670650?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/5455338862366670650/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cumsgqueue-pass-information-between.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5455338862366670650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5455338862366670650'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cumsgqueue-pass-information-between.html' title='CuMsgQueue - pass information between different programs.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-5361794866346404480</id><published>2010-01-21T15:23:00.000-08:00</published><updated>2010-01-21T16:26:13.670-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuTimer -  specialized type of clock.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// specialized type of clock. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuTimer _Timer;&lt;br /&gt;&lt;br /&gt;while(1)&lt;br /&gt;{&lt;br /&gt;    _Timer.Make_Tick_Data();&lt;br /&gt;&lt;br /&gt;    if( _Timer.GetTimeOut(9) )&lt;br /&gt;        ....&lt;br /&gt;&lt;br /&gt;    _Timer.Tick_Data_Clear();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// CuTimer.h&lt;br /&gt;&lt;br /&gt;class CuTimer&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    BOOL GetTimeOut(int i); // table_1&lt;br /&gt;&lt;br /&gt;    void Make_Tick_Data();&lt;br /&gt;    void Tick_Data_Full();&lt;br /&gt;    void Tick_Data_Clear();&lt;br /&gt;    CuTimer();&lt;br /&gt;    ~CuTimer();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    DWORD More_Time[20];&lt;br /&gt;    DWORD lastTickCount[20];&lt;br /&gt;    BYTE Time_move[20];&lt;br /&gt;    DWORD thisTickCount;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuTimer.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuTimer::CuTimer(void)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    this-&amp;gt;Tick_Data_Clear();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuTimer::~CuTimer(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuTimer::Tick_Data_Clear()&lt;br /&gt;{&lt;br /&gt;    memset( Time_move, 0, sizeof Time_move );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuTimer::Tick_Data_Full()&lt;br /&gt;{&lt;br /&gt;    memset( Time_move, 1, sizeof Time_move );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuTimer::Make_Tick_Data()&lt;br /&gt;{&lt;br /&gt;    static DWORD delay[20] = {&lt;br /&gt;          10,     //0 , 1/100 sec 0.01&lt;br /&gt;          16,     //1 , 1/60  sec 0.016&lt;br /&gt;          17,     //2 , 1/56  sec 0.017&lt;br /&gt;          20,     //3 , 1/48  sec 0.020&lt;br /&gt;          25,     //4 , 1/40  sec 0.025&lt;br /&gt;          33,     //5 , 1/30  sec 0.033&lt;br /&gt;          41,     //6 , 1/24  sec 0.041&lt;br /&gt;          62,     //7 , 1/16  sec 0.062&lt;br /&gt;          83,     //8 , 1/12  sec 0.083&lt;br /&gt;          125,    //9 , 1/8   sec 0.125&lt;br /&gt;          166,    //10, 1/6   sec 0.166&lt;br /&gt;          250,    //11, 1/4   sec 0.250&lt;br /&gt;          333,    //12, 1/3   sec 0.333&lt;br /&gt;          500,    //13, 1/2   sec 0.5&lt;br /&gt;          1000,   //14, 1     sec&lt;br /&gt;          2000,   //15, 2     sec&lt;br /&gt;          3000,   //16, 3     sec&lt;br /&gt;          4000,   //17, 4     sec&lt;br /&gt;          5000,   //18, 5     sec&lt;br /&gt;          8000    //19, 8     sec&lt;br /&gt;        };&lt;br /&gt;&lt;br /&gt;    thisTickCount = GetTickCount();&lt;br /&gt;    for (int i = 0; i &amp;lt; 20;  i++)&lt;br /&gt;    {&lt;br /&gt;        if( (thisTickCount - lastTickCount[i]) &amp;gt;= delay[i])&lt;br /&gt;        {&lt;br /&gt;        More_Time[i] = (thisTickCount - lastTickCount[i]) - delay[i];&lt;br /&gt;&lt;br /&gt;        lastTickCount[i] = thisTickCount;&lt;br /&gt;&lt;br /&gt;        if( More_Time[i] &amp;lt; 30 )&lt;br /&gt;          lastTickCount[i] -= More_Time[i];&lt;br /&gt;&lt;br /&gt;        Time_move[i]++;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuTimer::GetTimeOut(int i)&lt;br /&gt;{&lt;br /&gt;    return (BOOL)Time_move[i];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-5361794866346404480?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/5361794866346404480/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cutimer-specialized-type-of-clock.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5361794866346404480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5361794866346404480'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cutimer-specialized-type-of-clock.html' title='CuTimer -  specialized type of clock.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-7390505731284154528</id><published>2010-01-20T15:00:00.000-08:00</published><updated>2010-01-20T15:00:02.168-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SampleCode'/><title type='text'>PHP : CDate</title><content type='html'>&lt;pre class="brush: php;"&gt;// CDate.php&lt;br /&gt;&lt;br /&gt;class CDate {&lt;br /&gt;    &lt;br /&gt;    function str2time($strStr, $strPattern)&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;       // an array of the valide date characters, see: http://php.net/date#AEN21898&lt;br /&gt;       $arrCharacters = array(&lt;br /&gt;           'd', // day&lt;br /&gt;           'm', // month&lt;br /&gt;           'y', // year, 2 digits&lt;br /&gt;           'Y', // year, 4 digits&lt;br /&gt;           'H', // hours&lt;br /&gt;           'i', // minutes&lt;br /&gt;           's'  // seconds&lt;br /&gt;       );&lt;br /&gt;       // transform the characters array to a string&lt;br /&gt;       $strCharacters = implode('', $arrCharacters);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;       // splits up the pattern by the date characters to get an array of the delimiters between the date characters&lt;br /&gt;       $arrDelimiters = preg_split('~['.$strCharacters.']~', $strPattern);&lt;br /&gt;&lt;br /&gt;       // transform the delimiters array to a string&lt;br /&gt;       $strDelimiters = quotemeta(implode('', array_unique($arrDelimiters)));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;       // splits up the date by the delimiters to get an array of the declaration&lt;br /&gt;       $arrStr    = preg_split('~[' . $strDelimiters . ']~' , $strStr);&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;       // splits up the pattern by the delimiters to get an array of the used characters&lt;br /&gt;       $arrPattern = preg_split('~['.$strDelimiters.']~', $strPattern);&lt;br /&gt;    &lt;br /&gt;        &lt;br /&gt;       // if the numbers of the two array are not the same, return false, because the cannot belong together&lt;br /&gt;       if (count($arrStr) !== count($arrPattern)) {&lt;br /&gt;           return false;&lt;br /&gt;       }&lt;br /&gt;    &lt;br /&gt;       // creates a new array which has the keys from the $arrPattern array and the values from the $arrStr array&lt;br /&gt;       $arrTime = array();&lt;br /&gt;       for ($i = 0;$i &amp;lt; count($arrStr);$i++) {&lt;br /&gt;           $arrTime[$arrPattern[$i]] = $arrStr[$i];&lt;br /&gt;       }&lt;br /&gt;    &lt;br /&gt;            &lt;br /&gt;       // gernerates a 4 digit year declaration of a 2 digit one by using the current year&lt;br /&gt;       if (isset($arrTime['y']) &amp;&amp; !isset($arrTime['Y'])) {&lt;br /&gt;           $arrTime['Y'] = substr(date('Y'), 0, 2) . $arrTime['y'];&lt;br /&gt;       }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;       // if a declaration is empty, it will be filled with the current date declaration&lt;br /&gt;       foreach ($arrCharacters as $strCharacter) {&lt;br /&gt;           if (empty($arrTime[$strCharacter])) {&lt;br /&gt;               $arrTime[$strCharacter] = date($strCharacter);&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;       // checks if the date is a valide date&lt;br /&gt;       if (!checkdate($arrTime['m'], $arrTime['d'], $arrTime['Y'])) {&lt;br /&gt;           return false;&lt;br /&gt;       }&lt;br /&gt;    &lt;br /&gt;       // generates the timestamp&lt;br /&gt;       $intTime = mktime($arrTime['H'], $arrTime['i'], $arrTime['s'], $arrTime['m'], $arrTime['d'], $arrTime['Y']);&lt;br /&gt;       // returns the timestamp&lt;br /&gt;    &lt;br /&gt;       return $intTime;&lt;br /&gt;    } // end function str2time&lt;br /&gt;    &lt;br /&gt;}// end class CDate&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;雖然現在很少人在寫PHP用手動比對時間, 通常都交給SQL去驗證.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-7390505731284154528?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/7390505731284154528/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/php-cdate.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7390505731284154528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7390505731284154528'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/php-cdate.html' title='PHP : CDate'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-7192272892793232166</id><published>2010-01-19T15:00:00.000-08:00</published><updated>2010-01-19T15:00:00.860-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Assert - assertion</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// An assertion statement specifies a condition that you expect to hold true at some particular point in your program.&lt;br /&gt;&lt;br /&gt;Assert(m_hThread != NULL, _T("CuWinThread::ResumeThread m_hThread != NULL");&lt;br /&gt;&lt;br /&gt;// uAssert.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#if defined(_DEBUG)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    #define WIDEN2(x) L ## x&lt;br /&gt;    #define WIDEN(x) WIDEN2(x)&lt;br /&gt;    #define __WFILE__ WIDEN(__FILE__)&lt;br /&gt;&lt;br /&gt;    extern bool CustomAssertFunction( bool, TCHAR*, int, TCHAR*, bool*);&lt;br /&gt;&lt;br /&gt;    #if defined(_WINDOWS)&lt;br /&gt;    #define ASSERTPRESS { _asm { int 3 } }&lt;br /&gt;    #else&lt;br /&gt;    #define ASSERTPRESS {}&lt;br /&gt;    #endif // defined(_WINDOWS)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    #define Assert( exp, description) \&lt;br /&gt;    { static bool ignoreAlways = false; \&lt;br /&gt;        if( !ignoreAlways) { \&lt;br /&gt;            if( CustomAssertFunction( (int)(exp), description, __LINE__, __FILE__, &amp;ignoreAlways) ) \&lt;br /&gt;                ASSERTPRESS \&lt;br /&gt;        } \&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    #define Verify(exp, description)          Assert(exp, description)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#else&lt;br /&gt;&lt;br /&gt;    #define Assert(exp, description)    ((void)0)&lt;br /&gt;    #define Verify(exp, description)    ((void)(exp))&lt;br /&gt;&lt;br /&gt;#endif  // defined(_DEBUG)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// uAssert.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Return:&lt;br /&gt;// true - Stop On Assert Line&lt;br /&gt;// false - continue&lt;br /&gt;bool CustomAssertFunction( bool bExp, TCHAR* strDesc, int iLine, TCHAR* strFilename,  bool *ignoreAlways)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if( !bExp )&lt;br /&gt;    {&lt;br /&gt;        TCHAR strTitle[255] = TEXT("");&lt;br /&gt;        TCHAR strText[255] = TEXT("");&lt;br /&gt;        wsprintf(strTitle, TEXT("%s - %d"), strFilename, iLine);&lt;br /&gt;        wsprintf(strText, TEXT("%s \n Yes to Continue \n No to Break\n Cancle to Ignore Always"), strDesc);&lt;br /&gt;        int nRelease = MessageBox(NULL, strText, strTitle, MB_YESNOCANCEL);&lt;br /&gt;        switch( nRelease )&lt;br /&gt;        {&lt;br /&gt;        case 6:&lt;br /&gt;            return false;&lt;br /&gt;            break;&lt;br /&gt;        case 7:&lt;br /&gt;            return true;&lt;br /&gt;            break;&lt;br /&gt;        case 2:&lt;br /&gt;            *ignoreAlways = true;&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;        &lt;br /&gt;    return false;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;這個有擴充過, 使用 _asm { int 3 } 能停在Assert 那一行.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-7192272892793232166?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/7192272892793232166/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/assert-assertion.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7192272892793232166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7192272892793232166'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/assert-assertion.html' title='Assert - assertion'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-1221673556323635928</id><published>2010-01-18T15:00:00.000-08:00</published><updated>2010-01-18T16:54:23.100-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuSocketFile - A CuFile object used for sending and receiving data across a network via Windows Sockets</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// CuSocketFile - A CuFile object used for sending and receiving data across a network via Windows Sockets.&lt;br /&gt;&lt;br /&gt;CuSocket sk;&lt;br /&gt;CuSocketFile skFile(&amp;sk);&lt;br /&gt;&lt;br /&gt;CuFile *pFile = &amp;skFile;&lt;br /&gt;&lt;br /&gt;pFile-&amp;gt;Write(...);&lt;br /&gt;pFile-&amp;gt;Read(...);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuSocketFile.h&lt;br /&gt;&lt;br /&gt;class CuSocketFile : public CuFile  &lt;br /&gt;{&lt;br /&gt;    CuSocket* m_pSocket;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;    CuSocketFile( CuSocket* pSocket);&lt;br /&gt;    ~CuSocketFile();&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    virtual int Write(const void* lpBuf, UINT nCount);&lt;br /&gt;    virtual int Read(void* lpBuf, UINT nCount);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuSocketFile.cpp&lt;br /&gt;&lt;br /&gt;CuSocketFile::~CuSocketFile()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuSocketFile::CuSocketFile(CuSocket *pSocket)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    m_pSocket = pSocket;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// rc == SOCKET_ERROR 在外部在處理&lt;br /&gt;int CuSocketFile::Read(void *lpBuf, UINT nCount)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if( lpBuf == NULL ) &lt;br /&gt;        return 0;&lt;br /&gt;&lt;br /&gt;    return m_pSocket-&amp;gt;Receive(lpBuf, nCount, 0);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuSocketFile::Write(const void *lpBuf, UINT nCount)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if( lpBuf == NULL ) &lt;br /&gt;        return 0;&lt;br /&gt;        &lt;br /&gt;    retrun m_pSocket-&amp;gt;Send((const TCHAR*)lpBuf , nCount, 0);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;使用繼承 public CuFile , 在對TheApp做多型, TheApp並不需要知道是LocalFile 還是 Remote Socket.&lt;br /&gt;這裡有個很特別的問題, CuFile 跟 CuSocketFile 除了介面相同外, 並沒有任何的程式碼相容.&lt;br /&gt;因此需要繼承的並不是CuFile實體, 而是 &lt;br /&gt;class CuFile : public IuFile &lt;br /&gt;class CuSocketFile : public IuFile&lt;br /&gt;繼承 CuFile 的介面 IuFile&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-1221673556323635928?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/1221673556323635928/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cusocketfile-cfile-object-used-for.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1221673556323635928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1221673556323635928'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cusocketfile-cfile-object-used-for.html' title='CuSocketFile - A CuFile object used for sending and receiving data across a network via Windows Sockets'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-714154072580997297</id><published>2010-01-17T15:00:00.000-08:00</published><updated>2010-01-17T15:34:45.319-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>CuTestUnit - Easy way to Unit Test.</title><content type='html'>&lt;pre class="brush: php;"&gt;// Easy way to Unit Test.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuTestUnit.php&lt;br /&gt;&lt;br /&gt;class CuTestUnit&lt;br /&gt;{&lt;br /&gt;    var $debug;&lt;br /&gt;    &lt;br /&gt;    function __construct()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;debug = new CuDebugger; &lt;br /&gt;    }   &lt;br /&gt;    &lt;br /&gt;    function CuTestUnit()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;__construct();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function assertTrue($bool, $key = null )&lt;br /&gt;    {&lt;br /&gt;        if( !$bool || $bool != true)&lt;br /&gt;            $result = "&amp;lt;font color = '#ff0000'&amp;gt;FALSE&amp;lt;/font&amp;gt;";&lt;br /&gt;        else&lt;br /&gt;            $result = "&amp;lt;font color = '#0000ff'&amp;gt;OK&amp;lt;/font&amp;gt;";&lt;br /&gt;        &lt;br /&gt;        $this-&amp;gt;debug-&amp;gt;debug($result,  $key);  &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function assertEquals($value1, $value2, $key = null)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;assertTrue($value1 == $value2, $key);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function GetHTML()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;debug-&amp;gt;GetHTML();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-714154072580997297?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/714154072580997297/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cutestunit-easy-way-to-unit-test.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/714154072580997297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/714154072580997297'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cutestunit-easy-way-to-unit-test.html' title='CuTestUnit - Easy way to Unit Test.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-3434944303431582012</id><published>2010-01-16T15:00:00.000-08:00</published><updated>2010-01-18T14:55:15.719-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>TuDeck - Card stack</title><content type='html'>&lt;pre class="brush: delphi;"&gt;//   Card stack&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// u_TDeck.pas&lt;br /&gt;&lt;br /&gt;unit u_TDeck;&lt;br /&gt;interface&lt;br /&gt;uses&lt;br /&gt;        Windows, Classes, SysUtils,&lt;br /&gt;        StdCtrls,&lt;br /&gt;        ch_LogMessages,&lt;br /&gt;&lt;br /&gt;        u_TList,&lt;br /&gt;        u_TexasHoldConst;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;&lt;br /&gt;        CARD_LIMIT = (13 * 4);    // 撲克牌總數 十三張 * 4種類&lt;br /&gt;&lt;br /&gt;        // 牌的位置&lt;br /&gt;        POSITION_POOL = 0; // 在牌堆裡&lt;br /&gt;        POSITION_HOLE = 1; // 玩家手牌&lt;br /&gt;        POSITION_FIELD = 2;// 桌上公牌&lt;br /&gt;&lt;br /&gt;        // 牌的類型&lt;br /&gt;        CARD_CATEGORY_SPADE = 0;  // 黑桃&lt;br /&gt;        CARD_CATEGORY_HEARD = 1;  // 紅心&lt;br /&gt;        CARD_CATEGORY_CLUB = 2;  // 梅花&lt;br /&gt;        CARD_CATEGORY_DIAMOND = 3;  // 方塊&lt;br /&gt;        CARD_CATEGORY_LIMIT = 4;  //&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 類別名稱：TCardData&lt;br /&gt;// 功　　能：每張牌的結構定義&lt;br /&gt;//******************************************************************************&lt;br /&gt;        TCardData = class        //TCardData 結構的定義&lt;br /&gt;            Category: word;       // 種類                 &lt;br /&gt;            Index: word;          // 數&lt;br /&gt;            ListIndex: word;      // 表格位置&lt;br /&gt;            Position: word;       // 位置&lt;br /&gt;            Player: integer;      // 玩家&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 類別名稱：TuDeck&lt;br /&gt;// 功　　能：維護牌堆資料 提供 亂數取牌&lt;br /&gt;//******************************************************************************&lt;br /&gt;        TuDeck = Class&lt;br /&gt;          private&lt;br /&gt;            m_aCardDataList: TuList;  // 撲克牌陣列&lt;br /&gt;            m_DeckMessToFiles : TLogMessToFiles;&lt;br /&gt;            function GetRandomCardIndex: integer; // 找一張沒有被派發出來的牌&lt;br /&gt;          public&lt;br /&gt;            constructor Create;&lt;br /&gt;            destructor Destroy; override;&lt;br /&gt;&lt;br /&gt;            procedure Init; // 初始化&lt;br /&gt;&lt;br /&gt;            &lt;br /&gt;            function GetRandomCard(Player, nPosition: integer): integer;&lt;br /&gt;            function GetIndexCard(nIndex,Player, nPosition:integer):integer;&lt;br /&gt;&lt;br /&gt;            function Items( nListIndex:integer ):TCardData;&lt;br /&gt;            function Index( nListIndex:integer ): word;&lt;br /&gt;            function Category( nListIndex:integer ): word;&lt;br /&gt;            function Position( nListIndex:integer ): word;&lt;br /&gt;            function Player( nListIndex:integer ): integer;&lt;br /&gt;        end;&lt;br /&gt;        function compareByPoker(Item1 : Pointer; Item2 : Pointer) : Integer;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;constructor TuDeck.Create;&lt;br /&gt;var&lt;br /&gt;        i: integer;&lt;br /&gt;        TmpCardData: TCardData;&lt;br /&gt;begin&lt;br /&gt;        m_DeckMessToFiles := TLogMessToFiles.Create('DeckMessage.txt');&lt;br /&gt; &lt;br /&gt;        m_aCardDataList := TuList.Create();&lt;br /&gt;        for i := 0 to CARD_LIMIT - 1 do begin&lt;br /&gt;            TmpCardData := TCardData.Create();&lt;br /&gt;            m_aCardDataList.Add(TmpCardData);&lt;br /&gt;        end;&lt;br /&gt;        &lt;br /&gt;        Init();&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;destructor TuDeck.Destroy;&lt;br /&gt;begin&lt;br /&gt;        m_aCardDataList.Free;&lt;br /&gt;        m_DeckMessToFiles.Free;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：Init&lt;br /&gt;// 功　　能：初始化撲克牌陣列 並洗牌(重設亂數種子)&lt;br /&gt;//******************************************************************************&lt;br /&gt;procedure TuDeck.Init();&lt;br /&gt;var&lt;br /&gt;&lt;br /&gt;        TmpCategory: integer;&lt;br /&gt;        TmpIndex: integer;&lt;br /&gt;        CardIndex: integer;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        // 每一把要重新洗牌 重設亂數種子&lt;br /&gt;        Randomize;&lt;br /&gt;&lt;br /&gt;        CardIndex := 0;&lt;br /&gt;        for TmpCategory := 0 to CARD_CATEGORY_LIMIT - 1 do begin&lt;br /&gt;            for TmpIndex := 1 to CARD_INDEX_LIMIT do begin&lt;br /&gt;                TmpCardData := m_aCardDataList.GetItems(CardIndex);&lt;br /&gt;                TmpCardData.Category := TmpCategory;&lt;br /&gt;                TmpCardData.Index := TmpIndex;&lt;br /&gt;                TmpCardData.ListIndex := CardIndex;&lt;br /&gt;                TmpCardData.Position := POSITION_POOL;&lt;br /&gt;                TmpCardData.Player := PLAYER_NIL;&lt;br /&gt;                Inc(CardIndex);&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：GetIndexCard&lt;br /&gt;// 功　　能：直接取出 nIndex 指定的牌&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuDeck.GetIndexCard(nIndex,Player, nPosition:integer):integer;&lt;br /&gt;var&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;        TmpCardData := m_aCardDataList.GetItems(nIndex);&lt;br /&gt;        TmpCardData.Position := nPosition;&lt;br /&gt;        TmpCardData.Player := Player;&lt;br /&gt;&lt;br /&gt;        Result := nIndex;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：GetRandomCard&lt;br /&gt;// 功　　能：亂數取牌&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuDeck.GetRandomCard(Player, nPosition: integer): integer;&lt;br /&gt;var&lt;br /&gt;        nIndex: integer;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        nIndex := GetRandomCardIndex();&lt;br /&gt;        TmpCardData := m_aCardDataList.GetItems(nIndex);&lt;br /&gt;        TmpCardData.Position := nPosition;&lt;br /&gt;        TmpCardData.Player := Player;&lt;br /&gt;&lt;br /&gt;        Result := nIndex;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//******************************************************************************&lt;br /&gt;// 函式名稱：GetRandomCardIndex&lt;br /&gt;// 功　　能：隨機取得 CardList 的參數&lt;br /&gt;//******************************************************************************&lt;br /&gt;function TuDeck.GetRandomCardIndex: integer;&lt;br /&gt;var&lt;br /&gt;        TmpIndex, nIndex: integer;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        nTmpNext : Integer;&lt;br /&gt;        nTmpPrev : Integer;&lt;br /&gt;        nRandom2 : Integer;&lt;br /&gt;&lt;br /&gt;        TmpCardData : TCardData;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        nIndex := Random(CARD_LIMIT);&lt;br /&gt;&lt;br /&gt;        // 如果 還沒發出去就直接發&lt;br /&gt;        TmpCardData := m_aCardDataList.GetItems(nIndex);&lt;br /&gt;        if TmpCardData.Position = POSITION_POOL then&lt;br /&gt;        begin&lt;br /&gt;            Result := nIndex;&lt;br /&gt;            exit;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        if nIndex = CARD_LIMIT - 1 then begin&lt;br /&gt;            nIndex := 0;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        (* 順序搜尋 *)&lt;br /&gt;        nTmpNext := -1;&lt;br /&gt;        for TmpIndex := nIndex to CARD_LIMIT - 1 do begin&lt;br /&gt;            TmpCardData := m_aCardDataList.GetItems(TmpIndex);&lt;br /&gt;            if TmpCardData.Position = POSITION_POOL then&lt;br /&gt;            begin&lt;br /&gt;                nTmpNext := TmpIndex;&lt;br /&gt;                break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;        &lt;br /&gt;        if nIndex = 0 then begin&lt;br /&gt;            nIndex := CARD_LIMIT - 1;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        nTmpPrev := -1;&lt;br /&gt;        for TmpIndex := nIndex downto 0 do begin&lt;br /&gt;            TmpCardData := m_aCardDataList.GetItems(TmpIndex);&lt;br /&gt;            if TmpCardData.Position = POSITION_POOL then begin&lt;br /&gt;                nTmpPrev := TmpIndex;&lt;br /&gt;                break;&lt;br /&gt;            end;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        // 當所有牌都發完時 才會兩個都是負的&lt;br /&gt;        // 如果發到都沒有牌 代表程式有問題&lt;br /&gt;        if (nTmpNext = -1) And (nTmpPrev = -1) then begin&lt;br /&gt;            m_DeckMessToFiles.m_WriteTXTOne(&lt;br /&gt;            Format ('nIndex %d nTmpNext %d nTmpPrev %d ',[nIndex, nTmpNext, nTmpPrev]), 1);&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        if nTmpNext = -1 then begin&lt;br /&gt;            Result := nTmpPrev;&lt;br /&gt;            exit;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        if nTmpPrev = -1 then begin&lt;br /&gt;            Result := nTmpNext;&lt;br /&gt;            exit;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        nRandom2 := Random(CARD_LIMIT) mod 2;&lt;br /&gt;        if nRandom2 = 1 then begin&lt;br /&gt;            Result := nTmpNext;&lt;br /&gt;        end else begin&lt;br /&gt;            Result := nTmpPrev;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TuDeck.Index( nListIndex:integer ): word;&lt;br /&gt;begin&lt;br /&gt;        Result := TCardData(m_aCardDataList.GetItems(nListIndex)).Index;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TuDeck.Category( nListIndex:integer ): word;&lt;br /&gt;begin&lt;br /&gt;       Result := TCardData(m_aCardDataList.GetItems(nListIndex)).Category;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TuDeck.Player( nListIndex:integer ): integer;&lt;br /&gt;begin&lt;br /&gt;       Result := TCardData(m_aCardDataList.GetItems(nListIndex)).Player;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TuDeck.Position( nListIndex:integer ): word;&lt;br /&gt;begin&lt;br /&gt;       Result := TCardData(m_aCardDataList.GetItems(nListIndex)).Position;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TuDeck.Items( nListIndex:integer ): TCardData;&lt;br /&gt;begin&lt;br /&gt;        Result := m_aCardDataList.GetItems(nListIndex);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi;"&gt;function compareByPoker(Item1 : Pointer; Item2 : Pointer) : Integer;&lt;br /&gt;var&lt;br /&gt;        CardData1, CardData2: TCardData;&lt;br /&gt;begin&lt;br /&gt;        CardData1 := Item1;&lt;br /&gt;        CardData2 := Item2;&lt;br /&gt;&lt;br /&gt;        if CardData1.Index &gt; CardData2.Index then&lt;br /&gt;            Result := 1&lt;br /&gt;        else if CardData1.Index = CardData2.Index then&lt;br /&gt;            Result := 0&lt;br /&gt;        else&lt;br /&gt;            Result := -1;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;compare是給TList使用的&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;牌堆取牌器(52張牌)&lt;br /&gt;&lt;br /&gt;用在發牌, 發麻將, 都還不錯. &lt;br /&gt;&lt;br /&gt;當然啦,除非要用, 不然在小弟的強大墮性的驅使下, 不會花時間做任何的多型!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-3434944303431582012?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/3434944303431582012/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tudeck-card-stack.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3434944303431582012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3434944303431582012'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tudeck-card-stack.html' title='TuDeck - Card stack'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-3106620842045837723</id><published>2010-01-15T15:00:00.000-08:00</published><updated>2010-01-15T15:00:05.686-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuListCtrl - Encapsulates the functionality of a "list view control"</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Encapsulates the functionality of a "list view control"&lt;br /&gt;&lt;br /&gt;m_ListCtrl.Create( WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_SHOWSELALWAYS , rt, hWnd, (UINT)&amp;1);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuListCtrl.h&lt;br /&gt;&lt;br /&gt;class CuListCtrl&lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt;    CuWnd m_ListCtrlWnd;&lt;br /&gt;public:&lt;br /&gt;    CuListCtrl(void);&lt;br /&gt;    ~CuListCtrl(void);&lt;br /&gt;&lt;br /&gt;    virtual BOOL Create( DWORD dwStyle, const RECT&amp; rect,&lt;br /&gt;        HWND hParentWnd, UINT nID );&lt;br /&gt;&lt;br /&gt;    int InsertColumn( int nCol, const LVCOLUMN* pColumn );&lt;br /&gt;    int InsertColumn( int nCol, TCHAR * lpszColumnHeading, &lt;br /&gt;        int nFormat = LVCFMT_LEFT, int nWidth = -1,int nSubItem = -1 );&lt;br /&gt;&lt;br /&gt;    int InsertItem( const LVITEM* pItem );&lt;br /&gt;    int InsertItem( int nItem,  TCHAR * lpszItem );&lt;br /&gt;    int InsertItem( int nItem,  TCHAR * lpszItem, int nImage );&lt;br /&gt;    int InsertItem( UINT nMask, int nItem, TCHAR * lpszItem, &lt;br /&gt;        UINT nState, UINT nStateMask, int nImage, LPARAM lParam );&lt;br /&gt;&lt;br /&gt;    BOOL SetItemText( int nItem, int nSubItem, TCHAR * lpszText );&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuListCtrl.cpp&lt;br /&gt;&lt;br /&gt;CuListCtrl::CuListCtrl(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuListCtrl::~CuListCtrl(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuListCtrl::Create(&lt;br /&gt;                    DWORD dwStyle,&lt;br /&gt;                    const RECT&amp; rect,&lt;br /&gt;                    HWND hParentWnd,&lt;br /&gt;                    UINT nID &lt;br /&gt;                    )&lt;br /&gt;{&lt;br /&gt;    return m_ListCtrlWnd.Create(WC_LISTVIEW , L"", dwStyle, rect, hParentWnd, nID);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuListCtrl::InsertColumn( int nCol, const LVCOLUMN* pColumn )&lt;br /&gt;{&lt;br /&gt;    return ListView_InsertColumn(m_ListCtrlWnd.GetSafeHwnd() , nCol, pColumn) ;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuListCtrl::InsertColumn( int nCol, TCHAR *lpszColumnHeading, &lt;br /&gt;                 int nFormat /* = LVCFMT_LEFT */, int nWidth /* = -1 */ ,int nSubItem /* = -1 */)&lt;br /&gt;{&lt;br /&gt;    LV_COLUMN lvC = {0};&lt;br /&gt;    lvC.mask = LVCF_FMT | LVCF_TEXT ;&lt;br /&gt;&lt;br /&gt;    if( nWidth != -1 )&lt;br /&gt;    {&lt;br /&gt;        lvC.mask = lvC.mask | LVCF_WIDTH;&lt;br /&gt;        lvC.cx = nWidth;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if( nSubItem != -1 )&lt;br /&gt;    {&lt;br /&gt;        lvC.mask = lvC.mask | LVCF_SUBITEM;&lt;br /&gt;        lvC.iSubItem = nSubItem;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    lvC.fmt = nFormat;&lt;br /&gt;    lvC.pszText = lpszColumnHeading;&lt;br /&gt;&lt;br /&gt;    return this-&amp;gt;InsertColumn( nCol, &amp;lvC);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuListCtrl::InsertItem( const LVITEM* pItem )&lt;br /&gt;{&lt;br /&gt;    return  ListView_InsertItem(m_ListCtrlWnd.GetSafeHwnd(), pItem);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuListCtrl::InsertItem( int nItem,  TCHAR * lpszItem )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    LVITEM lvI = {0};&lt;br /&gt;    lvI.mask = LVIF_TEXT ;&lt;br /&gt;    lvI.iItem = nItem;&lt;br /&gt;    lvI.pszText = lpszItem;&lt;br /&gt;&lt;br /&gt;    return this-&amp;gt;InsertItem( &amp;lvI);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuListCtrl::InsertItem( int nItem,  TCHAR * lpszItem, int nImage )&lt;br /&gt;{&lt;br /&gt;    LVITEM lvI = {0};&lt;br /&gt;    lvI.mask = LVIF_TEXT | LVIF_IMAGE ;&lt;br /&gt;    lvI.iItem = nItem;&lt;br /&gt;    lvI.pszText = lpszItem;&lt;br /&gt;    lvI.iImage = nImage;&lt;br /&gt;&lt;br /&gt;    return this-&amp;gt;InsertItem( &amp;lvI);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuListCtrl::InsertItem( UINT nMask, int nItem, TCHAR * lpszItem, &lt;br /&gt;                           UINT nState, UINT nStateMask, int nImage, LPARAM lParam )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    LVITEM lvI = {0};&lt;br /&gt;    lvI.mask = nMask;&lt;br /&gt;    lvI.iItem = nItem;&lt;br /&gt;    lvI.pszText = lpszItem;&lt;br /&gt;    lvI.state = nState;&lt;br /&gt;    lvI.stateMask = nStateMask;&lt;br /&gt;    lvI.iImage = nImage;&lt;br /&gt;    lvI.lParam = lParam;&lt;br /&gt;&lt;br /&gt;    return this-&amp;gt;InsertItem( &amp;lvI);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuListCtrl::SetItemText( int nItem, int nSubItem, TCHAR * lpszText )&lt;br /&gt;{&lt;br /&gt;    ListView_SetItemText( m_ListCtrlWnd.GetSafeHwnd(), nItem, nSubItem, lpszText)&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;這個是很無聊的封裝, 但在CE上作業時, 不開MFC下, 也只能包一包&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-3106620842045837723?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/3106620842045837723/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/culistctrl-encapsulates-functionality.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3106620842045837723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3106620842045837723'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/culistctrl-encapsulates-functionality.html' title='CuListCtrl - Encapsulates the functionality of a &quot;list view control&quot;'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-8070452009119954497</id><published>2010-01-14T15:00:00.000-08:00</published><updated>2010-01-18T14:10:53.721-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>CuDebugger - Display PHP value about Array , Class detail information.</title><content type='html'>&lt;pre class="brush: php;"&gt;// Display PHP value about Array , Class detail information.&lt;br /&gt;&lt;br /&gt;$debug = new CuDebugger&lt;br /&gt;$debug-&amp;gt;debug($result,  $key);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuDebugger.php&lt;br /&gt;&lt;br /&gt;class CuDebugger  {&lt;br /&gt;&lt;br /&gt;    var $m_Data;&lt;br /&gt;    var $m_DataIndex;&lt;br /&gt;&lt;br /&gt;    function CuDebugger() {&lt;br /&gt;        $this-&amp;gt;m_Data = array();&lt;br /&gt;        $this-&amp;gt;m_DataIndex = 0;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function debug($data, $key = null, $innerText = false)&lt;br /&gt;    {&lt;br /&gt;    &lt;br /&gt;        $index = $this-&amp;gt;m_DataIndex + 1;&lt;br /&gt;        $this-&amp;gt;m_Data[$index . " " .$key] = $data;&lt;br /&gt;        $this-&amp;gt;m_DataIndex = $index;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function innerText($data, $key = null)&lt;br /&gt;    {&lt;br /&gt;        $data = str_replace("&amp;lt;", "&amp; lt;", $data);&lt;br /&gt;        $data = str_replace("&amp;gt;", "&amp; gt;", $data); &lt;br /&gt;        &lt;br /&gt;        $this-&amp;gt;debug($data, $key);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function GetHTML(){&lt;br /&gt;        return $this-&amp;gt;printArray($this-&amp;gt;m_Data);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function printArray($var) {&lt;br /&gt;        &lt;br /&gt;        $title_string = "";&lt;br /&gt;        $string_row = "";&lt;br /&gt;        $string_value = "";&lt;br /&gt;        $string = "";&lt;br /&gt;        &lt;br /&gt;        foreach($var as $key =&amp;gt; $value){&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            if( is_array($value) ) {&lt;br /&gt;                $string_value .= $this-&amp;gt;printArray($value, false);&lt;br /&gt;            }&lt;br /&gt;            elseif(gettype($value) == 'object') {&lt;br /&gt;                $string_value .= "Object of class " . get_class($value) . " { ".serialize($value) . " } ";&lt;br /&gt;            }&lt;br /&gt;            elseif( $value ) {&lt;br /&gt;                $string_value .= "$value";&lt;br /&gt;            }&lt;br /&gt;            else {&lt;br /&gt;                $string_value .= "&amp;lt; BR &amp;gt;";&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            $string_row .= "&amp;lt;tr&amp;gt;\n&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;$key&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;$string_value&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n";       &lt;br /&gt;            $string_value = "";&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        if( $string_row ) {&lt;br /&gt;            $string = '&amp;lt;table border = "1"&amp;gt;'.$string_row;&lt;br /&gt;            $string .= "&amp;lt;/table&amp;gt;\n";&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        return $string;&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;    }   &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-8070452009119954497?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/8070452009119954497/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cudebugger-display-php-value-about.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/8070452009119954497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/8070452009119954497'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cudebugger-display-php-value-about.html' title='CuDebugger - Display PHP value about Array , Class detail information.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-39316619691147066</id><published>2010-01-13T15:00:00.000-08:00</published><updated>2010-01-14T01:50:40.060-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuEdit - provides the functionality of a Windows edit control.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// provides the functionality of a Windows edit control.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuEdit gEdit;&lt;br /&gt;gEdit.Create( WS_VISIBLE|WS_CHILD| WS_BORDER,&lt;br /&gt;       CuRect(0, 0, 40 * 2 , 14 * 2), hWnd, (UINT)1);&lt;br /&gt;&lt;br /&gt;gEdit.SetWindowText(TEXT("HI Edit"));&lt;br /&gt;&lt;br /&gt;String strText;&lt;br /&gt;gEdit.GetWindowText(strText);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuEdit.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuEdit&lt;br /&gt;{&lt;br /&gt;    CuWnd m_EditWnd;&lt;br /&gt;public:&lt;br /&gt;    CuEdit(void);&lt;br /&gt;    ~CuEdit(void);&lt;br /&gt;&lt;br /&gt;    virtual BOOL Create( DWORD dwStyle, const RECT&amp; rect, &lt;br /&gt;        HWND hParentWnd, UINT nID );&lt;br /&gt;&lt;br /&gt;    void SetWindowText( LPCTSTR lpszString );&lt;br /&gt;    void GetWindowText( String&amp; rString ) const;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuEdit.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuEdit::CuEdit(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuEdit::~CuEdit(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuEdit::Create( DWORD dwStyle, const RECT&amp; rect, &lt;br /&gt;                    HWND hParentWnd, UINT nID )&lt;br /&gt;{&lt;br /&gt;    return m_EditWnd.CreateEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), &lt;br /&gt;        TEXT(""), dwStyle, rect, hParentWnd, nID);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuEdit::SetWindowText( LPCTSTR lpszString )&lt;br /&gt;{&lt;br /&gt;    ::SetWindowText( m_EditWnd.GetSafeHwnd(), lpszString );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuEdit::GetWindowText( String&amp; rString ) const&lt;br /&gt;{&lt;br /&gt;    int nLenght = ::GetWindowTextLength( m_EditWnd );&lt;br /&gt;    TCHAR *pszBuffer = new TCHAR[nLenght + 1];&lt;br /&gt;&lt;br /&gt;    ::GetWindowText(m_EditWnd , pszBuffer, nLenght);&lt;br /&gt;&lt;br /&gt;    rString = pszBuffer;&lt;br /&gt;    delete [] pszBuffer;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;沒打算繼承CuWnd! 看不到多型 繼承後也沒任何好處!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-39316619691147066?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/39316619691147066/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cuedit-provides-functionality-of.html#comment-form' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/39316619691147066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/39316619691147066'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cuedit-provides-functionality-of.html' title='CuEdit - provides the functionality of a Windows edit control.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-1999219593120034541</id><published>2010-01-12T15:00:00.001-08:00</published><updated>2010-05-13T18:58:38.323-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuWnd - is distinct from a Windows window</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// is distinct from a Windows window&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;class CuMainWnd : public CuWnd {};&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;CuWnd ListCtrlWnd;&lt;br /&gt;ListCtrlWnd.Create(WC_LISTVIEW , TEXT(""), dwStyle, rect, hParentWnd, nID);&lt;br /&gt;&lt;br /&gt;CuWnd EditWnd;&lt;br /&gt;EditWnd.CreateEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), dwStyle, rect, hParentWnd, nID);&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: cpp;"&gt;// CuWnd.h&lt;br /&gt;&lt;br /&gt;class CuWnd&lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt;    HWND m_hWnd;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////////&lt;br /&gt;    // 函式名稱: WndProc&lt;br /&gt;    // 函式說明: Create時預設的訊息回圈 會將訊息派送到 OnMsg裡&lt;br /&gt;    //////////////////////////////////////////////////////////////////////&lt;br /&gt;    static LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    // 建構 解構&lt;br /&gt;    CuWnd(void);&lt;br /&gt;    virtual ~CuWnd(void);&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;&lt;br /&gt;    //////////////////////////////////////////////////////////////////////&lt;br /&gt;    // 函式名稱: OnMsg&lt;br /&gt;    // 函式說明: 繼承這個函式處理windows訊息&lt;br /&gt;    //////////////////////////////////////////////////////////////////////&lt;br /&gt;    virtual LRESULT OnMsg(MSG &amp;msg);&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;    virtual BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName,&lt;br /&gt;        DWORD dwStyle,  const CuRect &amp;rect, &lt;br /&gt;        HWND hParentWnd = NULL, UINT nID = NULL );&lt;br /&gt;&lt;br /&gt;    virtual BOOL CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName,&lt;br /&gt;        LPCTSTR lpszWindowName, DWORD dwStyle, const CuRect&amp; rect,&lt;br /&gt;        HWND hParentWnd = NULL, UINT nID = NULL);&lt;br /&gt;&lt;br /&gt;    ATOM WndRegisterClassEx(LPCTSTR szWindowClass);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // inline 函式 實作碼在下方&lt;br /&gt;    HWND GetSafeHwnd( ) const;&lt;br /&gt;    BOOL ShowWindow(int nCmdShow);&lt;br /&gt;    BOOL UpdateWindow();&lt;br /&gt;    BOOL DestroyWindow();&lt;br /&gt;&lt;br /&gt;    operator HWND() const&lt;br /&gt;    {&lt;br /&gt;        return GetSafeHwnd();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    // 訊息處理函式&lt;br /&gt;    void OnDestroy();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;inline HWND CuWnd::GetSafeHwnd() const&lt;br /&gt;{ return (HWND)(this == NULL ? NULL : m_hWnd) ;}&lt;br /&gt;&lt;br /&gt;inline BOOL CuWnd::ShowWindow(int nCmdShow)&lt;br /&gt;{ return ::ShowWindow( m_hWnd, nCmdShow); }&lt;br /&gt;&lt;br /&gt;inline BOOL CuWnd::UpdateWindow()&lt;br /&gt;{ return ::UpdateWindow(m_hWnd); }&lt;br /&gt;&lt;br /&gt;inline BOOL CuWnd::DestroyWindow()&lt;br /&gt;{ &lt;br /&gt; BOOL bResult = ::DestroyWindow(m_hWnd); &lt;br /&gt; m_hWnd = NULL;&lt;br /&gt; return bResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: cpp;"&gt;// CuWnd.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuWnd::CuWnd(void)&lt;br /&gt;:m_hWnd(NULL)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuWnd::~CuWnd(void)&lt;br /&gt;{&lt;br /&gt;    this-&amp;gt;DestroyWindow();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// 函式名稱: OnMsg&lt;br /&gt;// 函式說明: 預設訊息處理&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;LRESULT CuWnd::OnMsg(MSG &amp;msg)&lt;br /&gt;{&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuWnd::OnDestroy()&lt;br /&gt;{&lt;br /&gt;    PostQuitMessage(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;LRESULT CALLBACK CuWnd::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    static MSG msg;&lt;br /&gt;&lt;br /&gt;    msg.hwnd = hWnd;&lt;br /&gt;    msg.message = message;&lt;br /&gt;    msg.wParam = wParam;&lt;br /&gt;    msg.lParam = lParam;&lt;br /&gt;&lt;br /&gt;    static CuWnd *pWnd = NULL;&lt;br /&gt;    if( message == WM_CREATE )&lt;br /&gt;    {&lt;br /&gt;    &lt;br /&gt;        CREATESTRUCT *pct = (LPCREATESTRUCT)lParam;&lt;br /&gt;        ::SetWindowLong( hWnd , GWL_USERDATA, (LONG)pct-&amp;gt;lpCreateParams );&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    pWnd = (CuWnd *)::GetWindowLong(hWnd, GWL_USERDATA);&lt;br /&gt;    if( pWnd &amp;&amp; pWnd-&amp;gt;OnMsg(msg) )&lt;br /&gt;        return 0;&lt;br /&gt;    else&lt;br /&gt;        return ::DefWindowProc(hWnd, message, wParam, lParam);&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuWnd::Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName,&lt;br /&gt;                    DWORD dwStyle, const CuRect &amp;rect,&lt;br /&gt;                    HWND hParentWnd /* = NULL */, UINT nID /* = NULL*/ )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    m_hWnd = ::CreateWindow(lpszClassName, lpszWindowName, dwStyle,&lt;br /&gt;        rect.left, rect.top, rect.Width(), rect.Height(), &lt;br /&gt;        hParentWnd, (HMENU)nID, GetModuleHandle(NULL), (LPVOID) this);&lt;br /&gt;&lt;br /&gt;    Assert( m_hWnd != NULL, L"CreateWindow Error");&lt;br /&gt;    DWORD dwError = GetLastError();&lt;br /&gt;&lt;br /&gt;    return (BOOL) (m_hWnd == NULL ? NULL : m_hWnd);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuWnd::CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName,&lt;br /&gt;                      LPCTSTR lpszWindowName, DWORD dwStyle, const CuRect&amp; rect,&lt;br /&gt;                      HWND hParentWnd  /* = NULL */, UINT nID /* = NULL*/)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    m_hWnd = ::CreateWindowEx( dwExStyle, lpszClassName, &lt;br /&gt;        lpszWindowName, dwStyle, &lt;br /&gt;        rect.left, rect.top, rect.Width(), rect.Height(),&lt;br /&gt;        hParentWnd, (HMENU)nID, GetModuleHandle(NULL), (LPVOID) this);&lt;br /&gt;&lt;br /&gt;    Assert( m_hWnd != NULL, L"CreateWindow Error");&lt;br /&gt;    DWORD dwError = GetLastError();&lt;br /&gt;&lt;br /&gt;    return (BOOL) (m_hWnd == NULL ? NULL : m_hWnd);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ATOM CuWnd::WndRegisterClassEx(LPCTSTR szWindowClass)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    WNDCLASS    wc;&lt;br /&gt;    &lt;br /&gt;    wc.style            = CS_HREDRAW | CS_VREDRAW;&lt;br /&gt;&lt;br /&gt;    wc.lpfnWndProc      = (WNDPROC) WndProc;&lt;br /&gt;    wc.cbClsExtra       = 0;&lt;br /&gt;    wc.cbWndExtra       = 0;&lt;br /&gt;    wc.hInstance        = GetModuleHandle(NULL);&lt;br /&gt;    wc.hIcon            = 0;&lt;br /&gt;    wc.hCursor          = 0;&lt;br /&gt;    wc.hbrBackground    = 0;&lt;br /&gt;    wc.lpszMenuName     = 0;&lt;br /&gt;    wc.lpszClassName    = szWindowClass;&lt;br /&gt;    &lt;br /&gt;    return RegisterClass(&amp;wc);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-1999219593120034541?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/1999219593120034541/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cuwnd-is-distinct-from-windows-window_12.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1999219593120034541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1999219593120034541'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cuwnd-is-distinct-from-windows-window_12.html' title='CuWnd - is distinct from a Windows window'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2106202153968289716</id><published>2010-01-11T16:00:00.001-08:00</published><updated>2010-01-11T16:00:01.259-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CCriticalSection  - a critical section object.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// a critical section object.&lt;br /&gt;&lt;br /&gt;CCriticalSection m_cs;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;m_cs.Enter();&lt;br /&gt;...&lt;br /&gt;m_cs.Leave();&lt;br /&gt;&lt;br /&gt;// CCriticalSection.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CCriticalSection  &lt;br /&gt;{&lt;br /&gt;    CRITICAL_SECTION m_CriticalSection;&lt;br /&gt;public:&lt;br /&gt;    void Leave();&lt;br /&gt;    void Enter();&lt;br /&gt;&lt;br /&gt;    CCriticalSection();&lt;br /&gt;    virtual ~CCriticalSection();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CCriticalSection.cpp&lt;br /&gt;&lt;br /&gt;CCriticalSection::CCriticalSection()&lt;br /&gt;{&lt;br /&gt;    ::InitializeCriticalSection(&amp;m_CriticalSection);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CCriticalSection::~CCriticalSection()&lt;br /&gt;{&lt;br /&gt;    ::DeleteCriticalSection(&amp;m_CriticalSection);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CCriticalSection::Enter()&lt;br /&gt;{&lt;br /&gt;    ::EnterCriticalSection(&amp;m_CriticalSection);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CCriticalSection::Leave()&lt;br /&gt;{&lt;br /&gt;    ::LeaveCriticalSection(&amp;m_CriticalSection);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2106202153968289716?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2106202153968289716/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/ccriticalsection-critical-section.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2106202153968289716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2106202153968289716'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/ccriticalsection-critical-section.html' title='CCriticalSection  - a critical section object.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-1508398160080091773</id><published>2010-01-10T16:00:00.000-08:00</published><updated>2010-01-11T04:37:29.510-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuKeyStatusComposite - group of KeyStatus</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// group of KeyStatus&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuKeyStatusComposite ksComposite;&lt;br /&gt;&lt;br /&gt;for( int j = 0 ; j &lt; arr.size() ; j++ )&lt;br /&gt;{&lt;br /&gt;    CuKeyStatus *pks = new CuKeyStatus;&lt;br /&gt;    // ...&lt;br /&gt;    ksComposite.push_back(pks);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ksComposite.clear();&lt;br /&gt;&lt;br /&gt;// CuKeyStatusComposite.h&lt;br /&gt;&lt;br /&gt;class CuKeyStatusComposite :&lt;br /&gt; public TuComposite&amp;lt;CuKeyStatus&amp;gt;&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    CuKeyStatusComposite(void);&lt;br /&gt;    ~CuKeyStatusComposite(void);&lt;br /&gt;&lt;br /&gt;    int GetEqualItemIndex( CuKeyStatus &amp;KeyStatus);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuKeyStatusComposite.cpp&lt;br /&gt;&lt;br /&gt;CuKeyStatusComposite::CuKeyStatusComposite(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuKeyStatusComposite::~CuKeyStatusComposite(void)&lt;br /&gt;{&lt;br /&gt;    this-&gt;clear();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuKeyStatusComposite::GetEqualItemIndex( CuKeyStatus &amp;KeyStatus)&lt;br /&gt;{&lt;br /&gt;    int nResult = -1;&lt;br /&gt;    &lt;br /&gt;    _itor = _itsElement.begin();&lt;br /&gt;    &lt;br /&gt;    while(  _itor != _itsElement.end() )&lt;br /&gt;    {&lt;br /&gt;    &lt;br /&gt;        if( KeyStatus == *(*_itor) )&lt;br /&gt;        {&lt;br /&gt;            nResult = _itor - _itsElement.begin();&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    &lt;br /&gt;        _itor++;&lt;br /&gt;    &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    return nResult;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;GetEqualItemIndex 只有這個專案需要, 沒有打算移到 TuComposite 內, 下次在遇到時, 在處理.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-1508398160080091773?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/1508398160080091773/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cukeystatuscomposite-group-of-keystatus.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1508398160080091773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/1508398160080091773'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cukeystatuscomposite-group-of-keystatus.html' title='CuKeyStatusComposite - group of KeyStatus'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-396941387784617621</id><published>2010-01-09T16:00:00.000-08:00</published><updated>2010-01-09T16:00:02.127-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SampleCode'/><title type='text'>CReg -  An encapsulation of the Windows registry key.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// An encapsulation of the Windows registry key.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CReg reg(HKEY_LOCAL_MACHINE, TEXT("Software\\AppName\\"));&lt;br /&gt;string strPath = reg.ValueSZ( "KeyName" );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CReg.h&lt;br /&gt;&lt;br /&gt;class CReg  &lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt;    HKEY    m_hKey;&lt;br /&gt;    int     m_Index;&lt;br /&gt;    LPBYTE  m_lpbValue; // last value read, if any&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CReg();&lt;br /&gt;    ~CReg();&lt;br /&gt;&lt;br /&gt;    BOOL Create(HKEY hkRoot, LPCTSTR pszKey) {&lt;br /&gt;        DWORD dwDisp;&lt;br /&gt;        return ERROR_SUCCESS==RegCreateKeyEx(hkRoot, pszKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &amp;m_hKey, &amp;dwDisp);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    BOOL Open(HKEY hkRoot, LPCTSTR pszKey, REGSAM sam=KEY_READ) {&lt;br /&gt;        return ERROR_SUCCESS==RegOpenKeyEx(hkRoot, pszKey, 0, sam, &amp;m_hKey);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    CReg(HKEY hkRoot, LPCTSTR pszKey) {&lt;br /&gt;        m_hKey = NULL;&lt;br /&gt;        m_Index = 0;&lt;br /&gt;        m_lpbValue = NULL;&lt;br /&gt;        Open(hkRoot, pszKey);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    void MyFree(LPBYTE m_lpbValue) {&lt;br /&gt;        delete [] m_lpbValue;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    LPBYTE MyRgAlloc(int dwLen)&lt;br /&gt;    {&lt;br /&gt;        return new BYTE[dwLen];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    void Reset() { &lt;br /&gt;        if(m_hKey) RegCloseKey(m_hKey); &lt;br /&gt;        MyFree(m_lpbValue);&lt;br /&gt;        m_hKey = NULL;&lt;br /&gt;        m_Index = 0;&lt;br /&gt;        m_lpbValue = NULL;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    operator HKEY() { return m_hKey; }&lt;br /&gt;&lt;br /&gt;    BOOL IsOK(void) { return m_hKey!=NULL; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    BOOL EnumKey(LPTSTR psz, DWORD dwLen) {&lt;br /&gt;        if(!m_hKey) return FALSE;&lt;br /&gt;        return ERROR_SUCCESS==RegEnumKeyEx(m_hKey, m_Index++, psz, &amp;dwLen, NULL, NULL, NULL, NULL);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    BOOL EnumValue(LPTSTR pszName, DWORD dwLenName, LPTSTR pszValue, DWORD dwLenValue) {&lt;br /&gt;        DWORD dwType;&lt;br /&gt;        if(!m_hKey) return FALSE;&lt;br /&gt;        dwLenValue *= sizeof(TCHAR); // convert length in chars to bytes&lt;br /&gt;        return ERROR_SUCCESS==RegEnumValue(m_hKey, m_Index++, pszName, &amp;dwLenName, NULL, &amp;dwType, (LPBYTE)pszValue, &amp;dwLenValue);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    BOOL ValueSZ(LPCTSTR szName, LPTSTR szValue, DWORD dwLen) &lt;br /&gt;    {&lt;br /&gt;        if(!m_hKey) return FALSE;&lt;br /&gt;        dwLen *= sizeof(TCHAR); // convert length in chars to bytes&lt;br /&gt;        return ERROR_SUCCESS==RegQueryValueEx(m_hKey, szName, NULL, NULL, (LPBYTE)szValue, &amp;dwLen);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    DWORD ValueBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen) {&lt;br /&gt;        if(!m_hKey) return FALSE;&lt;br /&gt;        DWORD dwLenWant = dwLen;&lt;br /&gt;        if(ERROR_SUCCESS==RegQueryValueEx(m_hKey, szName, NULL, NULL, lpbValue, &amp;dwLen))&lt;br /&gt;            return dwLen;&lt;br /&gt;        else&lt;br /&gt;            return 0;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    LPCTSTR ValueSZ(LPCTSTR szName)&lt;br /&gt;    {&lt;br /&gt;        if(!m_hKey) return TEXT("");&lt;br /&gt;        DWORD dwLen = 0;&lt;br /&gt;        if( (ERROR_SUCCESS != RegQueryValueEx(m_hKey, szName, NULL, NULL, NULL, &amp;dwLen)) || &lt;br /&gt;            (dwLen == 0) )&lt;br /&gt;                return TEXT("");&lt;br /&gt;        MyFree(m_lpbValue);&lt;br /&gt;        if( !(m_lpbValue = MyRgAlloc(dwLen)) ||&lt;br /&gt;            (ERROR_SUCCESS != RegQueryValueEx(m_hKey, szName, NULL, NULL, m_lpbValue, &amp;dwLen)) )&lt;br /&gt;                return TEXT("");&lt;br /&gt;        return (LPTSTR)m_lpbValue;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    LPBYTE ValueBinary(LPCTSTR szName) {&lt;br /&gt;        return (LPBYTE)ValueSZ(szName);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    DWORD ValueDW(LPCTSTR szName, DWORD dwDefault=0) {&lt;br /&gt;        if(!m_hKey) return FALSE;&lt;br /&gt;        DWORD dwValue = dwDefault;&lt;br /&gt;        DWORD dwLen = sizeof(DWORD);&lt;br /&gt;        RegQueryValueEx(m_hKey, szName, NULL, NULL, (LPBYTE)&amp;dwValue, &amp;dwLen);&lt;br /&gt;        return dwValue;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    LONG  ValueDW2(LPCTSTR szName, DWORD &amp;dwDefault) {&lt;br /&gt;        if(!m_hKey) return FALSE;&lt;br /&gt;        DWORD dwValue = dwDefault;&lt;br /&gt;        DWORD dwLen = sizeof(DWORD);&lt;br /&gt;        return RegQueryValueEx(m_hKey, szName, NULL, NULL, (LPBYTE)&amp;dwValue, &amp;dwLen);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    BOOL SetSZ(LPCTSTR szName, LPCTSTR szValue, DWORD dwLen) {&lt;br /&gt;        if(!m_hKey) return FALSE;&lt;br /&gt;        return ERROR_SUCCESS==RegSetValueEx(m_hKey, szName, 0, REG_SZ, (LPBYTE)szValue, sizeof(TCHAR)*dwLen);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    BOOL SetSZ(LPCTSTR szName, LPCTSTR szValue) {&lt;br /&gt;        return SetSZ(szName, szValue, 1+lstrlen(szValue));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    BOOL SetDW(LPCTSTR szName, DWORD dwValue) {&lt;br /&gt;        if(!m_hKey) return FALSE;&lt;br /&gt;        return ERROR_SUCCESS==RegSetValueEx(m_hKey, szName, 0, REG_DWORD, (LPBYTE)&amp;dwValue, sizeof(DWORD));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    BOOL SetBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen) {&lt;br /&gt;        if(!m_hKey) return FALSE;&lt;br /&gt;        return ERROR_SUCCESS==RegSetValueEx(m_hKey, szName, 0, REG_BINARY, lpbValue, dwLen);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    BOOL SetMultiSZ(LPCTSTR szName, LPCTSTR lpszValue, DWORD dwLen) {&lt;br /&gt;        return ERROR_SUCCESS==RegSetValueEx(m_hKey, szName, 0, REG_MULTI_SZ, (LPBYTE)lpszValue, sizeof(TCHAR)*dwLen);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    BOOL DeleteValue(LPCTSTR szName) {&lt;br /&gt;        if(!m_hKey) return FALSE;&lt;br /&gt;        return ERROR_SUCCESS==RegDeleteValue(m_hKey, szName);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    BOOL DeleteKey(LPCTSTR szName) {&lt;br /&gt;        if(!m_hKey) return FALSE;&lt;br /&gt;        return ERROR_SUCCESS==RegDeleteKey(m_hKey, szName);&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CReg.cpp&lt;br /&gt;&lt;br /&gt;CReg::CReg()&lt;br /&gt;{&lt;br /&gt;        m_hKey = NULL;&lt;br /&gt;        m_Index = 0;&lt;br /&gt;        m_lpbValue = NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CReg::~CReg()&lt;br /&gt;{&lt;br /&gt;    if(m_hKey) &lt;br /&gt;        RegCloseKey(m_hKey); &lt;br /&gt;    MyFree(m_lpbValue);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-396941387784617621?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/396941387784617621/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/creg-encapsulation-of-windows-registry.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/396941387784617621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/396941387784617621'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/creg-encapsulation-of-windows-registry.html' title='CReg -  An encapsulation of the Windows registry key.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-6660325523562077980</id><published>2010-01-08T16:00:00.000-08:00</published><updated>2010-01-08T16:00:02.543-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>CuRecord - Access Record</title><content type='html'>&lt;pre class="brush: php;"&gt;// Access Record&lt;br /&gt;&lt;br /&gt;$record = new CuRecord($ado, $table_name, $key);&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;$record-&gt;SetField("field_name", $field_value );&lt;br /&gt;$record-&gt;Save();&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;$record-&gt;Load("field_name", $field_value);&lt;br /&gt;$value = $record-&gt;GetField("field_name");&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;$record-&gt;Load("field_name", $field_value);&lt;br /&gt;$record-&gt;Destroy();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuRecord.php&lt;br /&gt;&lt;br /&gt;class CuRecord  {&lt;br /&gt;&lt;br /&gt;    var $ado;&lt;br /&gt;    var $table_name; &lt;br /&gt;    &lt;br /&gt;    var $key_name; &lt;br /&gt;    var $key_value; &lt;br /&gt;    &lt;br /&gt;    var $database_fields;&lt;br /&gt;    var $modified_fields;&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    function CuRecord($ado, $table_name, $key_name = "sn" , $key_value = "") {&lt;br /&gt;        &lt;br /&gt;        $this-&amp;gt;ado = &amp;$ado;&lt;br /&gt;        $this-&amp;gt;table_name = $table_name;&lt;br /&gt;        $this-&amp;gt;key_name = $key_name;&lt;br /&gt;        $this-&amp;gt;key_value = $this-&amp;gt;_check_input($key_value);&lt;br /&gt;        &lt;br /&gt;        $this-&amp;gt;database_fields = array();&lt;br /&gt;        $this-&amp;gt;modified_fields = array();        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    function SetField( $field, $value) {&lt;br /&gt;&lt;br /&gt;        if( is_numeric($field) ) &lt;br /&gt;            return;&lt;br /&gt;        &lt;br /&gt;        $this-&amp;gt;database_fields[$field] = $value;&lt;br /&gt;        $this-&amp;gt;modified_fields[$field] = true;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    function GetField($field) {&lt;br /&gt;        return $this-&amp;gt;database_fields[$field]; &lt;br /&gt;    }   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    function Destroy() {&lt;br /&gt;        &lt;br /&gt;        if( !$this-&amp;gt;key_value )&lt;br /&gt;            return;&lt;br /&gt;        return $this-&amp;gt;ado-&amp;gt;sql("DELETE FROM $this-&amp;gt;table_name WHERE $this-&amp;gt;key_name = '$this-&amp;gt;key_value'");&lt;br /&gt;        &lt;br /&gt;    }   &lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    function Save()&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        if( $this-&amp;gt;key_value )&lt;br /&gt;        {&lt;br /&gt;            $result = $this-&amp;gt;_update();&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            $result = $this-&amp;gt;_insert();&lt;br /&gt;            $this-&amp;gt;_load_key_value();&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        return $this-&amp;gt;key_value;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    function Load($bargain_field, $bargain_value)&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        if(!($bargain_field &amp;&amp; $bargain_value ))&lt;br /&gt;        {&lt;br /&gt;            $bargain_field = $this-&amp;gt;key_name;&lt;br /&gt;            $bargain_value = $this-&amp;gt;key_value;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        if( !($bargain_field &amp;&amp; $bargain_value ) )&lt;br /&gt;            return;&lt;br /&gt;        &lt;br /&gt;        $value = $this-&amp;gt;_check_input($bargain_value);&lt;br /&gt;        $stmt = "`$bargain_field` = '$value'";&lt;br /&gt;        $stmt = "SELECT * FROM $this-&amp;gt;table_name WHERE $stmt";&lt;br /&gt;         &lt;br /&gt;        $result = $this-&amp;gt;ado-&amp;gt;sql($stmt);&lt;br /&gt;        if( $result == "" )&lt;br /&gt;            return ;&lt;br /&gt;        &lt;br /&gt;        $result_table = $this-&amp;gt;ado-&amp;gt;fetch_array();&lt;br /&gt;        $this-&amp;gt;database_fields = $result_table[0];&lt;br /&gt;        &lt;br /&gt;        if( sizeof($this-&amp;gt;modified_fields) &amp;gt; 0 ) {&lt;br /&gt;            foreach( $this-&amp;gt;modified_fields as $key =&amp;gt; $value ) {&lt;br /&gt;                $this-&amp;gt;modified_fields[$key] = false;&lt;br /&gt;            }&lt;br /&gt;        }       &lt;br /&gt;        &lt;br /&gt;        $this-&amp;gt;key_value = $result_table[0][$this-&amp;gt;key_name];&lt;br /&gt;        &lt;br /&gt;        return $this-&amp;gt;key_value;&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    function _load_key_value()&lt;br /&gt;    {&lt;br /&gt;        $stmt = "SELECT MAX($this-&amp;gt;key_name) AS $this-&amp;gt;key_name FROM `$this-&amp;gt;table_name` WHERE ";&lt;br /&gt;        foreach( $this-&amp;gt;database_fields as $key =&amp;gt; $value ){&lt;br /&gt;            if( !is_numeric($key) &amp;&amp; $value ){&lt;br /&gt;                if( $this-&amp;gt;modified_fields[$key] == true ){&lt;br /&gt;                    $value = $this-&amp;gt;_check_input($value); &lt;br /&gt;                    $stmt .= "`$key` = '$value' AND ";&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        } &lt;br /&gt;        &lt;br /&gt;        $stmt = substr($stmt,0,strlen($stmt)-5);    &lt;br /&gt;        $handle = $this-&amp;gt;ado-&amp;gt;sql($stmt);&lt;br /&gt;        &lt;br /&gt;        $result_table = $this-&amp;gt;ado-&amp;gt;fetch_array();&lt;br /&gt;        $this-&amp;gt;key_value = $result_table[0][$this-&amp;gt;key_name];&lt;br /&gt;        &lt;br /&gt;        return $result_rows;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    function _insert() {&lt;br /&gt;&lt;br /&gt;        $stmt = "INSERT INTO `$this-&amp;gt;table_name` ";&lt;br /&gt;        &lt;br /&gt;        foreach ($this-&amp;gt;database_fields as $key =&amp;gt; $value) {&lt;br /&gt;            if( !is_numeric( $key )&amp;&amp; $value){&lt;br /&gt;                $key = $this-&amp;gt;_check_input($key);&lt;br /&gt;                $key_stmt .= " `$key`,";&lt;br /&gt;                &lt;br /&gt;                $value = $this-&amp;gt;_check_input($value);&lt;br /&gt;                $value_stmt .= " '$value',";&lt;br /&gt;                &lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        $key_stmt = substr($key_stmt,0,strlen($key_stmt)-1); &lt;br /&gt;        $value_stmt = substr($value_stmt,0,strlen($value_stmt)-1); &lt;br /&gt;        &lt;br /&gt;        $stmt .= " (" . $key_stmt . ") VALUES (" . $value_stmt . ")" ;&lt;br /&gt;        $handle = $this-&amp;gt;ado-&amp;gt;sql($stmt, "_insert");&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        return $handle . " " . $stmt;&lt;br /&gt;        &lt;br /&gt;    }    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    function _update() {&lt;br /&gt;        &lt;br /&gt;        $field_value = $this-&amp;gt;key_value;&lt;br /&gt;        $field_name = $this-&amp;gt;key_name;&lt;br /&gt;        $table_name = $this-&amp;gt;table_name;&lt;br /&gt;        &lt;br /&gt;        $stmt = "UPDATE `$table_name` SET ";&lt;br /&gt;        foreach ($this-&amp;gt;database_fields as $key =&amp;gt; $value) {&lt;br /&gt;            if( !is_numeric( $key ) ){&lt;br /&gt;                if( $this-&amp;gt;modified_fields[$key] == true ) {&lt;br /&gt;                    $value = $this-&amp;gt;_check_input($value);&lt;br /&gt;                    if( $value == "" ){&lt;br /&gt;                        $stmt .= "`$key` = 'NULL', ";&lt;br /&gt;                    }&lt;br /&gt;                    else {&lt;br /&gt;                        $stmt .= "`$key` = '$value', ";&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        $stmt = substr($stmt, 0, strlen($stmt) - 2);&lt;br /&gt;        $stmt .= " WHERE `$field_name` = '$field_value'"; &lt;br /&gt;        &lt;br /&gt;        $handle = $this-&amp;gt;ado-&amp;gt;sql($stmt);&lt;br /&gt;        return $handle . " " . $stmt;&lt;br /&gt;        &lt;br /&gt;    } &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    function _check_input($value)&lt;br /&gt;    {&lt;br /&gt;        if($value == "")&lt;br /&gt;            return "";&lt;br /&gt;&lt;br /&gt;        if (get_magic_quotes_gpc())&lt;br /&gt;        {&lt;br /&gt;            $value = stripslashes($value);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        if (!is_numeric($value))&lt;br /&gt;        {&lt;br /&gt;            $value =  mysql_real_escape_string($value);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        return $value;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-6660325523562077980?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/6660325523562077980/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/curecord-access-record.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6660325523562077980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6660325523562077980'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/curecord-access-record.html' title='CuRecord - Access Record'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-3073492654530140637</id><published>2010-01-07T16:00:00.000-08:00</published><updated>2010-01-07T16:00:03.132-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SampleCode'/><title type='text'>CuSize - Similar to the Windows SIZE structure</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Similar to the Windows SIZE structure&lt;br /&gt;&lt;br /&gt;// CuSize.h&lt;br /&gt;&lt;br /&gt;class CuSize : public tagSIZE&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;// Constructors&lt;br /&gt;    // construct an uninitialized size&lt;br /&gt;    CuSize() throw();&lt;br /&gt;    // create from two integers&lt;br /&gt;    CuSize(int initCX, int initCY) throw();&lt;br /&gt;    // create from another size&lt;br /&gt;    CuSize(SIZE initSize) throw();&lt;br /&gt;    // create from a point&lt;br /&gt;    CuSize(POINT initPt) throw();&lt;br /&gt;    // create from a DWORD: cx = LOWORD(dw) cy = HIWORD(dw)&lt;br /&gt;    CuSize(DWORD dwSize) throw();&lt;br /&gt;&lt;br /&gt;// Operations&lt;br /&gt;    BOOL operator==(SIZE size) const throw();&lt;br /&gt;    BOOL operator!=(SIZE size) const throw();&lt;br /&gt;    void operator+=(SIZE size) throw();&lt;br /&gt;    void operator-=(SIZE size) throw();&lt;br /&gt;    void SetSize(int CX, int CY) throw();&lt;br /&gt;&lt;br /&gt;// Operators returning CuSize values&lt;br /&gt;    CuSize operator+(SIZE size) const throw();&lt;br /&gt;    CuSize operator-(SIZE size) const throw();&lt;br /&gt;    CuSize operator-() const throw();&lt;br /&gt;&lt;br /&gt;// Operators returning CuPoint values&lt;br /&gt;    CuPoint operator+(POINT point) const throw();&lt;br /&gt;    CuPoint operator-(POINT point) const throw();&lt;br /&gt;&lt;br /&gt;// Operators returning CuRect values&lt;br /&gt;    CuRect operator+(const RECT* lpRect) const throw();&lt;br /&gt;    CuRect operator-(const RECT* lpRect) const throw();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;inline CuSize::CuSize()&lt;br /&gt;    { /* random filled */ }&lt;br /&gt;inline CuSize::CuSize(int initCX, int initCY)&lt;br /&gt;    { cx = initCX; cy = initCY; }&lt;br /&gt;inline CuSize::CuSize(SIZE initSize)&lt;br /&gt;    { *(SIZE*)this = initSize; }&lt;br /&gt;inline CuSize::CuSize(POINT initPt)&lt;br /&gt;    { *(POINT*)this = initPt; }&lt;br /&gt;inline CuSize::CuSize(DWORD dwSize)&lt;br /&gt;    {&lt;br /&gt;        cx = (short)LOWORD(dwSize);&lt;br /&gt;        cy = (short)HIWORD(dwSize);&lt;br /&gt;    }&lt;br /&gt;inline BOOL CuSize::operator==(SIZE size) const&lt;br /&gt;    { return (cx == size.cx &amp;&amp; cy == size.cy); }&lt;br /&gt;inline BOOL CuSize::operator!=(SIZE size) const&lt;br /&gt;    { return (cx != size.cx || cy != size.cy); }&lt;br /&gt;inline void CuSize::operator+=(SIZE size)&lt;br /&gt;    { cx += size.cx; cy += size.cy; }&lt;br /&gt;inline void CuSize::operator-=(SIZE size)&lt;br /&gt;    { cx -= size.cx; cy -= size.cy; }&lt;br /&gt;inline void CuSize::SetSize(int CX, int CY)&lt;br /&gt;    { cx = CX; cy = CY; }   &lt;br /&gt;inline CuSize CuSize::operator+(SIZE size) const&lt;br /&gt;    { return CuSize(cx + size.cx, cy + size.cy); }&lt;br /&gt;inline CuSize CuSize::operator-(SIZE size) const&lt;br /&gt;    { return CuSize(cx - size.cx, cy - size.cy); }&lt;br /&gt;inline CuSize CuSize::operator-() const&lt;br /&gt;    { return CuSize(-cx, -cy); }&lt;br /&gt;inline CuPoint CuSize::operator+(POINT point) const&lt;br /&gt;    { return CuPoint(cx + point.x, cy + point.y); }&lt;br /&gt;inline CuPoint CuSize::operator-(POINT point) const&lt;br /&gt;    { return CuPoint(cx - point.x, cy - point.y); }&lt;br /&gt;inline CuRect CuSize::operator+(const RECT* lpRect) const&lt;br /&gt;    { return CuRect(lpRect) + *this; }&lt;br /&gt;inline CuRect CuSize::operator-(const RECT* lpRect) const&lt;br /&gt;    { return CuRect(lpRect) - *this; }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-3073492654530140637?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/3073492654530140637/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cusize-similar-to-windows-size.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3073492654530140637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3073492654530140637'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cusize-similar-to-windows-size.html' title='CuSize - Similar to the Windows SIZE structure'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-8919111286346772615</id><published>2010-01-06T15:52:00.000-08:00</published><updated>2010-01-06T15:52:15.343-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>CuADO - connection to a MySQL Server</title><content type='html'>&lt;pre class="brush: php;"&gt;// connection to a MySQL Server&lt;br /&gt;&lt;br /&gt;$this-&amp;gt;ado = new CuADO;&lt;br /&gt;$ado-&amp;gt;Connect($host, $username, $password);&lt;br /&gt;$ado-&amp;gt;SelectDB($db); &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuADO.php&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuADO  {&lt;br /&gt;    &lt;br /&gt;    var $link;&lt;br /&gt;    var $query_handle;&lt;br /&gt;    &lt;br /&gt;    function CuADO() {&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function Connect($host, $username, $password)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;link = mysql_connect($host, $username, $password);&lt;br /&gt;        return $this-&amp;gt;link;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    function SelectDB($db)&lt;br /&gt;    {&lt;br /&gt;        return mysql_select_db($db, $this-&amp;gt;link);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function sql($stmt, $debug_key = "")&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;query_handle = mysql_query($stmt, $this-&amp;gt;link) ;&lt;br /&gt;        return $this-&amp;gt;query_handle;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function fetch_array() {&lt;br /&gt;        &lt;br /&gt;        $query_handle = &amp;$this-&amp;gt;query_handle;&lt;br /&gt;        $i = 0;&lt;br /&gt;        while($result_rows[$i] = mysql_fetch_array( $query_handle ) ){&lt;br /&gt;            $i++;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        return $result_rows;&lt;br /&gt;        &lt;br /&gt;    }   &lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-8919111286346772615?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/8919111286346772615/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cuado-connection-to-mysql-server.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/8919111286346772615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/8919111286346772615'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cuado-connection-to-mysql-server.html' title='CuADO - connection to a MySQL Server'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2281420184760120165</id><published>2010-01-05T15:26:00.000-08:00</published><updated>2010-01-06T15:51:02.573-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>TuComposite - Template of Composite pattern</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// allows a group of objects to be treated in the same way as a single instance of an object.&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;TuComposite&amp;lt;CuMyObject&amp;gt; myComposite;&lt;br /&gt;CuMyObject *pMyObject = &amp;myComposite;&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;class CuMyCompositeObject : public TuComposite&amp;lt;CuMyObject&amp;gt; &lt;br /&gt;{&lt;br /&gt;    ...&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// TuComposite.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;class TuComposite : public T&lt;br /&gt;{&lt;br /&gt;protected:&lt;br /&gt;    vector&amp;lt;T*&amp;gt; _itsElement;&lt;br /&gt;    typename vector&amp;lt;T*&amp;gt;::iterator _itor; &lt;br /&gt;    &lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;    TuComposite(){};&lt;br /&gt;    virtual ~TuComposite(){};&lt;br /&gt;&lt;br /&gt;    void push_back(T *pElement){ _itsElement.push_back(pElement); }&lt;br /&gt;    void insert(int n, T *pElement){ _itsElement.insert(_itsElement.begin() + n, pElement); }&lt;br /&gt;&lt;br /&gt;    T* at(const int nIndex){ return _itsElement[nIndex]; }&lt;br /&gt;    void reserve( int _Count ){_itsElement.reserve(_Count); }&lt;br /&gt;&lt;br /&gt;    int size(){ return _itsElement.size(); }&lt;br /&gt;    &lt;br /&gt;    void remove(T *pElement);&lt;br /&gt;    void clear();&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;void TuComposite&amp;lt;T&amp;gt;::clear()&lt;br /&gt;{&lt;br /&gt;    &lt;br /&gt;    _itor = _itsElement.begin();&lt;br /&gt;    &lt;br /&gt;    while(  _itor != _itsElement.end() )&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        T* pElement = *_itor;&lt;br /&gt;        delete pElement;&lt;br /&gt;        _itor++;&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    _itsElement.clear();&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;void TuComposite&amp;lt;T&amp;gt;::remove(T *pElement)&lt;br /&gt;{&lt;br /&gt;    &lt;br /&gt;    _itor = _itsElement.begin();&lt;br /&gt;    &lt;br /&gt;    while(  _itor != _itsElement.end() )&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        if( pElement == *_itor )&lt;br /&gt;        {&lt;br /&gt;            _itsElement.erase(_itor);&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;        _itor++;&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2281420184760120165?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2281420184760120165/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tucomposite-template-of-composite.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2281420184760120165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2281420184760120165'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tucomposite-template-of-composite.html' title='TuComposite - Template of Composite pattern'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-5042303004593055782</id><published>2010-01-05T02:09:00.000-08:00</published><updated>2010-01-08T00:42:15.642-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>TuList - General purpose container of a list of objects</title><content type='html'>&lt;pre class="brush: delphi;"&gt;// General purpose container of a list of objects&lt;br /&gt;&lt;br /&gt;ObjList : TuList;&lt;br /&gt;ObjList := TuList.Create();&lt;br /&gt;ObjList.Add(MyObject);&lt;br /&gt;&lt;br /&gt;MyObject := ObjList.GetItems(i);&lt;br /&gt;ObjList.Free;&lt;br /&gt;&lt;br /&gt;// u_TList.pas&lt;br /&gt;&lt;br /&gt;unit u_TList;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;uses&lt;br /&gt;      Windows, Classes, SysUtils,&lt;br /&gt;      StdCtrls,&lt;br /&gt;      ch_LogMessages;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;      TuList = class&lt;br /&gt;        private&lt;br /&gt;          m_List : TList;&lt;br /&gt;        public&lt;br /&gt;          constructor Create();&lt;br /&gt;          destructor Destroy();  override;&lt;br /&gt;          procedure Clear();&lt;br /&gt;          function Count: Integer;&lt;br /&gt;          function Add( Item:Pointer ):Integer;&lt;br /&gt;          function GetItems(Index: Integer): Pointer;&lt;br /&gt;          procedure Sort(Compare: TListSortCompare);&lt;br /&gt;          procedure Delete(Index: Integer);&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{ TuList }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function TuList.Add(Item: Pointer): Integer;&lt;br /&gt;begin&lt;br /&gt;        Result := m_List.Add(Item);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TuList.Clear;&lt;br /&gt;begin&lt;br /&gt;        m_List.Clear;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TuList.Count: Integer;&lt;br /&gt;begin&lt;br /&gt;        Result := m_List.Count;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TuList.Create;&lt;br /&gt;begin&lt;br /&gt;        m_List := TList.Create;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TuList.Delete(Index: Integer);&lt;br /&gt;begin&lt;br /&gt;        m_List.Delete(Index);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TuList.Destroy;&lt;br /&gt;begin&lt;br /&gt;        m_List.Free;&lt;br /&gt;        inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TuList.GetItems(Index: Integer): Pointer;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;        if (Index &amp;lt; 0) or (Index &amp;gt;= m_List.Count ) then begin&lt;br /&gt;            Index := 0;&lt;br /&gt;        end;&lt;br /&gt;&lt;br /&gt;        Result := m_List.Items[Index];&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TuList.Sort(Compare: TListSortCompare);&lt;br /&gt;begin&lt;br /&gt;        m_List.Sort(Compare);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-5042303004593055782?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/5042303004593055782/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tulist-general-purpose-container-of.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5042303004593055782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5042303004593055782'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/tulist-general-purpose-container-of.html' title='TuList - General purpose container of a list of objects'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-64000719609018149</id><published>2010-01-04T15:52:00.000-08:00</published><updated>2010-01-04T22:11:49.134-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuKeyStatus -  a struct of the keyboard status.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// a struct of the keyboard status. &lt;br /&gt;// override operator == &lt;br /&gt;CuKeyStatus ksFromLLKeyHook;&lt;br /&gt;CuKeyStatus ksClientDefault;&lt;br /&gt;&lt;br /&gt;Assert( ksFromLLKeyHook == ksClientDefault );&lt;br /&gt;&lt;br /&gt;// CuKeyStatus.h&lt;br /&gt;class CuKeyStatus&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    BOOL m_bAlt;&lt;br /&gt;    BOOL m_bCtrl;&lt;br /&gt;    BOOL m_bShift;&lt;br /&gt;    DWORD m_dwScanCode;&lt;br /&gt;    DWORD m_dwVirtualKey;&lt;br /&gt;&lt;br /&gt;    CuKeyStatus()&lt;br /&gt;        :m_bAlt(FALSE)&lt;br /&gt;        ,m_bCtrl(FALSE)&lt;br /&gt;        ,m_bShift(FALSE)&lt;br /&gt;        ,m_dwScanCode(0)&lt;br /&gt;        ,m_dwVirtualKey(0)&lt;br /&gt;    {};&lt;br /&gt;    ~CuKeyStatus(void){};&lt;br /&gt;&lt;br /&gt;    BOOL operator == (CuKeyStatus &amp;KeyStatus);&lt;br /&gt;    &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;inline BOOL CuKeyStatus::operator == (CuKeyStatus &amp;KeyStatus)&lt;br /&gt;{&lt;br /&gt;    return m_bAlt == KeyStatus.m_bAlt &amp;&amp;&lt;br /&gt;        m_bCtrl == KeyStatus.m_bCtrl &amp;&amp;&lt;br /&gt;        m_bShift == KeyStatus.m_bShift &amp;&amp;&lt;br /&gt;        m_dwScanCode == KeyStatus.m_dwScanCode &amp;&amp;&lt;br /&gt;        m_dwVirtualKey == KeyStatus.m_dwVirtualKey ;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-64000719609018149?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/64000719609018149/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cukeystatus-struct-of-keyboard-status.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/64000719609018149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/64000719609018149'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cukeystatus-struct-of-keyboard-status.html' title='CuKeyStatus -  a struct of the keyboard status.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-6689757155126858973</id><published>2010-01-03T16:14:00.000-08:00</published><updated>2010-01-03T16:14:44.563-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuMenu - An encapsulation of the Windows HMENU.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// An encapsulation of the Windows HMENU. &lt;br /&gt;&lt;br /&gt;CuMenu MenuTray.LoadMenu(IDR_MENU_MYMENU);&lt;br /&gt;CuMenu *pTrackMenu = MenuTray.GetSubMenu(0);&lt;br /&gt;pTrackMenu-&gt;TrackPopupMenu(TPM_BOTTOMALIGN, pt.x, pt.y, this-&gt;GetSafeHwnd() );  &lt;br /&gt;MenuTray.DestroyMenu();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuMenu.h&lt;br /&gt;&lt;br /&gt;class CuMenu&lt;br /&gt;{&lt;br /&gt;    HMENU m_hMenu;&lt;br /&gt;public:&lt;br /&gt;    CuMenu(void);&lt;br /&gt;    ~CuMenu(void);&lt;br /&gt;&lt;br /&gt;    BOOL DestroyMenu();&lt;br /&gt;    BOOL LoadMenu( UINT nIDResource );&lt;br /&gt;    CuMenu* GetSubMenu( int nPos ) const;&lt;br /&gt;&lt;br /&gt;    BOOL Attach( HMENU hMenu );&lt;br /&gt;    BOOL TrackPopupMenu(&lt;br /&gt;        UINT nFlags,&lt;br /&gt;        int x,&lt;br /&gt;        int y,&lt;br /&gt;        HWND hWnd,&lt;br /&gt;        LPCRECT lpRect = 0&lt;br /&gt;        );&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuMenu.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuMenu::CuMenu(void)&lt;br /&gt;:m_hMenu(NULL)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuMenu::~CuMenu(void)&lt;br /&gt;{&lt;br /&gt;    DestroyMenu();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuMenu::LoadMenu( UINT nIDResource )&lt;br /&gt;{&lt;br /&gt;    m_hMenu = ::LoadMenu(::GetModuleHandle(NULL), MAKEINTRESOURCE(nIDResource));&lt;br /&gt;    return ( m_hMenu != NULL );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuMenu* CuMenu::GetSubMenu( int nPos ) const&lt;br /&gt;{&lt;br /&gt;    HMENU hMenu = ::GetSubMenu( m_hMenu, nPos );&lt;br /&gt;&lt;br /&gt;    static CuMenu SubMenu;&lt;br /&gt;    SubMenu.Attach(hMenu);&lt;br /&gt;    return &amp;SubMenu;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuMenu::Attach( HMENU hMenu )&lt;br /&gt;{&lt;br /&gt;    m_hMenu = hMenu;&lt;br /&gt;    return ( m_hMenu != NULL );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuMenu::TrackPopupMenu(&lt;br /&gt;                    UINT nFlags,&lt;br /&gt;                    int x,&lt;br /&gt;                    int y,&lt;br /&gt;                    HWND hWnd,&lt;br /&gt;                    LPCRECT lpRect /*= 0*/&lt;br /&gt;                    )&lt;br /&gt;{&lt;br /&gt;    return ::TrackPopupMenu(m_hMenu, nFlags, x, y, 0, hWnd, lpRect);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuMenu::DestroyMenu()&lt;br /&gt;{&lt;br /&gt;    return ::DestroyMenu(m_hMenu);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-6689757155126858973?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/6689757155126858973/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cumenu-encapsulation-of-windows-hmenu.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6689757155126858973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/6689757155126858973'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cumenu-encapsulation-of-windows-hmenu.html' title='CuMenu - An encapsulation of the Windows HMENU.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-4344525332520829545</id><published>2010-01-02T18:14:00.000-08:00</published><updated>2010-01-24T02:36:39.967-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuKeyboard - Conversion LowLevelKeyHook to CuKeyStatus</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Conversion LowLevelKeyHook to CuKeyStatus&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    static CuKeyboard Keyboard;&lt;br /&gt;    Keyboard.FromLowLevelKeyHook(wParam, lParam);&lt;br /&gt;    &lt;br /&gt;    CuKeyNameTextEx KeyNameTextEx(Keyboard.GetKeyStatus());&lt;br /&gt;    &lt;br /&gt;    wstring strKeyboard = KeyNameTextEx;&lt;br /&gt; &lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuHook hook;&lt;br /&gt;hook.Init(HookProc, WH_KEYBOARD_LL);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuKeyboard.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuKeyboard&lt;br /&gt;{&lt;br /&gt;    CuKeyStatus m_KeyStatus;&lt;br /&gt;    BOOL m_bScanCode[256];&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuKeyboard(void);&lt;br /&gt;    ~CuKeyboard(void);&lt;br /&gt;&lt;br /&gt;    void FromLowLevelKeyHook(WPARAM wParam, LPARAM lParam);&lt;br /&gt;    CuKeyStatus GetKeyStatus(){ return m_KeyStatus; }&lt;br /&gt;private:&lt;br /&gt;    bool IsFunctionKey(DWORD dwScanCode);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuKeyboard.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuKeyboard::CuKeyboard(void)&lt;br /&gt;{&lt;br /&gt;    memset((void*)m_bScanCode, 0, sizeof(m_bScanCode)  );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuKeyboard::~CuKeyboard(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuKeyboard::FromLowLevelKeyHook(WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    KBDLLHOOKSTRUCT *pKB = (KBDLLHOOKSTRUCT *)lParam;&lt;br /&gt;&lt;br /&gt;    //&lt;br /&gt;    BOOL bKeyDown = ( (wParam == WM_KEYDOWN) || (wParam == WM_SYSKEYDOWN) );&lt;br /&gt;    m_bScanCode[pKB-&amp;gt;scanCode] = bKeyDown;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // &lt;br /&gt;    if( IsFunctionKey(pKB-&amp;gt;scanCode) )&lt;br /&gt;    {&lt;br /&gt;        m_KeyStatus.m_bAlt = m_bScanCode[56];&lt;br /&gt;        m_KeyStatus.m_bCtrl = m_bScanCode[29];&lt;br /&gt;        m_KeyStatus.m_bShift = (m_bScanCode[42] || m_bScanCode[54]);&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        if( !bKeyDown )&lt;br /&gt;            m_KeyStatus.m_dwScanCode = 0;&lt;br /&gt;        else&lt;br /&gt;            m_KeyStatus.m_dwScanCode = pKB-&amp;gt;scanCode; &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool CuKeyboard::IsFunctionKey(DWORD dwScanCode)&lt;br /&gt;{&lt;br /&gt;    return ((dwScanCode == 56) || (dwScanCode == 29) || (dwScanCode == 42) || (dwScanCode == 54));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-4344525332520829545?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/4344525332520829545/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cukeyboard-conversion-lowlevelkeyhook.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4344525332520829545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4344525332520829545'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cukeyboard-conversion-lowlevelkeyhook.html' title='CuKeyboard - Conversion LowLevelKeyHook to CuKeyStatus'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-5442472683999768811</id><published>2010-01-01T17:12:00.000-08:00</published><updated>2010-01-01T17:12:33.547-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SampleCode'/><title type='text'>CuPoint  - A 2-D point, similar to Windows POINT structure.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// CuPoint - A 2-D point, similar to Windows POINT structure.&lt;br /&gt;&lt;br /&gt;class CuPoint : public tagPOINT&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;// Constructors&lt;br /&gt;&lt;br /&gt;    // create an uninitialized point&lt;br /&gt;    CuPoint() throw();&lt;br /&gt;    // create from two integers&lt;br /&gt;    CuPoint(int initX, int initY) throw();&lt;br /&gt;    // create from another point&lt;br /&gt;    CuPoint(POINT initPt) throw();&lt;br /&gt;    // create from a size&lt;br /&gt;    CuPoint(SIZE initSize) throw();&lt;br /&gt;    // create from an LPARAM: x = LOWORD(dw) y = HIWORD(dw)&lt;br /&gt;    CuPoint(LPARAM dwPoint) throw();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Operations&lt;br /&gt;&lt;br /&gt;// translate the point&lt;br /&gt;    void Offset(int xOffset, int yOffset) throw();&lt;br /&gt;    void Offset(POINT point) throw();&lt;br /&gt;    void Offset(SIZE size) throw();&lt;br /&gt;    void SetPoint(int X, int Y) throw();&lt;br /&gt;&lt;br /&gt;    BOOL operator==(POINT point) const throw();&lt;br /&gt;    BOOL operator!=(POINT point) const throw();&lt;br /&gt;    void operator+=(SIZE size) throw();&lt;br /&gt;    void operator-=(SIZE size) throw();&lt;br /&gt;    void operator+=(POINT point) throw();&lt;br /&gt;    void operator-=(POINT point) throw();&lt;br /&gt;&lt;br /&gt;// Operators returning CuPoint values&lt;br /&gt;    CuPoint operator+(SIZE size) const throw();&lt;br /&gt;    CuPoint operator-(SIZE size) const throw();&lt;br /&gt;    CuPoint operator-() const throw();&lt;br /&gt;    CuPoint operator+(POINT point) const throw();&lt;br /&gt;&lt;br /&gt;// Operators returning CuSize values&lt;br /&gt;    CuSize operator-(POINT point) const throw();&lt;br /&gt;&lt;br /&gt;// Operators returning CuRect values&lt;br /&gt;    CuRect operator+(const RECT* lpRect) const throw();&lt;br /&gt;    CuRect operator-(const RECT* lpRect) const throw();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;inline CuPoint::CuPoint()&lt;br /&gt;    { /* random filled */ }&lt;br /&gt;inline CuPoint::CuPoint(int initX, int initY)&lt;br /&gt;    { x = initX; y = initY; }&lt;br /&gt;inline CuPoint::CuPoint(POINT initPt)&lt;br /&gt;    { *(POINT*)this = initPt; }&lt;br /&gt;inline CuPoint::CuPoint(SIZE initSize)&lt;br /&gt;    { *(SIZE*)this = initSize; }&lt;br /&gt;inline CuPoint::CuPoint(LPARAM dwPoint)&lt;br /&gt;    {&lt;br /&gt;        x = (short)LOWORD(dwPoint);&lt;br /&gt;        y = (short)HIWORD(dwPoint);&lt;br /&gt;    }&lt;br /&gt;inline void CuPoint::Offset(int xOffset, int yOffset)&lt;br /&gt;    { x += xOffset; y += yOffset; }&lt;br /&gt;inline void CuPoint::Offset(POINT point)&lt;br /&gt;    { x += point.x; y += point.y; }&lt;br /&gt;inline void CuPoint::Offset(SIZE size)&lt;br /&gt;    { x += size.cx; y += size.cy; }&lt;br /&gt;inline void CuPoint::SetPoint(int X, int Y)&lt;br /&gt;    { x = X; y = Y; }&lt;br /&gt;inline BOOL CuPoint::operator==(POINT point) const&lt;br /&gt;    { return (x == point.x &amp;&amp; y == point.y); }&lt;br /&gt;inline BOOL CuPoint::operator!=(POINT point) const&lt;br /&gt;    { return (x != point.x || y != point.y); }&lt;br /&gt;inline void CuPoint::operator+=(SIZE size)&lt;br /&gt;    { x += size.cx; y += size.cy; }&lt;br /&gt;inline void CuPoint::operator-=(SIZE size)&lt;br /&gt;    { x -= size.cx; y -= size.cy; }&lt;br /&gt;inline void CuPoint::operator+=(POINT point)&lt;br /&gt;    { x += point.x; y += point.y; }&lt;br /&gt;inline void CuPoint::operator-=(POINT point)&lt;br /&gt;    { x -= point.x; y -= point.y; }&lt;br /&gt;inline CuPoint CuPoint::operator+(SIZE size) const&lt;br /&gt;    { return CuPoint(x + size.cx, y + size.cy); }&lt;br /&gt;inline CuPoint CuPoint::operator-(SIZE size) const&lt;br /&gt;    { return CuPoint(x - size.cx, y - size.cy); }&lt;br /&gt;inline CuPoint CuPoint::operator-() const&lt;br /&gt;    { return CuPoint(-x, -y); }&lt;br /&gt;inline CuPoint CuPoint::operator+(POINT point) const&lt;br /&gt;    { return CuPoint(x + point.x, y + point.y); }&lt;br /&gt;inline CuSize CuPoint::operator-(POINT point) const&lt;br /&gt;    { return CuSize(x - point.x, y - point.y); }&lt;br /&gt;inline CuRect CuPoint::operator+(const RECT* lpRect) const&lt;br /&gt;    { return CuRect(lpRect) + *this; }&lt;br /&gt;inline CuRect CuPoint::operator-(const RECT* lpRect) const&lt;br /&gt;    { return CuRect(lpRect) - *this; }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-5442472683999768811?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/5442472683999768811/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cupoint-2-d-point-similar-to-windows.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5442472683999768811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5442472683999768811'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cupoint-2-d-point-similar-to-windows.html' title='CuPoint  - A 2-D point, similar to Windows POINT structure.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2839605323620063545</id><published>2010-01-01T00:11:00.000-08:00</published><updated>2010-01-04T03:30:12.591-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuKeyNameTextEx - retrieves a string that represents the name of a composite key</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// retrieves a string that represents the name of a composite key&lt;br /&gt;&lt;br /&gt;CuKeyStatus KeyStatus;&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;CuKeyNameTextEx KeyNameTextEx(KeyStatus);&lt;br /&gt;wstring strKeyText = KeyNameTextEx;&lt;br /&gt;// Assert( strKeyText == TEXT("Alt+Ctrl+Shift+D"));&lt;br /&gt;// Assert( strKeyText == TEXT("Alt+Ctrl+D"));&lt;br /&gt;// Assert( strKeyText == TEXT("Ctrl+Shift+D"));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuKeyNameTextEx.h&lt;br /&gt;&lt;br /&gt;class CuKeyNameTextEx&lt;br /&gt;{&lt;br /&gt;    wstring m_strKeyText;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuKeyNameTextEx(void);&lt;br /&gt;    CuKeyNameTextEx(CuKeyStatus &amp;KeyStatus);&lt;br /&gt;    ~CuKeyNameTextEx(void);&lt;br /&gt;&lt;br /&gt;    void SetKeyStatus(CuKeyStatus &amp;KeyStatus);&lt;br /&gt;    &lt;br /&gt;    operator wstring() const&lt;br /&gt;    {&lt;br /&gt;        return m_strKeyText;&lt;br /&gt;    };&lt;br /&gt;    BOOL IsMustAdd(bool l, bool r);&lt;br /&gt;private:&lt;br /&gt;    wstring ProcessFunctionKey(CuKeyStatus &amp;KeyStatus);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuKeyNameTextEx.cpp&lt;br /&gt;&lt;br /&gt;CuKeyNameTextEx::CuKeyNameTextEx(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuKeyNameTextEx::~CuKeyNameTextEx(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuKeyNameTextEx::CuKeyNameTextEx(CuKeyStatus &amp;KeyStatus)&lt;br /&gt;{&lt;br /&gt;    SetKeyStatus(KeyStatus);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuKeyNameTextEx::SetKeyStatus(CuKeyStatus &amp;KeyStatus)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if( !KeyStatus.m_dwScanCode )&lt;br /&gt;        return;&lt;br /&gt;&lt;br /&gt;    wstring strResult;&lt;br /&gt;&lt;br /&gt;    strResult = ProcessFunctionKey(KeyStatus);&lt;br /&gt;    &lt;br /&gt;    CuKeyNameText KeyName(KeyStatus.m_dwScanCode);&lt;br /&gt;    wstring strKeyText = KeyName;&lt;br /&gt;&lt;br /&gt;    wstring strAdd = TEXT("+");&lt;br /&gt;    if( !strKeyText.empty() &amp;&amp; !strResult.empty() )&lt;br /&gt;        strResult += strAdd;&lt;br /&gt;    &lt;br /&gt;    strResult += strKeyText;&lt;br /&gt;&lt;br /&gt;    m_strKeyText = strResult;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;wstring CuKeyNameTextEx::ProcessFunctionKey(CuKeyStatus &amp;KeyStatus)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    wstring strResult;&lt;br /&gt;&lt;br /&gt;    wstring strAlt = TEXT("Alt");&lt;br /&gt;    wstring strCtrl = TEXT("Ctrl");&lt;br /&gt;    wstring strShift = TEXT("Shift");&lt;br /&gt;    wstring strAdd = TEXT("+");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    if( KeyStatus.m_bAlt )&lt;br /&gt;        strResult += strAlt;&lt;br /&gt;&lt;br /&gt;    if( KeyStatus.m_bAlt &amp;&amp; KeyStatus.m_bCtrl )&lt;br /&gt;        strResult += strAdd;&lt;br /&gt;&lt;br /&gt;    if( KeyStatus.m_bCtrl )&lt;br /&gt;        strResult += strCtrl;&lt;br /&gt;&lt;br /&gt;    if( KeyStatus.m_bShift &amp;&amp; (KeyStatus.m_bAlt || KeyStatus.m_bCtrl) )&lt;br /&gt;        strResult += strAdd;&lt;br /&gt;&lt;br /&gt;    if( KeyStatus.m_bShift )&lt;br /&gt;        strResult += strShift;&lt;br /&gt;&lt;br /&gt;    return strResult;&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2839605323620063545?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2839605323620063545/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cukeynametextex-retrieves-string-that.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2839605323620063545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2839605323620063545'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2010/01/cukeynametextex-retrieves-string-that.html' title='CuKeyNameTextEx - retrieves a string that represents the name of a composite key'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-4063334671453960788</id><published>2009-12-30T16:41:00.000-08:00</published><updated>2010-01-03T17:13:15.087-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuSocket - create an endpoint for communication</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// create an endpoint for communication&lt;br /&gt;&lt;br /&gt;CuSocket ClientSocket;&lt;br /&gt;ClientSocket.Socket();&lt;br /&gt;ClientSocket.Connect(lpszHostAddress, nHostPort);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuSocket.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuSocket&lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt;    SOCKET m_hSocket;&lt;br /&gt;public:&lt;br /&gt;    CuSocket(void);&lt;br /&gt;public:&lt;br /&gt;    ~CuSocket(void);&lt;br /&gt;&lt;br /&gt;    SOCKET Socket(int nSocketType = SOCK_STREAM);&lt;br /&gt;    int Close(void);&lt;br /&gt;&lt;br /&gt;    //enum { SD_SEND = 0, SD_RECEIVE = 1,  SD_BOTH = 2};&lt;br /&gt;    int ShutDown(int nHow = SD_BOTH);&lt;br /&gt;&lt;br /&gt;    int Bind(UINT nSocketPort);&lt;br /&gt;    int Listen( int nConnectionBacklog = 5 );&lt;br /&gt;    SOCKET Accept( SOCKADDR *lpSockAddr, int *lpAddrLen );&lt;br /&gt;&lt;br /&gt;    int Connect( LPCSTR lpszHostAddress, UINT nHostPort);&lt;br /&gt;&lt;br /&gt;    int Receive(void *lpBuf, int nBufLen, int nFlags);&lt;br /&gt;    int Send(const void *lpBuf, int nBufLen, int nFlags);&lt;br /&gt;&lt;br /&gt;    BOOL Attach(SOCKET hSocket);&lt;br /&gt;    operator SOCKET() const;&lt;br /&gt;    CuSocket &amp;operator =(CuSocket &amp;socket);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuSocket.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuSocket::CuSocket(void)&lt;br /&gt;:m_hSocket(NULL)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuSocket::~CuSocket(void)&lt;br /&gt;{&lt;br /&gt;    if( m_hSocket != NULL )&lt;br /&gt;    {&lt;br /&gt;        Close();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;SOCKET CuSocket::Socket(int nSocketType /* = SOCK_STREAM */ )&lt;br /&gt;{&lt;br /&gt;    this-&amp;gt;Close();&lt;br /&gt;    m_hSocket = socket(AF_INET, nSocketType, IPPROTO_TCP);&lt;br /&gt;    return m_hSocket;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuSocket::Attach(SOCKET hSocket)&lt;br /&gt;{&lt;br /&gt;    this-&amp;gt;Close();&lt;br /&gt;    m_hSocket = hSocket;&lt;br /&gt;    return (m_hSocket != NULL);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuSocket::Close(void)&lt;br /&gt;{&lt;br /&gt;    int error = 0;&lt;br /&gt;    if( m_hSocket != NULL )&lt;br /&gt;    {&lt;br /&gt;        this-&amp;gt;ShutDown();&lt;br /&gt;        error = closesocket(m_hSocket);&lt;br /&gt;        m_hSocket = NULL;&lt;br /&gt;    }&lt;br /&gt;    return error;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuSocket::Bind(UINT nSocketPort)&lt;br /&gt;{&lt;br /&gt;    SOCKADDR_IN SockAddr;&lt;br /&gt;    SockAddr.sin_family = AF_INET;&lt;br /&gt;    SockAddr.sin_addr.s_addr = htonl(INADDR_ANY);&lt;br /&gt;    SockAddr.sin_port = htons(nSocketPort);&lt;br /&gt;&lt;br /&gt;    int error = bind( m_hSocket, (PSOCKADDR)&amp;SockAddr, sizeof(SockAddr) );&lt;br /&gt;    return error;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuSocket::ShutDown(int nHow /* = SD_BOTH */ )&lt;br /&gt;{&lt;br /&gt;    int error = shutdown( m_hSocket, nHow );&lt;br /&gt;    return error;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuSocket::Listen( int nConnectionBacklog /* = 5 */ )&lt;br /&gt;{&lt;br /&gt;    int error = listen(m_hSocket, nConnectionBacklog);&lt;br /&gt;    return error;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;SOCKET CuSocket::Accept( SOCKADDR *lpSockAddr, int *lpAddrLen )&lt;br /&gt;{&lt;br /&gt;    SOCKET hSocket = NULL;&lt;br /&gt;    hSocket = accept( m_hSocket, lpSockAddr, lpAddrLen );&lt;br /&gt;    return hSocket;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuSocket::Connect( LPCSTR lpszHostAddress, UINT nHostPort)&lt;br /&gt;{&lt;br /&gt;    SOCKADDR_IN ServerAddr;&lt;br /&gt;    ServerAddr.sin_family = AF_INET;&lt;br /&gt;    ServerAddr.sin_port = htons(nHostPort);&lt;br /&gt;    ServerAddr.sin_addr.s_addr = inet_addr( lpszHostAddress );&lt;br /&gt;&lt;br /&gt;    int error = connect(m_hSocket, (PSOCKADDR)&amp;ServerAddr, sizeof(ServerAddr));&lt;br /&gt;    return error;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuSocket::operator SOCKET() const&lt;br /&gt;{&lt;br /&gt;    return m_hSocket;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuSocket&amp; CuSocket::operator =(CuSocket &amp;socket)&lt;br /&gt;{&lt;br /&gt;    m_hSocket = socket.m_hSocket;&lt;br /&gt;    return *this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuSocket::Receive(void *lpBuf, int nBufLen, int nFlags)&lt;br /&gt;{&lt;br /&gt;    return recv( m_hSocket, static_cast&amp;lt;char *&amp;gt;(lpBuf), nBufLen, nFlags );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuSocket::Send(const void *lpBuf, int nBufLen, int nFlags)&lt;br /&gt;{&lt;br /&gt;    return send( m_hSocket, static_cast&amp;lt;const char*&amp;gt;(lpBuf), nBufLen, nFlags );&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-4063334671453960788?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/4063334671453960788/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cusocket-create-endpoint-for.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4063334671453960788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4063334671453960788'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cusocket-create-endpoint-for.html' title='CuSocket - create an endpoint for communication'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-4744146457496910234</id><published>2009-12-30T00:12:00.000-08:00</published><updated>2009-12-30T00:12:57.263-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuKeyNameText - retrieves a string that represents the name of a key</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// retrieves a string that represents the name of a key&lt;br /&gt;&lt;br /&gt;CuKeyNameText KeyNameBySet;&lt;br /&gt;KeyNameBySet.SetScanCode(dwScanCode);&lt;br /&gt;wstring strKeyTextBySet = KeyNameBySet;&lt;br /&gt;&lt;br /&gt;CuKeyNameText KeyName(dwScanCode);&lt;br /&gt;wstring strKeyText = KeyName;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuKeyNameText.h&lt;br /&gt;&lt;br /&gt;class CuKeyNameText&lt;br /&gt;{&lt;br /&gt;    wstring m_strKeyText;&lt;br /&gt;public:&lt;br /&gt;    CuKeyNameText(){};&lt;br /&gt;    CuKeyNameText(DWORD dwScanCode);&lt;br /&gt;    ~CuKeyNameText(){};&lt;br /&gt;&lt;br /&gt;    void SetScanCode(DWORD dwScanCode);&lt;br /&gt;    operator wstring() const;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuKeyNameText.cpp&lt;br /&gt;&lt;br /&gt;CuKeyNameText::CuKeyNameText(DWORD dwScanCode)&lt;br /&gt;{&lt;br /&gt;    SetScanCode(dwScanCode);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuKeyNameText::SetScanCode(DWORD dwScanCode)&lt;br /&gt;{&lt;br /&gt;    LONG lKeyParam = ( dwScanCode &amp;lt;&amp;lt; 16 );&lt;br /&gt;    TCHAR szKeyName[16] = L"";&lt;br /&gt;    ::GetKeyNameText(lKeyParam, szKeyName, sizeof(szKeyName));&lt;br /&gt;    m_strKeyText = szKeyName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuKeyNameText::operator wstring() const&lt;br /&gt;{&lt;br /&gt;    return m_strKeyText;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-4744146457496910234?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/4744146457496910234/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cukeynametext-retrieves-string-that.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4744146457496910234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4744146457496910234'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cukeynametext-retrieves-string-that.html' title='CuKeyNameText - retrieves a string that represents the name of a key'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-3493923047064653955</id><published>2009-12-29T00:09:00.000-08:00</published><updated>2009-12-29T00:09:48.157-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuDrawText - draws formatted text in the specified rectangle.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;//  draws formatted text in the specified rectangle.&lt;br /&gt;&lt;br /&gt;CuDrawText textTest;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;CuRect rt;&lt;br /&gt;GetClientRect(hWnd, &amp;rt);&lt;br /&gt;textTest.SetRect(&amp;rt);&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;textTest.SetText(TEXT("Hi") );&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;CuPaintDC dc(hWnd);&lt;br /&gt;textTest.OnDraw(dc);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuDrawText.h&lt;br /&gt;&lt;br /&gt;class CuDrawText&lt;br /&gt;{&lt;br /&gt;    CuRect m_rt;&lt;br /&gt;    wstring m_strText;&lt;br /&gt;    UINT m_uFormat;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuDrawText(void);&lt;br /&gt;    ~CuDrawText(void);&lt;br /&gt;&lt;br /&gt;    void SetRect(  int xLeft,  int yTop,  int xRight,  int yBottom);&lt;br /&gt;    void SetRect( RECT *rt );&lt;br /&gt;    void SetText(LPCTSTR lpszString);&lt;br /&gt;    void SetFormat(UINT uFormat);&lt;br /&gt;&lt;br /&gt;    int OnDraw(HDC hdc);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuDrawText.cpp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuDrawText::CuDrawText(void)&lt;br /&gt;:m_uFormat(DT_LEFT)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuDrawText::~CuDrawText(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuDrawText::SetRect(  int xLeft,  int yTop,  int xRight,  int yBottom)&lt;br /&gt;{&lt;br /&gt;    m_rt.SetRect(xLeft, yTop, xRight, yBottom);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuDrawText::SetRect( RECT *rt )&lt;br /&gt;{&lt;br /&gt;    m_rt = *rt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuDrawText::SetText(LPCTSTR lpszString)&lt;br /&gt;{&lt;br /&gt;    m_strText = lpszString;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuDrawText::SetFormat(UINT uFormat)&lt;br /&gt;{&lt;br /&gt;    m_uFormat = uFormat;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CuDrawText::OnDraw(HDC hdc)&lt;br /&gt;{&lt;br /&gt;    return ::DrawText(hdc, m_strText.c_str(), m_strText.size(), &amp;m_rt, m_uFormat);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-3493923047064653955?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/3493923047064653955/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cudrawtext-draws-formatted-text-in.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3493923047064653955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/3493923047064653955'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cudrawtext-draws-formatted-text-in.html' title='CuDrawText - draws formatted text in the specified rectangle.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-775456356893482773</id><published>2009-12-28T00:47:00.000-08:00</published><updated>2010-02-15T04:51:52.087-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuPort - Opens I/O device.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Opens I/O device.&lt;br /&gt;class CuDevice : public CuPort&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    CuDevice();&lt;br /&gt;    virtual ~CuDevice();&lt;br /&gt;    virtual void OnRead(BYTE *pByte, int nSize);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuDevice g_device;&lt;br /&gt;DCB g_dcb;&lt;br /&gt;&lt;br /&gt;g_device.Open(L"COM2:");&lt;br /&gt;g_device.SetupComm(1024 * 1024 * 2, 2 * 1024);&lt;br /&gt;g_device.GetCommState(&amp;g_dcb);&lt;br /&gt;....&lt;br /&gt;g_device.SetCommState (&amp;g_dcb);&lt;br /&gt;&lt;br /&gt;COMMTIMEOUTS CommTimeouts;&lt;br /&gt;g_device.GetCommTimeouts ( &amp;CommTimeouts);&lt;br /&gt;....&lt;br /&gt;g_device.SetCommTimeouts ( &amp;CommTimeouts);&lt;br /&gt;g_device.StardReadThread();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuPort.h&lt;br /&gt;&lt;br /&gt;class CuPort  &lt;br /&gt;{&lt;br /&gt;    CuWinThread *m_pReadThread;&lt;br /&gt;    &lt;br /&gt;    HANDLE m_hFile;&lt;br /&gt;&lt;br /&gt;    int m_nReadBufferSize;&lt;br /&gt;    BYTE *m_pReadBuffer;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;    BOOL ClearCommError(LPDWORD lpErrors, LPCOMSTAT lpStat);&lt;br /&gt;    BOOL SetCommTimeouts(LPCOMMTIMEOUTS lpCommTimeouts);&lt;br /&gt;    BOOL GetCommTimeouts(LPCOMMTIMEOUTS lpCommTimeouts);&lt;br /&gt;    BOOL GetCommState(LPDCB lpDCB);&lt;br /&gt;    BOOL SetupComm(DWORD dwInQueue, DWORD dwOutQueue);&lt;br /&gt;    BOOL SetCommState(LPDCB lpDCB);&lt;br /&gt;    BOOL Open(LPCTSTR szComPort);&lt;br /&gt;    BOOL Close(void);&lt;br /&gt;&lt;br /&gt;    CuPort();&lt;br /&gt;    virtual ~CuPort();&lt;br /&gt;    virtual void OnRead(BYTE *pByte, int nSize){};&lt;br /&gt;    virtual void OnWrite(BYTE *pByte, int nSize);&lt;br /&gt;&lt;br /&gt;    BOOL StardReadThread();&lt;br /&gt;    static DWORD ProcessReadThread(LPVOID lpVoid);&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    void ResizeReadBuffer();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuPort.cpp&lt;br /&gt;&lt;br /&gt;CuPort::CuPort():&lt;br /&gt;m_hFile(INVALID_HANDLE_VALUE)&lt;br /&gt;,m_pReadThread(NULL)&lt;br /&gt;,m_nReadBufferSize(1024)&lt;br /&gt;,m_pReadBuffer(NULL)&lt;br /&gt;{&lt;br /&gt;    ResizeReadBuffer();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuPort::~CuPort()&lt;br /&gt;{&lt;br /&gt;    delete [] m_pReadBuffer;&lt;br /&gt;    Close();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuPort::Close()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    BOOL bResult = FALSE;&lt;br /&gt;    if( m_hFile != INVALID_HANDLE_VALUE )&lt;br /&gt;        bResult = ::CloseHandle (m_hFile);&lt;br /&gt;    m_hFile = INVALID_HANDLE_VALUE;&lt;br /&gt;&lt;br /&gt;    if( m_pReadThread )&lt;br /&gt;    {&lt;br /&gt;        m_pReadThread-&amp;gt;SuspendThread();&lt;br /&gt;        m_pReadThread-&amp;gt;Delete();&lt;br /&gt;    }&lt;br /&gt;    m_pReadThread = NULL;&lt;br /&gt;&lt;br /&gt;    return bResult;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuPort::Open(LPCTSTR szComPort)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    Close();&lt;br /&gt;&lt;br /&gt;    m_hFile = ::CreateFile(szComPort, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);&lt;br /&gt;    &lt;br /&gt;    return m_hFile == INVALID_HANDLE_VALUE ? FALSE : TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuPort::SetCommState(LPDCB lpDCB)&lt;br /&gt;{&lt;br /&gt;    return ::SetCommState( m_hFile, lpDCB); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuPort::SetupComm(DWORD dwInQueue, DWORD dwOutQueue)&lt;br /&gt;{&lt;br /&gt;    return ::SetupComm( m_hFile, dwInQueue, dwOutQueue); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuPort::GetCommState(LPDCB lpDCB)&lt;br /&gt;{&lt;br /&gt;    return ::GetCommState (m_hFile, lpDCB);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuPort::GetCommTimeouts(LPCOMMTIMEOUTS lpCommTimeouts)&lt;br /&gt;{&lt;br /&gt;    return ::GetCommTimeouts(m_hFile, lpCommTimeouts);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuPort::SetCommTimeouts(LPCOMMTIMEOUTS lpCommTimeouts)&lt;br /&gt;{&lt;br /&gt;    return ::SetCommTimeouts(m_hFile, lpCommTimeouts);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuPort::ClearCommError(LPDWORD lpErrors, LPCOMSTAT lpStat)&lt;br /&gt;{&lt;br /&gt;    return ::ClearCommError(m_hFile, lpErrors, lpStat );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuPort::StardReadThread()&lt;br /&gt;{&lt;br /&gt;    m_pReadThread = _BeginThread((_THREADPROC)CuPort::ProcessReadThread, (LPVOID)this);&lt;br /&gt;    return m_pReadThread == NULL ? FALSE : TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuPort::OnWrite(BYTE *pByte, int nSize)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if( m_hFile == INVALID_HANDLE_VALUE )&lt;br /&gt;        return;&lt;br /&gt;&lt;br /&gt;    DWORD dBytes = 0;&lt;br /&gt;&lt;br /&gt;    BYTE *pByteIndex = pByte;&lt;br /&gt;&lt;br /&gt;    while( nSize )&lt;br /&gt;    {&lt;br /&gt;        ::WriteFile(m_hFile, pByteIndex, nSize, &amp;dBytes, 0);&lt;br /&gt;        Sleep(1);&lt;br /&gt;        pByteIndex += dBytes;&lt;br /&gt;        nSize -= dBytes;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DWORD CuPort::ProcessReadThread(LPVOID lpVoid)&lt;br /&gt;{&lt;br /&gt;    CuPort *pPort = static_cast&amp;lt;CuPort*&amp;gt;(lpVoid);&lt;br /&gt;&lt;br /&gt;    static DWORD Errors;&lt;br /&gt;    static COMSTAT ComStat;//COMSTAT;&lt;br /&gt;    static DWORD dBytes = 0;&lt;br /&gt;&lt;br /&gt;    while(1)&lt;br /&gt;    {&lt;br /&gt;        do&lt;br /&gt;        {&lt;br /&gt;            Sleep(1);&lt;br /&gt;            ::ReadFile(pPort-&amp;gt;m_hFile, pPort-&amp;gt;m_pReadBuffer, pPort-&amp;gt;m_nReadBufferSize, &amp;dBytes , 0);&lt;br /&gt;        }while( !dBytes );&lt;br /&gt;&lt;br /&gt;        // 如果讀的跟預備的BUFFER 一樣大&lt;br /&gt;        // 就把BUFFER 再加大一倍&lt;br /&gt;&lt;br /&gt;        pPort-&amp;gt;OnRead(pPort-&amp;gt;m_pReadBuffer, dBytes );&lt;br /&gt;&lt;br /&gt;        if( dBytes ==  pPort-&amp;gt;m_nReadBufferSize )&lt;br /&gt;            pPort-&amp;gt;ResizeReadBuffer();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuPort::ResizeReadBuffer()&lt;br /&gt;{&lt;br /&gt;    delete [] m_pReadBuffer;&lt;br /&gt;    m_nReadBufferSize *= 2;&lt;br /&gt;    m_pReadBuffer = new BYTE[m_nReadBufferSize];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-775456356893482773?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/775456356893482773/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cuport-opens-io-device.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/775456356893482773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/775456356893482773'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cuport-opens-io-device.html' title='CuPort - Opens I/O device.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-748279066335359699</id><published>2009-12-27T01:32:00.000-08:00</published><updated>2009-12-28T23:56:40.253-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SampleCode'/><title type='text'>CuRect - Similar to a Windows RECT structure.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Similar to a Windows RECT structure. &lt;br /&gt;&lt;br /&gt;CuRect rt;&lt;br /&gt;GetClientRect(hWnd, &amp;rt);&lt;br /&gt;&lt;br /&gt;// CuRect.h&lt;br /&gt;&lt;br /&gt;class CuRect : public tagRECT&lt;br /&gt;{&lt;br /&gt;    // Constructors&lt;br /&gt;public:&lt;br /&gt;    // uninitialized rectangle&lt;br /&gt;    CuRect() throw();&lt;br /&gt;    // from left, top, right, and bottom&lt;br /&gt;    CuRect(int l, int t, int r, int b) throw();&lt;br /&gt;    // copy constructor&lt;br /&gt;    CuRect(const RECT&amp; srcRect) throw();&lt;br /&gt;    // from a pointer to another rect&lt;br /&gt;    CuRect(LPCRECT lpSrcRect) throw();&lt;br /&gt;    // from a point and size&lt;br /&gt;    CuRect(POINT point, SIZE size) throw();&lt;br /&gt;    // from two points&lt;br /&gt;    CuRect(POINT topLeft, POINT bottomRight) throw();&lt;br /&gt;&lt;br /&gt;    // Attributes (in addition to RECT members)&lt;br /&gt;&lt;br /&gt;    // retrieves the width&lt;br /&gt;    int Width() const throw();&lt;br /&gt;    // returns the height&lt;br /&gt;    int Height() const throw();&lt;br /&gt;    // returns the size&lt;br /&gt;    CuSize Size() const throw();&lt;br /&gt;    // reference to the top-left point&lt;br /&gt;    CuPoint&amp; TopLeft() throw();&lt;br /&gt;    // reference to the bottom-right point&lt;br /&gt;    CuPoint&amp; BottomRight() throw();&lt;br /&gt;    // const reference to the top-left point&lt;br /&gt;    const CuPoint&amp; TopLeft() const throw();&lt;br /&gt;    // const reference to the bottom-right point&lt;br /&gt;    const CuPoint&amp; BottomRight() const throw();&lt;br /&gt;    // the geometric center point of the rectangle&lt;br /&gt;    CuPoint CenterPoint() const throw();&lt;br /&gt;    // swap the left and right&lt;br /&gt;    void SwapLeftRight() throw();&lt;br /&gt;    static void WINAPI SwapLeftRight(LPRECT lpRect) throw();&lt;br /&gt;&lt;br /&gt;    // convert between CuRect and LPRECT/LPCRECT (no need for &amp;)&lt;br /&gt;    operator LPRECT() throw();&lt;br /&gt;    operator LPCRECT() const throw();&lt;br /&gt;&lt;br /&gt;    // returns TRUE if rectangle has no area&lt;br /&gt;    BOOL IsRectEmpty() const throw();&lt;br /&gt;    // returns TRUE if rectangle is at (0,0) and has no area&lt;br /&gt;    BOOL IsRectNull() const throw();&lt;br /&gt;    // returns TRUE if point is within rectangle&lt;br /&gt;    BOOL PtInRect(POINT point) const throw();&lt;br /&gt;&lt;br /&gt;    // Operations&lt;br /&gt;&lt;br /&gt;    // set rectangle from left, top, right, and bottom&lt;br /&gt;    void SetRect(int x1, int y1, int x2, int y2) throw();&lt;br /&gt;    void SetRect(POINT topLeft, POINT bottomRight) throw();&lt;br /&gt;    // empty the rectangle&lt;br /&gt;    void SetRectEmpty() throw();&lt;br /&gt;    // copy from another rectangle&lt;br /&gt;    void CopyRect(LPCRECT lpSrcRect) throw();&lt;br /&gt;    // TRUE if exactly the same as another rectangle&lt;br /&gt;    BOOL EqualRect(LPCRECT lpRect) const throw();&lt;br /&gt;&lt;br /&gt;    // Inflate rectangle's width and height by&lt;br /&gt;    // x units to the left and right ends of the rectangle&lt;br /&gt;    // and y units to the top and bottom.&lt;br /&gt;    void InflateRect(int x, int y) throw();&lt;br /&gt;    // Inflate rectangle's width and height by&lt;br /&gt;    // size.cx units to the left and right ends of the rectangle&lt;br /&gt;    // and size.cy units to the top and bottom.&lt;br /&gt;    void InflateRect(SIZE size) throw();&lt;br /&gt;    // Inflate rectangle's width and height by moving individual sides.&lt;br /&gt;    // Left side is moved to the left, right side is moved to the right,&lt;br /&gt;    // top is moved up and bottom is moved down.&lt;br /&gt;    void InflateRect(LPCRECT lpRect) throw();&lt;br /&gt;    void InflateRect(int l, int t, int r, int b) throw();&lt;br /&gt;&lt;br /&gt;    // deflate the rectangle's width and height without&lt;br /&gt;    // moving its top or left&lt;br /&gt;    void DeflateRect(int x, int y) throw();&lt;br /&gt;    void DeflateRect(SIZE size) throw();&lt;br /&gt;    void DeflateRect(LPCRECT lpRect) throw();&lt;br /&gt;    void DeflateRect(int l, int t, int r, int b) throw();&lt;br /&gt;&lt;br /&gt;    // translate the rectangle by moving its top and left&lt;br /&gt;    void OffsetRect(int x, int y) throw();&lt;br /&gt;    void OffsetRect(SIZE size) throw();&lt;br /&gt;    void OffsetRect(POINT point) throw();&lt;br /&gt;    void NormalizeRect() throw();&lt;br /&gt;&lt;br /&gt;    // absolute position of rectangle&lt;br /&gt;    void MoveToY(int y) throw();&lt;br /&gt;    void MoveToX(int x) throw();&lt;br /&gt;    void MoveToXY(int x, int y) throw();&lt;br /&gt;    void MoveToXY(POINT point) throw();&lt;br /&gt;&lt;br /&gt;    // set this rectangle to intersection of two others&lt;br /&gt;    BOOL IntersectRect(LPCRECT lpRect1, LPCRECT lpRect2) throw();&lt;br /&gt;&lt;br /&gt;    // set this rectangle to bounding union of two others&lt;br /&gt;    BOOL UnionRect(LPCRECT lpRect1, LPCRECT lpRect2) throw();&lt;br /&gt;&lt;br /&gt;    // set this rectangle to minimum of two others&lt;br /&gt;    BOOL SubtractRect(LPCRECT lpRectSrc1, LPCRECT lpRectSrc2) throw();&lt;br /&gt;&lt;br /&gt;    // Additional Operations&lt;br /&gt;    void operator=(const RECT&amp; srcRect) throw();&lt;br /&gt;    BOOL operator==(const RECT&amp; rect) const throw();&lt;br /&gt;    BOOL operator!=(const RECT&amp; rect) const throw();&lt;br /&gt;    void operator+=(POINT point) throw();&lt;br /&gt;    void operator+=(SIZE size) throw();&lt;br /&gt;    void operator+=(LPCRECT lpRect) throw();&lt;br /&gt;    void operator-=(POINT point) throw();&lt;br /&gt;    void operator-=(SIZE size) throw();&lt;br /&gt;    void operator-=(LPCRECT lpRect) throw();&lt;br /&gt;    void operator&amp;=(const RECT&amp; rect) throw();&lt;br /&gt;    void operator|=(const RECT&amp; rect) throw();&lt;br /&gt;&lt;br /&gt;    // Operators returning CuRect values&lt;br /&gt;    CuRect operator+(POINT point) const throw();&lt;br /&gt;    CuRect operator-(POINT point) const throw();&lt;br /&gt;    CuRect operator+(LPCRECT lpRect) const throw();&lt;br /&gt;    CuRect operator+(SIZE size) const throw();&lt;br /&gt;    CuRect operator-(SIZE size) const throw();&lt;br /&gt;    CuRect operator-(LPCRECT lpRect) const throw();&lt;br /&gt;    CuRect operator&amp;(const RECT&amp; rect2) const throw();&lt;br /&gt;    CuRect operator|(const RECT&amp; rect2) const throw();&lt;br /&gt;    //  CuRect MulDiv(int nMultiplier, int nDivisor) const throw();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;inline CuRect::CuRect()&lt;br /&gt;{ /* random filled */ }&lt;br /&gt;inline CuRect::CuRect(int l, int t, int r, int b)&lt;br /&gt;{ left = l; top = t; right = r; bottom = b; }&lt;br /&gt;inline CuRect::CuRect(const RECT&amp; srcRect)&lt;br /&gt;{ ::CopyRect(this, &amp;srcRect); }&lt;br /&gt;inline CuRect::CuRect(LPCRECT lpSrcRect)&lt;br /&gt;{ ::CopyRect(this, lpSrcRect); }&lt;br /&gt;inline CuRect::CuRect(POINT point, SIZE size)&lt;br /&gt;{ right = (left = point.x) + size.cx; bottom = (top = point.y) + size.cy; }&lt;br /&gt;inline CuRect::CuRect(POINT topLeft, POINT bottomRight)&lt;br /&gt;{ left = topLeft.x; top = topLeft.y;&lt;br /&gt;right = bottomRight.x; bottom = bottomRight.y; }&lt;br /&gt;inline int CuRect::Width() const&lt;br /&gt;{ return right - left; }&lt;br /&gt;inline int CuRect::Height() const&lt;br /&gt;{ return bottom - top; }&lt;br /&gt;inline CuSize CuRect::Size() const&lt;br /&gt;{ return CuSize(right - left, bottom - top); }&lt;br /&gt;inline CuPoint&amp; CuRect::TopLeft()&lt;br /&gt;{ return *((CuPoint*)this); }&lt;br /&gt;inline CuPoint&amp; CuRect::BottomRight()&lt;br /&gt;{ return *((CuPoint*)this+1); }&lt;br /&gt;inline const CuPoint&amp; CuRect::TopLeft() const&lt;br /&gt;{ return *((CuPoint*)this); }&lt;br /&gt;inline const CuPoint&amp; CuRect::BottomRight() const&lt;br /&gt;{ return *((CuPoint*)this+1); }&lt;br /&gt;inline CuPoint CuRect::CenterPoint() const&lt;br /&gt;{ return CuPoint((left+right)/2, (top+bottom)/2); }&lt;br /&gt;inline void CuRect::SwapLeftRight()&lt;br /&gt;{ SwapLeftRight(LPRECT(this)); }&lt;br /&gt;inline void WINAPI CuRect::SwapLeftRight(LPRECT lpRect)&lt;br /&gt;{ LONG temp = lpRect-&gt;left; lpRect-&gt;left = lpRect-&gt;right; lpRect-&gt;right = temp; }&lt;br /&gt;inline CuRect::operator LPRECT()&lt;br /&gt;{ return this; }&lt;br /&gt;inline CuRect::operator LPCRECT() const&lt;br /&gt;{ return this; }&lt;br /&gt;inline BOOL CuRect::IsRectEmpty() const&lt;br /&gt;{ return ::IsRectEmpty(this); }&lt;br /&gt;inline BOOL CuRect::IsRectNull() const&lt;br /&gt;{ return (left == 0 &amp;&amp; right == 0 &amp;&amp; top == 0 &amp;&amp; bottom == 0); }&lt;br /&gt;inline BOOL CuRect::PtInRect(POINT point) const&lt;br /&gt;{ return ::PtInRect(this, point); }&lt;br /&gt;inline void CuRect::SetRect(int x1, int y1, int x2, int y2)&lt;br /&gt;{ ::SetRect(this, x1, y1, x2, y2); }&lt;br /&gt;inline void CuRect::SetRect(POINT topLeft, POINT bottomRight)&lt;br /&gt;{ ::SetRect(this, topLeft.x, topLeft.y, bottomRight.x, bottomRight.y); }&lt;br /&gt;inline void CuRect::SetRectEmpty()&lt;br /&gt;{ ::SetRectEmpty(this); }&lt;br /&gt;inline void CuRect::CopyRect(LPCRECT lpSrcRect)&lt;br /&gt;{ ::CopyRect(this, lpSrcRect); }&lt;br /&gt;inline BOOL CuRect::EqualRect(LPCRECT lpRect) const&lt;br /&gt;{ return ::EqualRect(this, lpRect); }&lt;br /&gt;inline void CuRect::InflateRect(int x, int y)&lt;br /&gt;{ ::InflateRect(this, x, y); }&lt;br /&gt;inline void CuRect::InflateRect(SIZE size)&lt;br /&gt;{ ::InflateRect(this, size.cx, size.cy); }&lt;br /&gt;inline void CuRect::DeflateRect(int x, int y)&lt;br /&gt;{ ::InflateRect(this, -x, -y); }&lt;br /&gt;inline void CuRect::DeflateRect(SIZE size)&lt;br /&gt;{ ::InflateRect(this, -size.cx, -size.cy); }&lt;br /&gt;inline void CuRect::OffsetRect(int x, int y)&lt;br /&gt;{ ::OffsetRect(this, x, y); }&lt;br /&gt;inline void CuRect::OffsetRect(POINT point)&lt;br /&gt;{ ::OffsetRect(this, point.x, point.y); }&lt;br /&gt;inline void CuRect::OffsetRect(SIZE size)&lt;br /&gt;{ ::OffsetRect(this, size.cx, size.cy); }&lt;br /&gt;inline void CuRect::MoveToY(int y)&lt;br /&gt;{ bottom = Height() + y; top = y; }&lt;br /&gt;inline void CuRect::MoveToX(int x)&lt;br /&gt;{ right = Width() + x; left = x; }&lt;br /&gt;inline void CuRect::MoveToXY(int x, int y)&lt;br /&gt;{ MoveToX(x); MoveToY(y); }&lt;br /&gt;inline void CuRect::MoveToXY(POINT pt)&lt;br /&gt;{ MoveToX(pt.x); MoveToY(pt.y); }&lt;br /&gt;inline BOOL CuRect::IntersectRect(LPCRECT lpRect1, LPCRECT lpRect2)&lt;br /&gt;{ return ::IntersectRect(this, lpRect1, lpRect2);}&lt;br /&gt;inline BOOL CuRect::UnionRect(LPCRECT lpRect1, LPCRECT lpRect2)&lt;br /&gt;{ return ::UnionRect(this, lpRect1, lpRect2); }&lt;br /&gt;inline void CuRect::operator=(const RECT&amp; srcRect)&lt;br /&gt;{ ::CopyRect(this, &amp;srcRect); }&lt;br /&gt;inline BOOL CuRect::operator==(const RECT&amp; rect) const&lt;br /&gt;{ return ::EqualRect(this, &amp;rect); }&lt;br /&gt;inline BOOL CuRect::operator!=(const RECT&amp; rect) const&lt;br /&gt;{ return !::EqualRect(this, &amp;rect); }&lt;br /&gt;inline void CuRect::operator+=(POINT point)&lt;br /&gt;{ ::OffsetRect(this, point.x, point.y); }&lt;br /&gt;inline void CuRect::operator+=(SIZE size)&lt;br /&gt;{ ::OffsetRect(this, size.cx, size.cy); }&lt;br /&gt;inline void CuRect::operator+=(LPCRECT lpRect)&lt;br /&gt;{ InflateRect(lpRect); }&lt;br /&gt;inline void CuRect::operator-=(POINT point)&lt;br /&gt;{ ::OffsetRect(this, -point.x, -point.y); }&lt;br /&gt;inline void CuRect::operator-=(SIZE size)&lt;br /&gt;{ ::OffsetRect(this, -size.cx, -size.cy); }&lt;br /&gt;inline void CuRect::operator-=(LPCRECT lpRect)&lt;br /&gt;{ DeflateRect(lpRect); }&lt;br /&gt;inline void CuRect::operator&amp;=(const RECT&amp; rect)&lt;br /&gt;{ ::IntersectRect(this, this, &amp;rect); }&lt;br /&gt;inline void CuRect::operator|=(const RECT&amp; rect)&lt;br /&gt;{ ::UnionRect(this, this, &amp;rect); }&lt;br /&gt;inline CuRect CuRect::operator+(POINT pt) const&lt;br /&gt;{ CuRect rect(*this); ::OffsetRect(&amp;rect, pt.x, pt.y); return rect; }&lt;br /&gt;inline CuRect CuRect::operator-(POINT pt) const&lt;br /&gt;{ CuRect rect(*this); ::OffsetRect(&amp;rect, -pt.x, -pt.y); return rect; }&lt;br /&gt;inline CuRect CuRect::operator+(SIZE size) const&lt;br /&gt;{ CuRect rect(*this); ::OffsetRect(&amp;rect, size.cx, size.cy); return rect; }&lt;br /&gt;inline CuRect CuRect::operator-(SIZE size) const&lt;br /&gt;{ CuRect rect(*this); ::OffsetRect(&amp;rect, -size.cx, -size.cy); return rect; }&lt;br /&gt;inline CuRect CuRect::operator+(LPCRECT lpRect) const&lt;br /&gt;{ CuRect rect(this); rect.InflateRect(lpRect); return rect; }&lt;br /&gt;inline CuRect CuRect::operator-(LPCRECT lpRect) const&lt;br /&gt;{ CuRect rect(this); rect.DeflateRect(lpRect); return rect; }&lt;br /&gt;inline CuRect CuRect::operator&amp;(const RECT&amp; rect2) const&lt;br /&gt;{ CuRect rect; ::IntersectRect(&amp;rect, this, &amp;rect2);&lt;br /&gt;return rect; }&lt;br /&gt;inline CuRect CuRect::operator|(const RECT&amp; rect2) const&lt;br /&gt;{ CuRect rect; ::UnionRect(&amp;rect, this, &amp;rect2);&lt;br /&gt;return rect; }&lt;br /&gt;inline BOOL CuRect::SubtractRect(LPCRECT lpRectSrc1, LPCRECT lpRectSrc2)&lt;br /&gt;{ return ::SubtractRect(this, lpRectSrc1, lpRectSrc2); }&lt;br /&gt;&lt;br /&gt;inline void CuRect::NormalizeRect()&lt;br /&gt;{&lt;br /&gt;    int nTemp;&lt;br /&gt;    if (left &gt; right)&lt;br /&gt;    {&lt;br /&gt;        nTemp = left;&lt;br /&gt;        left = right;&lt;br /&gt;        right = nTemp;&lt;br /&gt;    }&lt;br /&gt;    if (top &gt; bottom)&lt;br /&gt;    {&lt;br /&gt;        nTemp = top;&lt;br /&gt;        top = bottom;&lt;br /&gt;        bottom = nTemp;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void CuRect::InflateRect(LPCRECT lpRect)&lt;br /&gt;{&lt;br /&gt;    left -= lpRect-&gt;left;       top -= lpRect-&gt;top;&lt;br /&gt;    right += lpRect-&gt;right;     bottom += lpRect-&gt;bottom;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void CuRect::InflateRect(int l, int t, int r, int b)&lt;br /&gt;{&lt;br /&gt;    left -= l;          top -= t;&lt;br /&gt;    right += r;         bottom += b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void CuRect::DeflateRect(LPCRECT lpRect)&lt;br /&gt;{&lt;br /&gt;    left += lpRect-&gt;left;   top += lpRect-&gt;top;&lt;br /&gt;    right -= lpRect-&gt;right; bottom -= lpRect-&gt;bottom;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void CuRect::DeflateRect(int l, int t, int r, int b)&lt;br /&gt;{&lt;br /&gt;    left += l;      top += t;&lt;br /&gt;    right -= r;     bottom -= b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-748279066335359699?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/748279066335359699/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/curect-similar-to-windows-rect.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/748279066335359699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/748279066335359699'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/curect-similar-to-windows-rect.html' title='CuRect - Similar to a Windows RECT structure.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-601819396686290455</id><published>2009-12-26T00:35:00.000-08:00</published><updated>2009-12-26T00:35:34.280-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuHook - HookDLL.dll Adapter</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// HookDLL.dll Adapter&lt;br /&gt;&lt;br /&gt;LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);&lt;br /&gt;&lt;br /&gt;CuHook Hook;&lt;br /&gt;Hook.Init(HookProc, WH_KEYBOARD_LL);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuHook.h&lt;br /&gt;&lt;br /&gt;class CuHook&lt;br /&gt;{&lt;br /&gt;    typedef void (* LPFN_INITHOOK)(HOOKPROC lpfnCallBackHookProc, int idHook);&lt;br /&gt;    LPFN_INITHOOK m_lpfnInitHook;&lt;br /&gt;&lt;br /&gt;    typedef void (* LPFN_UNHOOK)(void);&lt;br /&gt;    LPFN_UNHOOK m_lpfnUnHook;&lt;br /&gt;&lt;br /&gt;    CuDllManager m_DllManager;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuHook(void);&lt;br /&gt;    ~CuHook(void);&lt;br /&gt;&lt;br /&gt;    void Init(HOOKPROC lpfnCallBackHookProc, int idHook);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuHook.cpp&lt;br /&gt;&lt;br /&gt;CuHook::CuHook(void)&lt;br /&gt;:m_lpfnInitHook(NULL),&lt;br /&gt;m_lpfnUnHook(NULL)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuHook::~CuHook(void)&lt;br /&gt;{&lt;br /&gt;    if( m_lpfnUnHook != NULL )&lt;br /&gt;        m_lpfnUnHook();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuHook::Init(HOOKPROC lpfnCallBackHookProc, int idHook)&lt;br /&gt;{&lt;br /&gt;    BOOL bLoadDll = m_DllManager.LoadLibrary(L"HookDll.dll");&lt;br /&gt;    Assert( bLoadDll != NULL, TEXT("Don't Find HookDll.dll") );&lt;br /&gt;&lt;br /&gt;    m_lpfnInitHook = (LPFN_INITHOOK)m_DllManager.GetProcAddress("InitHook");&lt;br /&gt;    Assert( m_lpfnInitHook != NULL, TEXT("Don't Find function InitHook") );&lt;br /&gt;&lt;br /&gt;    m_lpfnUnHook = (LPFN_UNHOOK)m_DllManager.GetProcAddress("UnHook");&lt;br /&gt;    Assert( m_lpfnInitHook != NULL, TEXT("Don't Find function UnHook") );&lt;br /&gt;&lt;br /&gt;    if( m_lpfnInitHook != NULL )&lt;br /&gt;        m_lpfnInitHook(lpfnCallBackHookProc, idHook);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-601819396686290455?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/601819396686290455/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cuhook-hookdlldll-adapter.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/601819396686290455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/601819396686290455'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cuhook-hookdlldll-adapter.html' title='CuHook - HookDLL.dll Adapter'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-4857737551182821524</id><published>2009-12-25T00:06:00.000-08:00</published><updated>2010-05-14T00:27:49.839-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuPaintDC - A device-context class.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// A device-context class. &lt;br /&gt;// A CuPaintDC object can only be used when responding to a WM_PAINT message&lt;br /&gt;&lt;br /&gt;CuPaintDC dc(hWnd);&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: cpp;"&gt;&lt;br /&gt;// CuPaintDC.h&lt;br /&gt;&lt;br /&gt;class CuPaintDC&lt;br /&gt;{&lt;br /&gt;    HWND m_hWnd;&lt;br /&gt;    HDC m_hDC;&lt;br /&gt;    PAINTSTRUCT m_PS;&lt;br /&gt;public:&lt;br /&gt;    CuPaintDC(HWND hWnd);&lt;br /&gt;public:&lt;br /&gt;    ~CuPaintDC(void);&lt;br /&gt;    operator HDC() const;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: cpp;"&gt;&lt;br /&gt;// CuPaintDC.cpp&lt;br /&gt;&lt;br /&gt;CuPaintDC::CuPaintDC(HWND hWnd)&lt;br /&gt;{&lt;br /&gt;    m_hWnd = hWnd;&lt;br /&gt;    m_hDC = BeginPaint(m_hWnd, &amp;m_PS);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuPaintDC::~CuPaintDC(void)&lt;br /&gt;{&lt;br /&gt;    EndPaint(m_hWnd, &amp;m_PS);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuPaintDC::operator HDC() const&lt;br /&gt;{&lt;br /&gt;    return m_hDC;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-4857737551182821524?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/4857737551182821524/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cupaintdc-device-context-class.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4857737551182821524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4857737551182821524'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cupaintdc-device-context-class.html' title='CuPaintDC - A device-context class.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-4554759131108231174</id><published>2009-12-23T22:22:00.000-08:00</published><updated>2010-05-10T19:27:18.406-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>HookDll - installs an application-defined hook procedure into a hook chain.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// installs an application-defined hook procedure into a hook chain.&lt;br /&gt;&lt;br /&gt;LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);&lt;br /&gt;&lt;br /&gt;typedef void (* LPFN_INITHOOK)(HOOKPROC lpfnCallBackHookProc, int idHook);&lt;br /&gt;LPFN_INITHOOK lpfnInitHook;&lt;br /&gt;&lt;br /&gt;typedef void (* LPFN_UNHOOK)(void);&lt;br /&gt;LPFN_UNHOOK lpfnUnHook;&lt;br /&gt;&lt;br /&gt;CuDllManager DllManager;&lt;br /&gt;BOOL bLoadDll = DllManager.LoadLibrary(L"HookDll.dll");&lt;br /&gt;lpfnInitHook = (LPFN_INITHOOK)DllManager.GetProcAddress("InitHook");&lt;br /&gt;lpfnUnHook = (LPFN_UNHOOK)DllManager.GetProcAddress("UnHook");&lt;br /&gt;lpfnInitHook(HookProc, WH_MOUSE_LL);&lt;br /&gt;&lt;br /&gt;lpfnUnHook();&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: cpp;"&gt;// HookDll.h&lt;br /&gt;&lt;br /&gt;#ifdef HOOKDLL_EXPORTS&lt;br /&gt;#define HOOKDLL_API __declspec(dllexport)&lt;br /&gt;#else&lt;br /&gt;#define HOOKDLL_API __declspec(dllimport)&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;extern "C" {&lt;br /&gt;#endif //__cplusplus&lt;br /&gt;&lt;br /&gt;    HOOKDLL_API void InitHook(HOOKPROC lpfnCallBackHookProc, int idHook );&lt;br /&gt;    HOOKDLL_API void UnHook(void);&lt;br /&gt;&lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;} // extern "C"&lt;br /&gt;#endif //__cplusplus&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: cpp;"&gt;// HookDll.cpp&lt;br /&gt;&lt;br /&gt;#pragma comment(linker,"/SECTION:.MYSEC,RWS")   &lt;br /&gt;&lt;br /&gt;#pragma data_seg(".MYSEC") &lt;br /&gt;HOOKPROC g_lpfnCallBackHookProc = NULL;&lt;br /&gt;HHOOK ghHook = NULL;&lt;br /&gt;#pragma data_seg()  &lt;br /&gt;&lt;br /&gt;HMODULE ghModule;&lt;br /&gt;&lt;br /&gt;#ifdef _MANAGED&lt;br /&gt;#pragma managed(push, off)&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;BOOL APIENTRY DllMain( HMODULE hModule,&lt;br /&gt;                       DWORD  ul_reason_for_call,&lt;br /&gt;                       LPVOID lpReserved&lt;br /&gt;                     )&lt;br /&gt;{&lt;br /&gt;    switch (ul_reason_for_call)&lt;br /&gt;    {&lt;br /&gt;    case DLL_PROCESS_ATTACH:&lt;br /&gt;    case DLL_THREAD_ATTACH:&lt;br /&gt;        ghModule = hModule;&lt;br /&gt;        break;&lt;br /&gt;    case DLL_THREAD_DETACH:&lt;br /&gt;    case DLL_PROCESS_DETACH:&lt;br /&gt;        UnHook();&lt;br /&gt;        ghHook = NULL;&lt;br /&gt;        break;&lt;br /&gt;    }&lt;br /&gt;    return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#ifdef _MANAGED&lt;br /&gt;#pragma managed(pop)&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    if ( nCode &amp;lt; 0 )&lt;br /&gt;        return ::CallNextHookEx(ghHook, nCode, wParam, lParam);&lt;br /&gt;&lt;br /&gt;    if( nCode == HC_ACTION )&lt;br /&gt;    {&lt;br /&gt;        if( g_lpfnCallBackHookProc )&lt;br /&gt;            g_lpfnCallBackHookProc(nCode, wParam, lParam);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return ::CallNextHookEx(ghHook, nCode, wParam, lParam);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HOOKDLL_API void InitHook(HOOKPROC lpfnCallBackHookProc, int idHook )&lt;br /&gt;{&lt;br /&gt;    g_lpfnCallBackHookProc = lpfnCallBackHookProc;&lt;br /&gt;    ghHook = (HHOOK)::SetWindowsHookEx(idHook, HookProc, ghModule ,0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HOOKDLL_API void UnHook(void)&lt;br /&gt;{&lt;br /&gt;    ::UnhookWindowsHookEx(ghHook);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-4554759131108231174?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/4554759131108231174/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/hookdll-installs-application-defined.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4554759131108231174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4554759131108231174'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/hookdll-installs-application-defined.html' title='HookDll - installs an application-defined hook procedure into a hook chain.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-4090563526307822084</id><published>2009-12-23T00:12:00.001-08:00</published><updated>2009-12-23T00:12:46.367-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuDllManager - Retrieves the address of an exported function or variable from the specified dynamic-link library (DLL).</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Retrieves the address of an exported function or variable from the specified dynamic-link library (DLL).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;typedef void (* LPFN_MYFUNCTION)(void);&lt;br /&gt;LPFN_MYFUNCTION lpfnMyFunction;&lt;br /&gt;&lt;br /&gt;CuDllManager DllManager;&lt;br /&gt;&lt;br /&gt;BOOL bLoadDll = DllManager.LoadLibrary(L"dllfile.dll");&lt;br /&gt;lpfnMyFunction = (LPFN_MYFUNCTION)DllManager.GetProcAddress("MyFunction");&lt;br /&gt;&lt;br /&gt;// CuDllManager.h&lt;br /&gt;&lt;br /&gt;class CuDllManager&lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt;    HINSTANCE m_hinstDll;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;    virtual FARPROC GetProcAddress(LPCSTR lpProcName);&lt;br /&gt;&lt;br /&gt;    virtual void FreeLibrary();&lt;br /&gt;    virtual BOOL LoadLibrary(LPCTSTR szLibrary);&lt;br /&gt;&lt;br /&gt;    CuDllManager();&lt;br /&gt;    virtual ~CuDllManager();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuDllManager.cpp&lt;br /&gt;&lt;br /&gt;CuDllManager::CuDllManager()&lt;br /&gt;{&lt;br /&gt;    m_hinstDll = NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuDllManager::~CuDllManager()&lt;br /&gt;{&lt;br /&gt;    FreeLibrary();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuDllManager::LoadLibrary(LPCTSTR szLibrary)&lt;br /&gt;{&lt;br /&gt;    FreeLibrary();&lt;br /&gt;    m_hinstDll = ::LoadLibrary(szLibrary);&lt;br /&gt;    return (BOOL)m_hinstDll != NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuDllManager::FreeLibrary()&lt;br /&gt;{&lt;br /&gt;    if( m_hinstDll != NULL )&lt;br /&gt;    {&lt;br /&gt;        ::FreeLibrary(m_hinstDll);&lt;br /&gt;        m_hinstDll = NULL;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;FARPROC CuDllManager::GetProcAddress(LPCSTR lpProcName)&lt;br /&gt;{&lt;br /&gt;    return ::GetProcAddress(m_hinstDll, lpProcName);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-4090563526307822084?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/4090563526307822084/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cudllmanager-retrieves-address-of.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4090563526307822084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4090563526307822084'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/cudllmanager-retrieves-address-of.html' title='CuDllManager - Retrieves the address of an exported function or variable from the specified dynamic-link library (DLL).'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-5651485345719037616</id><published>2009-12-21T20:40:00.000-08:00</published><updated>2009-12-26T17:05:49.799-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuEventObject - Creates or opens a named or unnamed event object.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Creates or opens a named or unnamed event object.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuEventObject.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CuEventObject&lt;br /&gt;{&lt;br /&gt;    HANDLE m_hHandle;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    DWORD WaitForSingleObject(DWORD dwMilliseconds = INFINITE);&lt;br /&gt;&lt;br /&gt;    BOOL SetEvent();&lt;br /&gt;    BOOL ResetEvent();&lt;br /&gt;    BOOL CreateEvent(TCHAR *szName, BOOL bManualReset = FALSE, BOOL bInitialState = FALSE);&lt;br /&gt;    BOOL CloseHandle();&lt;br /&gt;    operator HANDLE() const;&lt;br /&gt;&lt;br /&gt;    CuEventObject();&lt;br /&gt;    CuEventObject(TCHAR *szName);&lt;br /&gt;&lt;br /&gt;    // 自動呼叫　CloseHandle();&lt;br /&gt;    virtual ~CuEventObject();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuEventObject.cpp&lt;br /&gt;&lt;br /&gt;CuEventObject::CuEventObject(TCHAR *szName)&lt;br /&gt;:m_hHandle(NULL)&lt;br /&gt;{&lt;br /&gt;    CreateEvent(szName);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuEventObject::CuEventObject()&lt;br /&gt;:m_hHandle(NULL)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuEventObject::~CuEventObject()&lt;br /&gt;{&lt;br /&gt;    CloseHandle();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuEventObject::operator HANDLE() const&lt;br /&gt;{&lt;br /&gt;    return m_hHandle;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuEventObject::CloseHandle()&lt;br /&gt;{&lt;br /&gt;    BOOL bResult = TRUE;&lt;br /&gt;    if(m_hHandle)&lt;br /&gt;        bResult = ::CloseHandle(m_hHandle);&lt;br /&gt;    m_hHandle = NULL;&lt;br /&gt;&lt;br /&gt;    return bResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuEventObject::CreateEvent(TCHAR *szName, BOOL bManualReset /*= FALSE*/, BOOL bInitialState /*= FALSE*/)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    CloseHandle();&lt;br /&gt;    m_hHandle = ::CreateEvent(NULL, bManualReset, bInitialState, szName);&lt;br /&gt;    return (m_hHandle == NULL);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;BOOL CuEventObject::ResetEvent()&lt;br /&gt;{&lt;br /&gt;    return ::ResetEvent(m_hHandle);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuEventObject::SetEvent()&lt;br /&gt;{&lt;br /&gt;    return  ::SetEvent(m_hHandle);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DWORD CuEventObject::WaitForSingleObject(DWORD dwMilliseconds /*  = INFINITE */)&lt;br /&gt;{&lt;br /&gt;    return  ::WaitForSingleObject(m_hHandle, dwMilliseconds);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-5651485345719037616?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/5651485345719037616/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/creates-or-opens-named-or-unnamed-event.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5651485345719037616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5651485345719037616'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/creates-or-opens-named-or-unnamed-event.html' title='CuEventObject - Creates or opens a named or unnamed event object.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-2464945271310273611</id><published>2009-12-21T00:26:00.000-08:00</published><updated>2009-12-30T16:35:08.876-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SampleCode'/><title type='text'>CuWinThread - Represents a thread of execution within an application.</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Represents a thread of execution within an application. &lt;br /&gt;&lt;br /&gt;// CuWinThread.h&lt;br /&gt;&lt;br /&gt;typedef UINT (__cdecl  *_THREADPROC)(LPVOID);&lt;br /&gt;&lt;br /&gt;// global helpers for threads&lt;br /&gt;class CuWinThread;&lt;br /&gt;&lt;br /&gt;CuWinThread* _BeginThread(_THREADPROC pfnThreadProc, LPVOID pParam,&lt;br /&gt;    int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0,&lt;br /&gt;    DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);&lt;br /&gt;&lt;br /&gt;class CuWinThread  &lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    BOOL CreateThread(DWORD dwCreateFlags = 0, UINT nStackSize = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);&lt;br /&gt;&lt;br /&gt;    // only valid while running&lt;br /&gt;    HANDLE m_hThread;       // this thread's HANDLE&lt;br /&gt;    DWORD m_nThreadID;      // this thread's ID&lt;br /&gt;    BOOL m_bAutoDelete;     // enables 'delete this' after thread termination&lt;br /&gt;&lt;br /&gt;    LPVOID m_pThreadParams; // generic parameters passed to starting function&lt;br /&gt;    _THREADPROC m_pfnThreadProc;&lt;br /&gt;&lt;br /&gt;    CuWinThread();&lt;br /&gt;    CuWinThread(_THREADPROC pfnThreadProc, LPVOID pParam);&lt;br /&gt;&lt;br /&gt;// Operations&lt;br /&gt;    DWORD SuspendThread();&lt;br /&gt;    DWORD ResumeThread();&lt;br /&gt;    BOOL SetThreadPriority(int nPriority);&lt;br /&gt;&lt;br /&gt;// Implementation&lt;br /&gt;    void CommonConstruct();&lt;br /&gt;    virtual ~CuWinThread();&lt;br /&gt;&lt;br /&gt;    // 'delete this' only if m_bAutoDelete == TRUE&lt;br /&gt;    virtual void Delete();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;inline DWORD CuWinThread::ResumeThread()&lt;br /&gt;    { Assert(m_hThread != NULL, _T("CuWinThread::ResumeThread m_hThread != NULL") ); return ::ResumeThread(m_hThread); }&lt;br /&gt;inline DWORD CuWinThread::SuspendThread()&lt;br /&gt;    { Assert(m_hThread != NULL, _T("CuWinThread::SuspendThread m_hThread != NULL")) ; return ::SuspendThread(m_hThread); }&lt;br /&gt;inline BOOL CuWinThread::SetThreadPriority(int nPriority)&lt;br /&gt;    { Assert(m_hThread != NULL, _T("CuWinThread::SetThreadPriority m_hThread != NULL")); return ::SetThreadPriority(m_hThread, nPriority); }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuWinThread.cpp&lt;br /&gt;&lt;br /&gt;struct _THREAD_STARTUP&lt;br /&gt;{&lt;br /&gt;    // following are "in" parameters to thread startup&lt;br /&gt;    //_THREAD_STATE* pThreadState;    // thread state of parent thread&lt;br /&gt;    CuWinThread* pThread;    // CWinThread for new thread&lt;br /&gt;    DWORD dwCreateFlags;    // thread creation flags&lt;br /&gt;&lt;br /&gt;    HANDLE hEvent;          // event triggered after success/non-success&lt;br /&gt;    HANDLE hEvent2;         // event triggered after thread is resumed&lt;br /&gt;&lt;br /&gt;    // strictly "out" -- set after hEvent is triggered&lt;br /&gt;    BOOL bError;    // TRUE if error during startup&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;DWORD __cdecl _ThreadEntry(void* pParam)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    _THREAD_STARTUP* pStartup = (_THREAD_STARTUP*)pParam;&lt;br /&gt;    Assert(pStartup != NULL, _T("_ThreadEntry::\npStartup != NULL"));&lt;br /&gt;    Assert(pStartup-&amp;gt;pThread != NULL, _T("_ThreadEntry::\npStartup-&amp;gt;pThread != NULL"));&lt;br /&gt;    Assert(pStartup-&amp;gt;hEvent != NULL, _T("_ThreadEntry::\npStartup-&amp;gt;hEvent != NULL"));&lt;br /&gt;    Assert(!pStartup-&amp;gt;bError, _T("_ThreadEntry::\n!pStartup-&amp;gt;bError"));&lt;br /&gt;&lt;br /&gt;    CuWinThread* pThread = pStartup-&amp;gt;pThread;&lt;br /&gt;    &lt;br /&gt;    // pStartup is invlaid after the following&lt;br /&gt;    // SetEvent (but hEvent2 is valid)&lt;br /&gt;    HANDLE hEvent2 = pStartup-&amp;gt;hEvent2;&lt;br /&gt;&lt;br /&gt;    // allow the creating thread to return from CWinThread::CreateThread&lt;br /&gt;    Verify(::SetEvent(pStartup-&amp;gt;hEvent), _T(""));&lt;br /&gt;&lt;br /&gt;    // wait for thread to be resumed&lt;br /&gt;    Verify(::WaitForSingleObject(hEvent2, INFINITE) == WAIT_OBJECT_0, _T(""));&lt;br /&gt;    ::CloseHandle(hEvent2);&lt;br /&gt;&lt;br /&gt;    // first -- check for simple worker thread&lt;br /&gt;    DWORD nResult = 0;&lt;br /&gt;    if (pThread-&amp;gt;m_pfnThreadProc != NULL)&lt;br /&gt;    {&lt;br /&gt;        nResult = (*pThread-&amp;gt;m_pfnThreadProc)(pThread-&amp;gt;m_pThreadParams);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    pThread-&amp;gt;Delete();&lt;br /&gt;&lt;br /&gt;    // allow C-runtime to cleanup, and exit the thread&lt;br /&gt;    ::ExitThread(nResult);&lt;br /&gt;    return 0;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CuWinThread* _BeginThread(_THREADPROC pfnThreadProc, LPVOID pParam,&lt;br /&gt;    int nPriority /* = THREAD_PRIORITY_NORMAL */, UINT nStackSize /* = 0 */,&lt;br /&gt;    DWORD dwCreateFlags /* = 0 */, LPSECURITY_ATTRIBUTES lpSecurityAttrs /* = NULL*/ )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    Assert(pfnThreadProc != NULL, _T(""));&lt;br /&gt;&lt;br /&gt;    CuWinThread* pThread = new CuWinThread(pfnThreadProc, pParam);&lt;br /&gt;    Assert(pThread != NULL , _T("_BeginThread:: pThread == NULL"));&lt;br /&gt;&lt;br /&gt;    if (!pThread-&amp;gt;CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize,&lt;br /&gt;        lpSecurityAttrs))&lt;br /&gt;    {&lt;br /&gt;        pThread-&amp;gt;Delete();&lt;br /&gt;        return NULL;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    Verify(pThread-&amp;gt;SetThreadPriority(nPriority) , _T(""));&lt;br /&gt;    if (!(dwCreateFlags &amp; CREATE_SUSPENDED))&lt;br /&gt;        Verify(pThread-&amp;gt;ResumeThread() != (DWORD)-1, _T(""));&lt;br /&gt;&lt;br /&gt;    return pThread;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Construction/Destruction&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;CuWinThread::CuWinThread()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    m_pThreadParams = NULL; &lt;br /&gt;    m_pfnThreadProc = NULL;&lt;br /&gt;&lt;br /&gt;    CommonConstruct();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuWinThread::CuWinThread(_THREADPROC pfnThreadProc, LPVOID pParam)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    m_pThreadParams = pParam;&lt;br /&gt;    m_pfnThreadProc = pfnThreadProc;&lt;br /&gt;&lt;br /&gt;    CommonConstruct();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuWinThread::~CuWinThread()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    // free thread object&lt;br /&gt;    if (m_hThread != NULL)&lt;br /&gt;        CloseHandle(m_hThread);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuWinThread::CommonConstruct()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    m_hThread = NULL;&lt;br /&gt;    m_nThreadID = 0;&lt;br /&gt;    m_bAutoDelete = TRUE;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuWinThread::Delete()&lt;br /&gt;{&lt;br /&gt;    // delete thread if it is auto-deleting&lt;br /&gt;    if (m_bAutoDelete)&lt;br /&gt;        delete this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuWinThread::CreateThread(DWORD dwCreateFlags, UINT nStackSize, LPSECURITY_ATTRIBUTES lpSecurityAttrs)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    Assert(m_hThread == NULL, _T("CreateThread::m_hThread == NULL"));  // already created?&lt;br /&gt;&lt;br /&gt;    // setup startup structure for thread initialization&lt;br /&gt;    _THREAD_STARTUP startup; &lt;br /&gt;    &lt;br /&gt;    memset(&amp;startup, 0, sizeof(startup));&lt;br /&gt;    startup.pThread = this;&lt;br /&gt;    startup.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);&lt;br /&gt;    startup.hEvent2 = ::CreateEvent(NULL, TRUE, FALSE, NULL);&lt;br /&gt;    startup.dwCreateFlags = dwCreateFlags;&lt;br /&gt;    if (startup.hEvent == NULL || startup.hEvent2 == NULL)&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        Assert(0, _T("Warning: CreateEvent failed in CWinThread::CreateThread.\n"));&lt;br /&gt;        //TRACE(traceAppMsg, 0, "Warning: CreateEvent failed in CWinThread::CreateThread.\n");&lt;br /&gt;        if (startup.hEvent != NULL)&lt;br /&gt;            ::CloseHandle(startup.hEvent);&lt;br /&gt;        if (startup.hEvent2 != NULL)&lt;br /&gt;            ::CloseHandle(startup.hEvent2);&lt;br /&gt;        return FALSE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // create the thread (it may or may not start to run)&lt;br /&gt;    m_hThread = ::CreateThread(lpSecurityAttrs, nStackSize,  //REVIEW&lt;br /&gt;        (LPTHREAD_START_ROUTINE)&amp;_ThreadEntry,  &amp;startup, dwCreateFlags | CREATE_SUSPENDED, (PDWORD)&amp;m_nThreadID);&lt;br /&gt;&lt;br /&gt;    if (m_hThread == NULL)&lt;br /&gt;        return FALSE;&lt;br /&gt;&lt;br /&gt;    // start the thread just for MFC initialization&lt;br /&gt;    Verify(ResumeThread() != (DWORD)-1, _T(""));&lt;br /&gt;    Verify(::WaitForSingleObject(startup.hEvent, INFINITE) == WAIT_OBJECT_0, _T(""));&lt;br /&gt;    ::CloseHandle(startup.hEvent);&lt;br /&gt;&lt;br /&gt;    // if created suspended, suspend it until resume thread wakes it up&lt;br /&gt;    if (dwCreateFlags &amp; CREATE_SUSPENDED)&lt;br /&gt;        Verify(::SuspendThread(m_hThread) != (DWORD)-1, _T(""));&lt;br /&gt;&lt;br /&gt;    // if error during startup, shut things down&lt;br /&gt;    if (startup.bError)&lt;br /&gt;    {&lt;br /&gt;        Verify(::WaitForSingleObject(m_hThread, INFINITE) == WAIT_OBJECT_0, _T(""));&lt;br /&gt;        ::CloseHandle(m_hThread);&lt;br /&gt;        m_hThread = NULL;&lt;br /&gt;        ::CloseHandle(startup.hEvent2);&lt;br /&gt;        return FALSE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // allow thread to continue, once resumed (it may already be resumed)&lt;br /&gt;    ::SetEvent(startup.hEvent2);&lt;br /&gt;&lt;br /&gt;    return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-2464945271310273611?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/2464945271310273611/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/only-thread-cuwinthread.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2464945271310273611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/2464945271310273611'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/only-thread-cuwinthread.html' title='CuWinThread - Represents a thread of execution within an application.'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-5449052298984462019</id><published>2009-12-18T07:37:00.000-08:00</published><updated>2009-12-18T07:39:48.830-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Filter of the Internet cache - CuUrlCacheFilter</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Filter of the Internet cache&lt;br /&gt;&lt;br /&gt;string GetCacheIconFile( string &amp;strUrl )&lt;br /&gt;{&lt;br /&gt;    CuUrlCacheFilter UrlCacheFilter;&lt;br /&gt;    return UrlCacheFilter.OnGetCacheFile(".ico", strUrl.c_str());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// CuUrlCacheFilter.h&lt;br /&gt;&lt;br /&gt;class CuUrlCacheFilter&lt;br /&gt;{&lt;br /&gt;    CuUrlCacheEntry m_UrlCacheEntry;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuUrlCacheFilter(void);&lt;br /&gt;    ~CuUrlCacheFilter(void);&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    string OnGetCacheFile(LPCTSTR szFilter = TEXT(".jpg") , LPCTSTR szURL = TEXT("") ); &lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    BOOL IsFilter( LPCTSTR lpszSource, LPCTSTR lpszFilter );&lt;br /&gt;    BOOL IsFilterLocalFile( INTERNET_CACHE_ENTRY_INFO * lpEntry, LPCTSTR szFilter );&lt;br /&gt;    BOOL IsFilterURL(INTERNET_CACHE_ENTRY_INFO * lpEntry, LPCTSTR szURL);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuUrlCacheFilter.cpp&lt;br /&gt;&lt;br /&gt;CuUrlCacheFilter::CuUrlCacheFilter(void)&lt;br /&gt;{&lt;br /&gt;    m_UrlCacheEntry.ProcessEnumCacheEntry();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuUrlCacheFilter::~CuUrlCacheFilter(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;string CuUrlCacheFilter::OnGetCacheFile(LPCTSTR szFilter , LPCTSTR szURL  )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    string strResult;&lt;br /&gt;    INTERNET_CACHE_ENTRY_INFO* lpEntry = NULL;&lt;br /&gt;    for( int i = 0 ; i &amp;lt; m_UrlCacheEntry.size() ; i++ )&lt;br /&gt;    {&lt;br /&gt;        lpEntry = m_UrlCacheEntry.at(i);&lt;br /&gt;        if(  IsFilterLocalFile( lpEntry, szFilter) &amp;&amp; IsFilterURL(lpEntry, szURL) )&lt;br /&gt;        {&lt;br /&gt;            strResult = lpEntry-&amp;gt;lpszLocalFileName;&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return strResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BOOL CuUrlCacheFilter::IsFilter( LPCTSTR lpszSource, LPCTSTR lpszFilter )&lt;br /&gt;{&lt;br /&gt;    if( lpszSource == NULL )&lt;br /&gt;        return FALSE;&lt;br /&gt;&lt;br /&gt;    string strTempFile(lpszSource);&lt;br /&gt;    size_t found = strTempFile.find(lpszFilter);&lt;br /&gt;&lt;br /&gt;    return ( found != string::npos );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuUrlCacheFilter::IsFilterURL(INTERNET_CACHE_ENTRY_INFO * lpEntry, LPCTSTR szURL)&lt;br /&gt;{&lt;br /&gt;    return IsFilter(lpEntry-&amp;gt;lpszSourceUrlName , szURL);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuUrlCacheFilter::IsFilterLocalFile( INTERNET_CACHE_ENTRY_INFO * lpEntry, LPCTSTR szFilter )&lt;br /&gt;{ &lt;br /&gt;    return IsFilter(lpEntry-&amp;gt;lpszLocalFileName , szFilter);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-5449052298984462019?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/5449052298984462019/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/filter-of-cuurlcacheentry.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5449052298984462019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/5449052298984462019'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/filter-of-cuurlcacheentry.html' title='Filter of the Internet cache - CuUrlCacheFilter'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-7018842193771983234</id><published>2009-12-18T07:20:00.001-08:00</published><updated>2009-12-18T07:25:41.117-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Enumeration of the Internet cache - CuUrlCacheEntry</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Enumeration of the Internet cache.&lt;br /&gt;&lt;br /&gt;CuUrlCacheEntry UrlCacheEntry;&lt;br /&gt;UrlCacheEntry.ProcessEnumCacheEntry();&lt;br /&gt;&lt;br /&gt;INTERNET_CACHE_ENTRY_INFO* lpEntry = NULL;&lt;br /&gt;for( int i = 0 ; i &amp;lt; UrlCacheEntry.size() ; i++ )&lt;br /&gt;{&lt;br /&gt;    lpEntry = UrlCacheEntry.at(i);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// CuUrlCacheEntry.h&lt;br /&gt;&lt;br /&gt;class CuUrlCacheEntry&lt;br /&gt;{&lt;br /&gt;    HANDLE m_hEnumHandle;&lt;br /&gt;    vector&amp;lt;INTERNET_CACHE_ENTRY_INFO*&amp;gt; m_vecCacheEntryInfo;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuUrlCacheEntry(void);&lt;br /&gt;    ~CuUrlCacheEntry(void);&lt;br /&gt;&lt;br /&gt;    UINT size(){ return m_vecCacheEntryInfo.size(); };&lt;br /&gt;    INTERNET_CACHE_ENTRY_INFO* at(UINT i){ return m_vecCacheEntryInfo.at(i); };&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    void ProcessEnumCacheEntry();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    HANDLE FindFirstEntry( LPCTSTR lpszUrlSearchPattern,  LPINTERNET_CACHE_ENTRY_INFO lpFirstCacheEntryInfo, LPDWORD lpcbCacheEntryInfo );&lt;br /&gt;    BOOL FindNextEntry( LPINTERNET_CACHE_ENTRY_INFO lpNextCacheEntryInfo, LPDWORD lpcbCacheEntryInfo );&lt;br /&gt;    BOOL FindCloseUrlCache();&lt;br /&gt;&lt;br /&gt;    void Clear();&lt;br /&gt;    BOOL CacheFirstEntry();&lt;br /&gt;    BOOL CacheNextEntry();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuUrlCacheEntry.cpp&lt;br /&gt;&lt;br /&gt;CuUrlCacheEntry::CuUrlCacheEntry(void)&lt;br /&gt;:m_hEnumHandle(NULL)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuUrlCacheEntry::~CuUrlCacheEntry(void)&lt;br /&gt;{&lt;br /&gt;    FindCloseUrlCache();&lt;br /&gt;    this-&amp;gt;Clear();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuUrlCacheEntry::ProcessEnumCacheEntry()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    BOOL bResult = CacheFirstEntry();&lt;br /&gt;    if( bResult == FALSE )&lt;br /&gt;        return;&lt;br /&gt;    do &lt;br /&gt;    {&lt;br /&gt;        bResult = CacheNextEntry();&lt;br /&gt;    } while (bResult);&lt;br /&gt;&lt;br /&gt;    FindCloseUrlCache();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HANDLE CuUrlCacheEntry::FindFirstEntry( LPCTSTR lpszUrlSearchPattern,  LPINTERNET_CACHE_ENTRY_INFO lpFirstCacheEntryInfo, LPDWORD lpcbCacheEntryInfo )&lt;br /&gt;{&lt;br /&gt;    FindCloseUrlCache();&lt;br /&gt;    this-&amp;gt;Clear();&lt;br /&gt;&lt;br /&gt;    m_hEnumHandle = ::FindFirstUrlCacheEntry(lpszUrlSearchPattern, lpFirstCacheEntryInfo, lpcbCacheEntryInfo );&lt;br /&gt;    return m_hEnumHandle;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BOOL CuUrlCacheEntry::FindNextEntry( LPINTERNET_CACHE_ENTRY_INFO lpNextCacheEntryInfo, LPDWORD lpcbCacheEntryInfo )&lt;br /&gt;{&lt;br /&gt;    return ::FindNextUrlCacheEntry(m_hEnumHandle, lpNextCacheEntryInfo, lpcbCacheEntryInfo  );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BOOL CuUrlCacheEntry::FindCloseUrlCache( )&lt;br /&gt;{&lt;br /&gt;    BOOL bResult = ::FindCloseUrlCache( m_hEnumHandle );&lt;br /&gt;    m_hEnumHandle = NULL;&lt;br /&gt;    return bResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuUrlCacheEntry::Clear()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    TCHAR* szBuffer = NULL;&lt;br /&gt;    vector&amp;lt;INTERNET_CACHE_ENTRY_INFO*&amp;gt;::iterator iter;&lt;br /&gt;    for( iter = m_vecCacheEntryInfo.begin() ; iter &amp;lt; m_vecCacheEntryInfo.end() ; iter++)&lt;br /&gt;    {&lt;br /&gt;        szBuffer = (TCHAR*)(*iter);&lt;br /&gt;        delete [] szBuffer;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    m_vecCacheEntryInfo.clear();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuUrlCacheEntry::CacheFirstEntry()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    DWORD dwEntrySize = 0;&lt;br /&gt;&lt;br /&gt;    BOOL bResult = (BOOL)FindFirstEntry(NULL, NULL, &amp;dwEntrySize);&lt;br /&gt;    if( (GetLastError() == ERROR_INSUFFICIENT_BUFFER) )&lt;br /&gt;    {   &lt;br /&gt;        INTERNET_CACHE_ENTRY_INFO * lpEntry = (INTERNET_CACHE_ENTRY_INFO * )new TCHAR[dwEntrySize];&lt;br /&gt;        bResult = (BOOL)FindFirstEntry(NULL, lpEntry, &amp;dwEntrySize);&lt;br /&gt;        m_vecCacheEntryInfo.push_back(lpEntry);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return bResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuUrlCacheEntry::CacheNextEntry()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    DWORD dwEntrySize = 0;&lt;br /&gt;&lt;br /&gt;    BOOL bResult = (BOOL)FindNextEntry(NULL, &amp;dwEntrySize);&lt;br /&gt;    if( (GetLastError() == ERROR_INSUFFICIENT_BUFFER) )&lt;br /&gt;    {   &lt;br /&gt;        INTERNET_CACHE_ENTRY_INFO * lpEntry = (INTERNET_CACHE_ENTRY_INFO * )new TCHAR[dwEntrySize];&lt;br /&gt;        bResult = FindNextEntry(lpEntry, &amp;dwEntrySize);&lt;br /&gt;        m_vecCacheEntryInfo.push_back(lpEntry);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return bResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-7018842193771983234?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/7018842193771983234/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/enumeration-of-internet-cache.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7018842193771983234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/7018842193771983234'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/enumeration-of-internet-cache.html' title='Enumeration of the Internet cache - CuUrlCacheEntry'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-4692059696916298708</id><published>2009-12-18T00:46:00.000-08:00</published><updated>2010-01-04T03:37:32.160-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>CuEnvironmentString - Changing Environment Variables</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Changing Environment Variables&lt;br /&gt;&lt;br /&gt;CuEnvironmentString envString( szPath );&lt;br /&gt;string strPath(envString);&lt;br /&gt;&lt;br /&gt;// CuEnvironmentString.h&lt;br /&gt;&lt;br /&gt;class CuEnvironmentString&lt;br /&gt;{&lt;br /&gt;    string m_strString;&lt;br /&gt;public:&lt;br /&gt;    CuEnvironmentString(void);&lt;br /&gt;    CuEnvironmentString(string str);&lt;br /&gt;    ~CuEnvironmentString(void);&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    void OnDo( string &amp;str );&lt;br /&gt;    operator string() const;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    BOOL HaveEnvironmentVariable( string &amp;str );&lt;br /&gt;    string GetEnvironmentVariable( string &amp;str );&lt;br /&gt;    string ExplodeEnironmentVariable( string &amp;str, size_t ops = 0 );&lt;br /&gt;    string SubStrToIndexChar( string &amp;str, char ch, size_t pos = 0 );&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuEnvironmentString.cpp&lt;br /&gt;&lt;br /&gt;CuEnvironmentString::CuEnvironmentString(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuEnvironmentString::~CuEnvironmentString(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuEnvironmentString::CuEnvironmentString(string str)&lt;br /&gt;{&lt;br /&gt;    OnDo(str);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuEnvironmentString::OnDo( string &amp;str )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    m_strString.clear();&lt;br /&gt;    if( !HaveEnvironmentVariable(str) )&lt;br /&gt;    {&lt;br /&gt;        m_strString = str;&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    size_t pos = 0;&lt;br /&gt;    string strNotEnv;&lt;br /&gt;    string strEnv;&lt;br /&gt;    do &lt;br /&gt;    {&lt;br /&gt;        strNotEnv = SubStrToIndexChar( str, '%', pos);&lt;br /&gt;        m_strString += strNotEnv;&lt;br /&gt;        pos += strNotEnv.size() + 1;&lt;br /&gt;&lt;br /&gt;        strEnv = SubStrToIndexChar( str, '%', pos);&lt;br /&gt;        m_strString += this-&amp;gt;GetEnvironmentVariable(strEnv);&lt;br /&gt;        pos += strEnv.size() + 1;&lt;br /&gt;&lt;br /&gt;    } while ( pos &lt; str.size() );&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;string CuEnvironmentString::SubStrToIndexChar( string &amp;str, char ch, size_t pos/* = 0 */)&lt;br /&gt;{&lt;br /&gt;    string strResult;       &lt;br /&gt;    if( pos &gt; str.size() )&lt;br /&gt;        return strResult;&lt;br /&gt;&lt;br /&gt;    size_t found = str.find( '%' , pos);&lt;br /&gt;    strResult = str.substr( pos, found - pos );&lt;br /&gt;&lt;br /&gt;    return strResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;string CuEnvironmentString::GetEnvironmentVariable( string &amp;str )&lt;br /&gt;{&lt;br /&gt;    TCHAR newEnv[MAX_PATH +1];&lt;br /&gt;    DWORD res = ::GetEnvironmentVariable( str.c_str(), newEnv, MAX_PATH );&lt;br /&gt;    string strResult;&lt;br /&gt;    if( res != 0 )&lt;br /&gt;        strResult = newEnv;&lt;br /&gt;    return strResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;string CuEnvironmentString::ExplodeEnironmentVariable( string &amp;str, size_t ops /* = 0*/ )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    size_t found_first = str.find( '%' , ops );&lt;br /&gt;    size_t found_second = str.find( '%' , found_first + 1);&lt;br /&gt;&lt;br /&gt;    string strResult;&lt;br /&gt;    if( found_first != string::npos &amp;&amp; found_second != string::npos )&lt;br /&gt;        strResult = str.substr (found_first + 1, found_second - 1);&lt;br /&gt;&lt;br /&gt;    return strResult;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuEnvironmentString::HaveEnvironmentVariable( string &amp;str )&lt;br /&gt;{&lt;br /&gt;    string strResult = ExplodeEnironmentVariable(str);&lt;br /&gt;    return (!strResult.empty());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuEnvironmentString::operator string() const&lt;br /&gt;{ return string(m_strString.begin(), m_strString.end()); }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-4692059696916298708?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/4692059696916298708/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/changing-environment-variables.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4692059696916298708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/4692059696916298708'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/changing-environment-variables.html' title='CuEnvironmentString - Changing Environment Variables'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-8896891023657457438</id><published>2009-12-17T19:23:00.000-08:00</published><updated>2010-01-04T03:37:08.654-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SampleCode'/><title type='text'>ExpandEnvironmentStrings - Changing Environment Variables</title><content type='html'>&lt;pre class="brush: cpp;"&gt;// Changing Environment Variables&lt;br /&gt;int _ExpandEnvironmentStrings( LPTSTR pText )&lt;br /&gt;{&lt;br /&gt;    TCHAR* p1 = _tcschr( pText, _T('%') );&lt;br /&gt;    if( p1 == NULL )&lt;br /&gt;        return -1;&lt;br /&gt;&lt;br /&gt;    TCHAR* p2 = _tcschr( p1 +1, _T('%') );&lt;br /&gt;    if( p2 == NULL )&lt;br /&gt;        return -1;&lt;br /&gt;&lt;br /&gt;    TCHAR provi[MAX_PATH +1];&lt;br /&gt;    provi[0] = TCHAR(0);&lt;br /&gt;    TCHAR env[MAX_PATH +1];&lt;br /&gt;    p1 = pText;&lt;br /&gt;    TCHAR* d = provi;&lt;br /&gt;    while( *p1 != TCHAR(0) )&lt;br /&gt;    {&lt;br /&gt;        if( *p1 != _T('%') )&lt;br /&gt;        {&lt;br /&gt;            *d++ = *p1++;&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // find %&lt;br /&gt;        p2 = _tcschr( p1 +1, _T('%') );&lt;br /&gt;        if( p2 == NULL )&lt;br /&gt;            return -1;&lt;br /&gt;&lt;br /&gt;        lstrcpyn( env, p1 +1, int(p2 - p1) );&lt;br /&gt;        TCHAR newEnv[MAX_PATH +1];&lt;br /&gt;        DWORD res = ::GetEnvironmentVariable( env, newEnv, MAX_PATH );&lt;br /&gt;        if( res &gt; 0 )&lt;br /&gt;        {&lt;br /&gt;            lstrcpy( d, newEnv );&lt;br /&gt;            d += lstrlen( newEnv );&lt;br /&gt;        }&lt;br /&gt;        p1 = p2 +1;&lt;br /&gt;    }&lt;br /&gt;    *d = TCHAR(0);&lt;br /&gt;&lt;br /&gt;    if( lstrlen( provi ) != 0 )&lt;br /&gt;    {&lt;br /&gt;        lstrcpy( pText, provi );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-8896891023657457438?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/8896891023657457438/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/expandenvironmentstrings.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/8896891023657457438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/8896891023657457438'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/expandenvironmentstrings.html' title='ExpandEnvironmentStrings - Changing Environment Variables'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-9128985184201671118</id><published>2009-12-17T18:03:00.001-08:00</published><updated>2009-12-28T01:01:48.502-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Explode ini File -- CuIniFile</title><content type='html'>&lt;pre class="brush: cpp;"&gt;//Explode ini File&lt;br /&gt;&lt;br /&gt;CuIniFile IniFile;&lt;br /&gt;IniFile.OpenFile(szFilename);&lt;br /&gt;string strURL = IniFile.GetValue("InternetShortcut", "URL");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuIniFile.h&lt;br /&gt;&lt;br /&gt;class CuINIItem&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    string m_Key;&lt;br /&gt;    string m_Value;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class CuINIStatment&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    string m_Name;&lt;br /&gt;    vector&amp;lt;CuINIItem&amp;gt; m_vecItem;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;//  有使用分號 ';' 的那一行, 會直接將整行試為註解, 不管分號是不是在第一個字元&lt;br /&gt;class CuIniFile&lt;br /&gt;{&lt;br /&gt;    vector&amp;lt;CuINIStatment&amp;gt; m_vecStatment;&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    CuIniFile(void);&lt;br /&gt;    ~CuIniFile(void);&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    int OpenFile(LPCTSTR szFileName);&lt;br /&gt;    string GetValue( string strStatment, string strKey);&lt;br /&gt;&lt;br /&gt;    CuINIStatment *FindStatment( string strStatmentName );&lt;br /&gt;    CuINIItem *FindItem( CuINIStatment *pStatment, string strItemName );&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    string GetStatment(string &amp;str);&lt;br /&gt;    BOOL IsStatmentLine(string &amp;str);&lt;br /&gt;    BOOL IsMemoLine(string &amp;str);&lt;br /&gt;    void CreateNewStatment( string &amp;str );&lt;br /&gt;    void CreateNewItem( string &amp;str );&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// CuIniFile.cpp&lt;br /&gt;&lt;br /&gt;CuIniFile::CuIniFile(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuIniFile::~CuIniFile(void)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int CuIniFile::OpenFile(LPCTSTR szFileName)&lt;br /&gt;{&lt;br /&gt;    CuStringList StrList;&lt;br /&gt;    StrList.OpenFile(szFileName);&lt;br /&gt;&lt;br /&gt;    string strTemp;&lt;br /&gt;    for( int i = 0 ; i &amp;lt; StrList.size() ; i++ )&lt;br /&gt;    {&lt;br /&gt;        strTemp = StrList.at(i);&lt;br /&gt;        if( IsMemoLine(strTemp) )&lt;br /&gt;            continue;&lt;br /&gt;&lt;br /&gt;        if( IsStatmentLine(strTemp) )&lt;br /&gt;            CreateNewStatment(strTemp);&lt;br /&gt;        else&lt;br /&gt;            CreateNewItem(strTemp);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuINIStatment *CuIniFile::FindStatment( string strStatmentName )&lt;br /&gt;{&lt;br /&gt;    vector&amp;lt;CuINIStatment&amp;gt;::iterator iter =  m_vecStatment.begin();&lt;br /&gt;    for( ; iter &amp;lt; m_vecStatment.end(); iter++ )&lt;br /&gt;    {&lt;br /&gt;        if( (*iter).m_Name == strStatmentName ) &lt;br /&gt;            return &amp;(*iter);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CuINIItem *CuIniFile::FindItem( CuINIStatment *pStatment, string strItemName )&lt;br /&gt;{&lt;br /&gt;    vector&amp;lt;CuIniFile&amp;gt; &amp;IniItem =  pStatment-&amp;gt;m_vecItem;&lt;br /&gt;    vector&amp;lt;CuIniFile&amp;gt;::iterator iter = IniItem.begin();&lt;br /&gt;&lt;br /&gt;    for( ; iter &amp;lt; IniItem.end(); iter++ )&lt;br /&gt;    {&lt;br /&gt;        if( (*iter).m_Key == strItemName )&lt;br /&gt;            return &amp;(*iter);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;string CuIniFile::GetValue( string strStatment, string strKey)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    CuINIStatment *pStatment = FindStatment(strStatment);&lt;br /&gt;    if( pStatment == NULL )&lt;br /&gt;        return "";&lt;br /&gt;&lt;br /&gt;    CuINIItem *pItem = FindItem(pStatment , strKey);&lt;br /&gt;    if( pItem == NULL )&lt;br /&gt;        return "";&lt;br /&gt;&lt;br /&gt;    return pItem-&amp;gt;m_Value;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuIniFile::IsMemoLine(string &amp;str)&lt;br /&gt;{&lt;br /&gt;    size_t found = str.find( ';' );&lt;br /&gt;    return ( found == 0 );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;string CuIniFile::GetStatment(string &amp;str)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    size_t found_first = str.find( '[' );&lt;br /&gt;    size_t found_second = str.find( ']' , found_first);&lt;br /&gt;&lt;br /&gt;    string strStatment;&lt;br /&gt;    if( found_first != string::npos &amp;&amp; found_second != string::npos )&lt;br /&gt;        strStatment =  str.substr(found_first + 1, found_second - found_first - 1);&lt;br /&gt;&lt;br /&gt;    return strStatment;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CuIniFile::IsStatmentLine(string &amp;str)&lt;br /&gt;{&lt;br /&gt;    string strStatmentKey = GetStatment(str);&lt;br /&gt;    return (!strStatmentKey.empty());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CuIniFile::CreateNewStatment( string &amp;str )&lt;br /&gt;{&lt;br /&gt;    CuINIStatment Statment;&lt;br /&gt;    Statment.m_Name = GetStatment(str);&lt;br /&gt;    m_vecStatment.push_back(Statment);&lt;br /&gt;}   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CuIniFile::CreateNewItem( string &amp;str )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    size_t found = str.find('=');&lt;br /&gt;    if( found == string::npos )&lt;br /&gt;        return;&lt;br /&gt;&lt;br /&gt;    string strKey = str.substr(0, found);&lt;br /&gt;    string strValue = str.substr( found + 1 , str.size());&lt;br /&gt;&lt;br /&gt;    CuINIItem Item;&lt;br /&gt;    Item.m_Key = strKey;&lt;br /&gt;    Item.m_Value = strValue;&lt;br /&gt;    m_vecStatment[ m_vecStatment.size() - 1 ].m_vecItem.push_back(Item);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7195651747633003892-9128985184201671118?l=hurricanesoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hurricanesoft.blogspot.com/feeds/9128985184201671118/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/explode-ini-file.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/9128985184201671118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7195651747633003892/posts/default/9128985184201671118'/><link rel='alternate' type='text/html' href='http://hurricanesoft.blogspot.com/2009/12/explode-ini-file.html' title='Explode ini File -- CuIniFile'/><author><name>軒轅風暴</name><uri>http://www.blogger.com/profile/08043789356193042371</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7195651747633003892.post-3270452903492663002</id><published>2009-12-17T15:44:00.000-08:00</published><updated>2009-12-18T06:10:51.787-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Explode File to String List</title><content type='html'>&lt;
