• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Error

            C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

            #

            // boost_singal_solt.cpp : Defines the entry point for the console application.
            //
            #include "stdafx.h"
            #include <iostream>
            #include <string>
            #include <boost/signals2.hpp>
            class CTarget /*: public boost::signals2::trackable*/
            {
            public:
                virtual ~CTarget()
                {
                    std::cout << __FUNCTION__ << std::endl;
                }
                CTarget()
                {
                    m_strMsg = "1343rwkjdfkjdfasdklf";
                }
                void SomeHandle()
                {
                    std::cout << __FUNCTION__ << std::endl;
                    std::cout << m_strMsg << std::endl;
                }
                void SomeHandle1()
                {
                    std::cout << __FUNCTION__ << std::endl;
                }
            private:
                std::string m_strMsg;
            };
            class CSource
            {
            public:
                boost::signals2::connection Connect(const boost::signals2::signal<void(void)>::slot_type &sub)
                {
                    return m_sig.connect(sub);
                }
                void OnSig()
                {
                    m_sig();
                }
            private:
                boost::signals2::signal<void(void)> m_sig;
            };
            int _tmain(int argc, _TCHAR* argv[])
            {
                CSource source;
                boost::signals2::connection conn;
                {
                    CTarget target;
                    
                    /*conn = */source.Connect(boost::bind(&CTarget::SomeHandle, &target));
                    source.Connect(boost::bind(&CTarget::SomeHandle1, &target));
                    source.OnSig();
                }
                source.OnSig();
            return 0;
            }


            在繼承boost::signals2::trackable的情況下,Target析構(gòu)以后不會(huì)調(diào)用,但是不繼承是會(huì)調(diào)用的。也就是說(shuō),這是一個(gè)危險(xiǎn)操作,不知道內(nèi)部怎么管理的,會(huì)不會(huì)出現(xiàn)內(nèi)存泄漏?
            /////////////////////////////////////////////////////////////////////////////


            // boost_singal_solt.cpp : Defines the entry point for the console application.
            //
            #include "stdafx.h"
            #include <iostream>
            #include <string>
            #include <boost/signals2.hpp>
            class CSource
            {
            public:
                boost::signals2::connection Connect(const boost::signals2::signal<void(void)>::slot_type &sub)
                {
                    return m_sig.connect(sub);
                }
                void OnSig()
                {
                    m_sig();
                }
            private:
                boost::signals2::signal<void(void)> m_sig;
            };
            class CTarget : public boost::signals2::trackable
            {
            public:
                virtual ~CTarget()
                {
                    std::cout << __FUNCTION__ << std::endl;
                    m_con.disconnect();
                }
                CTarget()
                {
                    m_strMsg = "1343rwkjdfkjdfasdklf";
                }
                void RegisterSolts(CSource& source)
                {
                    m_con = source.Connect(boost::bind(&CTarget::SomeHandle, this));
                }
                void SomeHandle()
                {
                    std::cout << __FUNCTION__ << std::endl;
                    std::cout << m_strMsg << std::endl;
                }
                void SomeHandle1()
                {
                    std::cout << __FUNCTION__ << std::endl;
                }
            private:
                std::string m_strMsg;
                boost::signals2::connection m_con;
            };
            int _tmain(int argc, _TCHAR* argv[])
            {
                CSource source;
                boost::signals2::connection conn;
                {
                    CTarget target;
                    
                    target.RegisterSolts(source);
                    //source.OnSig();
                }
                source.OnSig();
            return 0;
            }
            確認(rèn)只要維護(hù)好connection在對(duì)象target析構(gòu)以后一定是disconnect應(yīng)該就OK沒(méi)事,,,





            ///////////////////////////////////////////


            整體上看來(lái)是這樣:
            問(wèn)題:target的成員函數(shù)和this指針打包注冊(cè)到source上以后,如果target析構(gòu),source無(wú)法感知到,可能會(huì)調(diào)用已經(jīng)成為野指針的target地址。
            解決:signals2庫(kù)的解決辦法是,用一個(gè)connection來(lái)維護(hù)打包的target成員函數(shù)和source上的signal的連接關(guān)系。target持有這個(gè)connection,當(dāng)自身析構(gòu)的時(shí)候必須調(diào)用disscontion解除這個(gè)關(guān)系。

            如果要抄襲,也是要設(shè)計(jì)一種機(jī)制,在target析構(gòu)的時(shí)候,想辦法清除它在別處注冊(cè)的函數(shù)指針。
            1.可以建立target到source的關(guān)系,target析構(gòu)以后通知source,souce清理自身保留的target相關(guān)打包函數(shù)。這種方式在使用boost bind的時(shí)候可能就有問(wèn)題了,應(yīng)為之依靠target指針去判斷bind出來(lái)的function有難度。
            2.建立關(guān)系的時(shí)候就將解除關(guān)系的函數(shù)打包到一個(gè)新的對(duì)象中,然后由target負(fù)責(zé)在自己析構(gòu)的時(shí)候去調(diào)用它。

            ?。?!如果source先于target析構(gòu),就悲劇了。但是實(shí)際情況是,如果source已經(jīng)析構(gòu)了,也無(wú)法觸發(fā)target綁定的函數(shù)了。但問(wèn)題是,target析構(gòu)的時(shí)候還是去觸發(fā)source綁定到target的解除關(guān)系的函數(shù)。悲催。但是實(shí)際測(cè)試這個(gè)問(wèn)題不存在,估計(jì)是用類(lèi)似weak_ptr的技術(shù)。
            在完全理解之前,務(wù)必保證source生命周期大于target
            // boost_singal_solt.cpp : Defines the entry point for the console application.
            //
            #include "stdafx.h"
            #include <iostream>
            #include <string>
            #include <boost/signals2.hpp>
            class CSource
            {
            public:
                boost::signals2::connection Connect(const boost::signals2::signal<void(void)>::slot_type &sub)
                {
                    return m_sig.connect(sub);
                }
                void OnSig()
                {
                    m_sig();
                }
            private:
                boost::signals2::signal<void(void)> m_sig;
            };
            class CTarget : public boost::signals2::trackable
            {
            public:
                virtual ~CTarget()
                {
                    //std::cout << __FUNCTION__ << std::endl;
                    m_con.disconnect();
                }
                CTarget()
                {
                    m_strMsg = "1343rwkjdfkjdfasdklf";
                }
                void RegisterSolts(CSource& source)
                {
                    m_con = source.Connect(boost::bind(&CTarget::SomeHandle, this));
                }
                void SomeHandle()
                {
                    std::cout << __FUNCTION__ << std::endl;
                    std::cout << m_strMsg << std::endl;
                }
                void SomeHandle1()
                {
                    std::cout << __FUNCTION__ << std::endl;
                }
            private:
                std::string m_strMsg;
                boost::signals2::connection m_con;
            };
            int _tmain(int argc, _TCHAR* argv[])
            {
                for (;;)
                {
                    CSource* pSource = new CSource;
                    boost::signals2::connection conn;
                    CTarget* pTarget = new CTarget;
                    pTarget->RegisterSolts(*pSource);
                    delete pSource;
                    delete pTarget;
                }
                //source.OnSig();
            return 0;
            }

            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            沒(méi)有完全讀明白之前,在需要7×24運(yùn)行的環(huán)境還是慎重使用。不過(guò)客戶端貌似無(wú)所謂,,,囧。
            posted @ 2014-05-30 01:09 Enic 閱讀(785) | 評(píng)論 (0)編輯 收藏

            外部lib
            add_library(baz STATIC IMPORTED) set_target_properties(baz PROPERTIES IMPORTED_LOCATION_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/libbaz.a IMPORTED_LOCATION_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/libbazd.a) add_library(bar STATIC IMPORTED) set_target_properties(bar PROPERTIES IMPORTED_LOCATION_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/libbar.a IMPORTED_LOCATION_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/libbard.a IMPORTED_LINK_INTERFACE_LIBRARIES baz) # <-- dependency is here

            注意動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)稍有區(qū)別:
             add_library(bar SHARED IMPORTED)
             set_property(TARGET bar PROPERTY IMPORTED_LOCATION c:/path/to/bar.dll)
             set_property(TARGET bar PROPERTY IMPORTED_IMPLIB c:/path/to/bar.lib)
             add_executable(myexe src1.c src2.c)
             target_link_libraries(myexe bar)


            內(nèi)部lib直接寫(xiě)target name就OK,但是必須在同一個(gè)proj下

            還有一種方式
            TARGET_LINK_LIBRARIES(skiaSampleCode 
            debug skiaCored.lib
                    optimized skiaCore.lib)



            PROJECT_SOURCE_DIR  CMAKE_CURRENT_SOURCE_DIR  CMAKE_SOURCE_DIR 注意這三者的區(qū)別
            posted @ 2014-05-15 23:40 Enic 閱讀(8356) | 評(píng)論 (0)編輯 收藏

            實(shí)際起作用的是WS_EX_TOPMOST屬性,添加這個(gè)屬性的方式有三種:
            1.在Create階段的Ex參數(shù)添加
            2.在創(chuàng)建完成后通過(guò)SetWindowLongPtr添加(SetWindowLong已經(jīng)不建議使用)。但是我用的時(shí)候發(fā)現(xiàn)加不上,好像ModifyWindowStyle這個(gè)MFC的函數(shù)可以,,,
            3.通過(guò)
            ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);添加

            ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
            //SetWindowLongPtr(m_hWnd, GWL_EXSTYLE, 
            // GetWindowLongPtr(m_hWnd, GWL_EXSTYLE) | WS_EX_TOPMOST);
            posted @ 2014-04-24 15:42 Enic 閱讀(298) | 評(píng)論 (0)編輯 收藏

            Q1:什么是 DOM?
            DOM 是 W3C(萬(wàn)維網(wǎng)聯(lián)盟)的標(biāo)準(zhǔn)。
            DOM 定義了訪問(wèn) HTML 和 XML 文檔的標(biāo)準(zhǔn):
            W3C DOM 標(biāo)準(zhǔn)被分為 3 個(gè)不同的部分:
            核心 DOM - 針對(duì)任何結(jié)構(gòu)化文檔的標(biāo)準(zhǔn)模型
            XML DOM - 針對(duì) XML 文檔的標(biāo)準(zhǔn)模型
            HTML DOM - 針對(duì) HTML 文檔的標(biāo)準(zhǔn)模型
            Q2:什么是 XML DOM?
            XML DOM 定義了所有 XML 元素的對(duì)象和屬性,以及訪問(wèn)它們的方法。
            Q3:什么是 HTML DOM?
            HTML DOM 是:
            HTML 的標(biāo)準(zhǔn)對(duì)象模型
            HTML 的標(biāo)準(zhǔn)編程接口
            HTML DOM 定義了所有 HTML 元素的對(duì)象和屬性,以及訪問(wèn)它們的方法。
            換言之,HTML DOM 是關(guān)于如何獲取、修改、添加或刪除 HTML 元素的標(biāo)準(zhǔn)。
            Q4:DOM標(biāo)準(zhǔn)與IE的html事件模型區(qū)別
            先有事件,事件是在瀏覽器內(nèi)部自動(dòng)產(chǎn)生的,當(dāng)有時(shí)間發(fā)生時(shí),html元素會(huì)向外界發(fā)出各種事件。
            DOM事件流,當(dāng)一個(gè)html元素產(chǎn)生一個(gè)事件時(shí),該事件會(huì)在元素借點(diǎn)與根節(jié)點(diǎn)之間的路徑傳播,路徑所經(jīng)過(guò)的節(jié)點(diǎn)都會(huì)收到該事件,這個(gè)傳播過(guò)程可稱(chēng)為DOM事件流。
            主流瀏覽器的事件模型:
            1)冒泡型事件
            從DOM樹(shù)型結(jié)構(gòu)上理解,就是事件由葉子結(jié)點(diǎn)沿祖先結(jié)點(diǎn)一直向上傳遞直到根結(jié)點(diǎn);從瀏覽器界面視圖HTML元素排列層次上理解就是事件由具有從屬關(guān)系的最確定的目標(biāo)元素一直傳遞到最不確定的目標(biāo)元素.
            2)捕獲型事件
            由DOM樹(shù)最頂層元素一直到最精確的元素
            3)DOM標(biāo)準(zhǔn)事件模型
            DOM標(biāo)準(zhǔn)支持捕獲型與冒泡型,可以說(shuō)是它們兩者的結(jié)合體。它可以在一個(gè)DOM元素上綁定多個(gè)事件處理器,并且在處理函數(shù)內(nèi)部,this關(guān)鍵字仍然指向被綁定的DOM元素,另外處理函數(shù)參數(shù)列表的第一個(gè)位置傳遞事件event對(duì)象。
            首先是捕獲式傳遞事件,接著是冒泡式傳遞,所以,如果一個(gè)處理函數(shù)既注冊(cè)了捕獲型事件的監(jiān)聽(tīng),又注冊(cè)冒泡型事件監(jiān)聽(tīng),那么在DOM事件模型中它就會(huì)被調(diào)用兩次。
            Q5:DOM事件響應(yīng)綁定
            1)綁定單個(gè)監(jiān)聽(tīng)
            element.attachEvent("OnClick", observer)
            element.detachEvent("OnClick", observer)
            2)綁定多個(gè)監(jiān)聽(tīng)
            element.AddEventListener("Click", observer, useCapture)
            element.RemoveEventListener("Click", observer, useCapture)
            第三個(gè)參賽是指定在冒泡節(jié)點(diǎn)還是控制階段調(diào)用
            posted @ 2014-04-18 15:44 Enic 閱讀(404) | 評(píng)論 (0)編輯 收藏

            之前一直很抗拒使用gyp等待chrominu,喜歡cmake。但是不使用chromium工具鏈去編譯,分析chromium確實(shí)非常痛苦啊,,,
            好在這幾天網(wǎng)絡(luò)環(huán)境好,成功按照http://www.chromium.org/developers/how-tos/build-instructions-windows#TOC-Building-Chromium創(chuàng)建了編譯環(huán)境。
            不多大部分細(xì)節(jié)都不知道,沒(méi)辦法的事情。最終還是要自己理解整個(gè)工程才OK啊

            gyp工具用法
            例子:tools\gyp\gyp.bat --depth . -D component=shared_library --no-circular-check -G msvs_version=2008 -Ibuild/common.gypi build_add/all.gyp
            添加參數(shù)用-D
            Building in Visual Studio
            You can use:
                set GYP_GENERATORS=msvs-ninja,ninja
            and then
                    gclient runhooks
            gclient sync --force
            Usage: gyp-script.py [options ...] [build_file ...]
            Options:
              -h, --help            show this help message and exit
              --build=CONFIGS       configuration for build after project generation
              --check               check format of gyp files
              --config-dir=CONFIG_DIR
                                    The location for configuration files like
                                    include.gypi.
              -d DEBUGMODE, --debug=DEBUGMODE
                                    turn on a debugging mode for debugging GYP.  Supported
                                    modes are "variables", "includes" and "general" or
                                    "all" for all of them.
              -D VAR=VAL            sets variable VAR to value VAL
              --depth=PATH          set DEPTH gyp variable to a relative path to PATH
              -f FORMATS, --format=FORMATS
                                    output formats to generate
              -G FLAG=VAL           sets generator flag FLAG to VAL
              --generator-output=DIR
                                    puts generated build files under DIR
              --ignore-environment  do not read options from environment variables
              -I INCLUDE, --include=INCLUDE
                                    files to include in all loaded .gyp files
              --msvs-version=MSVS_VERSION
                                    Deprecated; use -G msvs_version=MSVS_VERSION instead
              --no-circular-check   don't check for circular relationships between files
              --parallel            Use multiprocessing for speed (experimental)
              -S SUFFIX, --suffix=SUFFIX
                                    suffix to add to generated files
              --toplevel-dir=DIR    directory to use as the root of the source tree
            posted @ 2014-04-08 23:44 Enic 閱讀(343) | 評(píng)論 (0)編輯 收藏

            問(wèn)題:我在視圖畫(huà)的圖象或者文字,當(dāng)窗口改變后為什么不見(jiàn)了?OnDraw()OnPaint()兩個(gè)都是解決上面的問(wèn)題,有什么不同?

            答:OnDraw()OnPaint()好象兄弟倆,因?yàn)樗鼈兊墓ぷ黝?lèi)似。
            至于不見(jiàn)了的問(wèn)題簡(jiǎn)單,因?yàn)楫?dāng)你的窗口改變后,會(huì)產(chǎn)生無(wú)效區(qū)域,這個(gè)無(wú)效的區(qū)域需要重畫(huà)。一般Windows會(huì)發(fā)送兩個(gè)消息WM_PAINT(通知客戶區(qū) 有變化)和WM_NCPAINT(通知非客戶區(qū)有變化)。非客戶區(qū)的重畫(huà)系統(tǒng)自己搞定了,而客戶區(qū)的重畫(huà)需要我們自己來(lái)完成。這就需要OnDraw() OnPaint()來(lái)重畫(huà)窗口。

            OnDraw()
            OnPaint()有什么區(qū)別呢?首先:我們先要明確CView類(lèi)派生自CWnd類(lèi)。而OnPaint()CWnd的類(lèi)成員,同時(shí)負(fù)責(zé)響應(yīng)WM_PAINT消息。OnDraw()CVIEW的成員函數(shù),并且沒(méi)有響應(yīng)消息的功能。這就是為什么你用VC成的程序代碼時(shí),在視圖類(lèi)只有 OnDraw沒(méi)有OnPaint的原因。

            其次,要想在屏幕上繪圖或顯示圖形,首先需要建立設(shè)備環(huán)境DC。其實(shí)DC是一個(gè)數(shù)據(jù)結(jié)構(gòu),它包含輸 出設(shè)備(不單指你17寸的純屏顯示器,還包括打印機(jī)之類(lèi)的輸出設(shè)備)的繪圖屬性的描述。MFC提供了CPaintDC類(lèi)和CWindwoDC類(lèi)來(lái)實(shí)時(shí)的響 應(yīng),而CPaintDC支持重畫(huà)。

            當(dāng)視圖變得無(wú)效時(shí)(包括大小的改變,移動(dòng),被遮蓋等等),Windows WM_PAINT 消息發(fā)送給它。該視圖的 OnPaint 處理函數(shù)通過(guò)創(chuàng)建 CPaintDC 類(lèi)的DC對(duì)象來(lái)響應(yīng)該消息并調(diào)用視圖的 OnDraw 成員函數(shù)。通常我們不必編寫(xiě)重寫(xiě)的 OnPaint 處理成員函數(shù)。

            ///CView
            默認(rèn)的標(biāo)準(zhǔn)的重畫(huà)函數(shù)

            void CView::OnPaint()
            {
                CPaintDC dc(this);
                OnPreparDC(&dc);
                OnDraw(&dc); //調(diào)用了OnDraw
            }


            既然OnPaint最后也要調(diào)用OnDraw,因此我們一般會(huì)在OnDraw函數(shù)中進(jìn)行繪制。下面是一個(gè)典型的程序

            ///視圖中的繪圖代碼首先檢索指向文檔的指針,然后通過(guò)DC進(jìn)行繪圖調(diào)用。
            void CMyView::OnDraw( CDC* pDC )

                CMyDoc* pDoc = GetDocument(); 
                CString s = pDoc->GetData(); // Returns a CString
                CRect rect;
                GetClientRect( &rect ); 
                pDC->SetTextAlign( TA_BASELINE | TA_CENTER ); 
                pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );
            }

            最后:現(xiàn)在大家明白這哥倆之間的關(guān)系了吧。因此我們一般用OnPaint維護(hù)窗口的客戶區(qū)(例如我們的窗口客戶區(qū)加一個(gè)背景圖片),用OnDraw維護(hù)視圖的客戶區(qū)(例如我們通過(guò)鼠標(biāo)在視圖中畫(huà)圖)。當(dāng)然你也可以不按照上面規(guī)律來(lái),只要達(dá)到目的并且沒(méi)有問(wèn)題,怎么干都成。

            補(bǔ)充:我們還可以利用Invalidate(),ValidateRgn(),ValidateRect()函數(shù)強(qiáng)制的重畫(huà)窗口

             

            posted @ 2014-03-10 18:12 Enic 閱讀(243) | 評(píng)論 (0)編輯 收藏

            如果使用了腳本,那么最終的事件應(yīng)該是由:CCLuaEngine::executeEvent分發(fā)出去的,他應(yīng)該是利用lua的一些機(jī)制綁定了對(duì)象和處理函數(shù)。


            在腳本側(cè),用類(lèi)似:
            menuPopupItem:registerScriptHandler(menuCallbackExit)

            menuLayer:setTouchEnabled(true)
                menuLayer:registerScriptTouchHandler(onTouch)

                    layerFarm:registerScriptTouchHandler(onTouch)
                    layerFarm:setTouchEnabled(true)
            這樣的代碼來(lái)設(shè)定事件響應(yīng)處理函數(shù)


            猜測(cè)一下,當(dāng)以腳本模式運(yùn)行的時(shí)候如果事件發(fā)生了,首先檢測(cè)發(fā)生事件的對(duì)象相應(yīng)的處理腳本函數(shù)時(shí)候存在,如果存在就直接調(diào)用腳本函數(shù)
            具體的各種事件類(lèi)型,和個(gè)事件的各種參數(shù)以后在來(lái)分析吧
            posted @ 2014-03-08 20:47 Enic 閱讀(194) | 評(píng)論 (0)編輯 收藏

            int comput(int tmpn)
              int tmpc=0;
               while(tmpn>0)
               {
                 tmpc++;
                 tmpn=tmpn&(tmpn-1)
                }
              return tmpc;
            }




            x=x&(x-1)
            ==============
            以前沒(méi)有見(jiàn)過(guò)這樣的表達(dá)式,分析一下發(fā)現(xiàn)發(fā)明這個(gè)表達(dá)式的人是個(gè)高手。
            表達(dá)式的意思就是把x的二進(jìn)制表示從最低位直到遇到第一個(gè)1的比特置0。
            例如:
            e1:
            x     = 01001000
            x-1   = 01000111
            x&(x-1)=01000000
            e2:
            x     = 01001001
            x-1   = 01001000
            x&(x-1)=01001000

            位運(yùn)算里有學(xué)問(wèn)呀,
            例如眾所周知的交換算法:
            void swap(int i1, int i2)
            {
                i1 ^= i2;
                i2 ^= i1;
                i1 ^= i2;
            }
            還有,我今天看了Minix操作系統(tǒng)作者寫(xiě)的《操作系統(tǒng) 設(shè)計(jì)與實(shí)現(xiàn)》(寫(xiě)的比William Stalling的《操作系統(tǒng) 內(nèi)核與設(shè)計(jì)原理》有條理而且清晰緊湊得多,后者內(nèi)容蕪雜)中的頁(yè)面替換算法之一矩陣法,就是用位運(yùn)算實(shí)現(xiàn)的:
            假設(shè)內(nèi)存分為n頁(yè),那么高速緩存一個(gè)n x n的比特矩陣,開(kāi)始時(shí)全置0,如下(假設(shè)n=4):
              0 1 2 3
            0 0 0 0 0
            1 0 0 0 0
            2 0 0 0 0
            3 0 0 0 0
            每次內(nèi)存訪問(wèn)時(shí),如果訪問(wèn)的是i頁(yè),那么先把矩陣的第i行置1,然后把矩陣的第i列置0,這樣i行的二進(jìn)制的值越小就表示i頁(yè)最長(zhǎng)時(shí)間最近沒(méi)有被訪問(wèn)。例如假設(shè)訪問(wèn)的次序?yàn)?-2-3-1,那么該矩陣的變化過(guò)程為:
              0 1 2 3
            0 0 1 1 1    0 1 0 1    0 1 1 0    0 0 1 0
            1 0 0 0 0    0 0 0 0    0 0 0 0    1 0 1 1
            2 0 0 0 0    1 1 0 1    1 1 0 0    1 0 0 0
            3 0 0 0 0    0 0 0 0    1 1 1 0    1 0 1 0
            第三個(gè)例子是Windows GDI的二元和三元光柵操作的編碼。比較復(fù)雜,就不講了。

            x=x&(x-1); 可以用來(lái)求出x是否為2冪次方數(shù);當(dāng)&的結(jié)果為0時(shí),x原值是2冪次方數(shù),否則就不是2冪次方數(shù);
            如x=4時(shí)   4: 0000 0100
                    & 3:0000 0011
            得出結(jié)果為0 ,是2冪次方數(shù);
            x=5時(shí),  0000 0101
                     0000 0100
            得出結(jié)果為1,即非2冪次方數(shù);

            posted @ 2014-02-26 16:55 Enic 閱讀(667) | 評(píng)論 (0)編輯 收藏

            GetTextMetrics與GetTextExtent的區(qū)別
            GetTextMetrics:獲取當(dāng)前字體的信息

            GetTextExtent:獲取特定的字符串在屏幕上所占的寬度和高度

            對(duì)于這兩個(gè)函數(shù)的作用,我在編程的時(shí)候,也有一定的困惑。因此,我也想,其他人在編程的時(shí)候也肯定有 同樣的困惑。所以我把他們解釋一下。不足之處,還請(qǐng)大家多多的添加 批評(píng)~~其實(shí),我們對(duì)什么困惑呢?函數(shù)的調(diào)用方法,還是在返回值上?

            CDC::GetTextMetrics

            作用:

            返回當(dāng)強(qiáng)設(shè)備描述表中的當(dāng)前所用的字體的信息

            函數(shù)原型:

            BOOL GetTextMetrics(
               LPTEXTMETRIC lpMetrics 
            ) const;

            參數(shù): 
            lpMetrics (是一個(gè)指針)
            返回指向TEXTMETRIC 結(jié)構(gòu)的一個(gè)數(shù)據(jù)。

            返回值:
            非零值成功

            要求: 
            包含頭文件: afxwin.h




            CDC::GetTextExtent
            Call this member function to compute the width and height of a line of text using the current font to determine the dimensions.
            調(diào)用這個(gè)函數(shù),返回用當(dāng)前字體寫(xiě)下的一行字符串的高度和寬度

            函數(shù)原型:
            CSize GetTextExtent(
               LPCTSTR lpszString,
               int nCount 
            ) const;

            CSize GetTextExtent(
               const CString& str 
            ) const;

            參數(shù) 
            lpszString

            指向一個(gè)字符串指針,也可以傳遞一個(gè)字符串對(duì)象。
            nCount

            指定字符在字符串中的數(shù)目
            str

            一個(gè)字符串對(duì)象,包含指定的字符。
            返回值:

            以邏輯單位返回字符串的尺寸,保存在一個(gè)CSize對(duì)象中
            posted @ 2014-02-26 13:57 Enic 閱讀(169) | 評(píng)論 (0)編輯 收藏

            主要是這個(gè)參數(shù)起作用說(shuō): -mno-cygwin

            嘗試編譯lua的時(shí)候發(fā)現(xiàn)機(jī)器上的mingw32-xy一直傻逼:make: Interrupt/Exception caught (code = 0xc0000005, addr = 0x0x75f843f9)
            感覺(jué)上是要重新安裝一下,不過(guò)咱機(jī)器上有cygwin,,,呵呵

            CC= mingw32-gcc.exe
            CFLAGS= -mno-cygwin -O2 -Wall -DLUA_COMPAT_ALL $(SYSCFLAGS) $(MYCFLAGS)
            LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)
            LIBS= -lm $(SYSLIBS) $(MYLIBS)


            后面編譯glew的時(shí)候沒(méi)看明白自帶的make,所以就自己修改了下,,,
            mingw32-gcc -mno-cygwin -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c
            mingw32-gcc -mno-cygwin -shared -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.a -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32


            原文:
            關(guān)于ejoy2d應(yīng)該有不少人關(guān)注
            最近看到想編下看看demo,感覺(jué)編譯對(duì)于用慣ide來(lái)說(shuō)確實(shí)有些麻煩,不過(guò)嘛
            這樣也好,簡(jiǎn)單,方便,不用配置那么多東西,一個(gè)make就可以做完,如果調(diào)試呢?
            lua寫(xiě)嘛,網(wǎng)上弄個(gè)就可以了,但是如果要寫(xiě)lua導(dǎo)出函數(shù)呢?gdb吧,命令行蠻實(shí)在的。
            廢話不多少,下面編譯過(guò)程
            readme 需要
            * Install Lua 5.2.3
            * Copy lua52.dll to /usr/local/bin
            * Install glew 1.9
            * make or make mingw
            * ej2d examples/ex01.lua to test
            這個(gè)當(dāng)然是先下載需要的庫(kù)了
             glew 1.9 我這里直接用的1.10了 http://glew.sourceforge.net/
             
            由于我電腦用使用codeblock,所以直接使用他
            自帶的mingw吧
            1. 直接命令行下運(yùn)行codeblock/mingw/mingwvars.bat目錄,設(shè)置mingw運(yùn)行需要的環(huán)境
            2. 進(jìn)
            入lua-5.2.3目錄 mingw32-make mingw 編譯lua
            3. 進(jìn)入glew-1.10.0目錄
            gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c
            gcc -shared -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.a -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32
            4. 把lua-5.2.3/src/lua52.dll拷貝到CodeBlocks/MinGW/bin目錄下
                把lua-5.2.3/src/liblua.a拷貝到CodeBlocks/MinGW/lib目錄下,并改名為liblua52.a
                把lua-5.2.3/src/lua.h, lauxlib.h, luaconf.h, lualib.h 拷貝到CodeBlocks/MinGW/include目錄下
                把glew-1.10.0/lib/glew32.dll拷貝到CodeBlocks/MinGW/bin目錄下
                把glew-1.10.0/lib/libglew32.a拷貝到CodeBlocks/MinGW/lib目錄下
                把glew-1.10.0/include/GL/glew.h,glxew.h, wglew.h 拷貝到CodeBlocks/MinGW/include/GL目錄下
            5. 命令行進(jìn)入ejoy2d目錄 mingw32-make mingw 編譯ejoy2d 一些搞定
             6. 命令行輸入ej2d examples/ex01.lua這樣就可以看到窗口了.
            posted @ 2014-02-25 10:04 Enic 閱讀(1007) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共22頁(yè): First 7 8 9 10 11 12 13 14 15 Last 
            国产精品中文久久久久久久| 精品视频久久久久| 精品久久人妻av中文字幕| 久久精品黄AA片一区二区三区| 97精品依人久久久大香线蕉97| 久久人人爽爽爽人久久久| 97久久精品无码一区二区| 亚洲成人精品久久| 中文字幕亚洲综合久久菠萝蜜| 久久99热这里只有精品国产| 国产精品久久国产精麻豆99网站 | 久久综合噜噜激激的五月天| 久久91综合国产91久久精品| 久久久久亚洲精品男人的天堂| 久久久久亚洲AV片无码下载蜜桃| 国产精品99精品久久免费| 久久久久综合中文字幕| 亚洲精品美女久久777777| 93精91精品国产综合久久香蕉 | 免费久久人人爽人人爽av| 久久精品无码午夜福利理论片| 久久精品国产清自在天天线| 亚洲女久久久噜噜噜熟女| 久久av免费天堂小草播放| 热re99久久精品国99热| 久久人搡人人玩人妻精品首页| 精品少妇人妻av无码久久| 久久婷婷五月综合成人D啪| 97热久久免费频精品99| 久久久久久久91精品免费观看| 99久久中文字幕| 99久久99久久精品国产片果冻| 国产精品久久久久久久午夜片| 亚洲AV日韩精品久久久久久久| 精品久久久久久无码免费| 国产综合久久久久| 久久久久久国产精品无码下载 | 99精品国产综合久久久久五月天| 久久久精品波多野结衣| 久久青草国产精品一区| 色综合久久综合中文综合网|