• <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++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

            #

            最后我用的辦法是:SW_SHOWNORMAL  BringWindowToTop


            SetForegroundWindow
             BringWindowToTop

            SwitchToThisWindow
            typedef void (WINAPI *PROCSWITCHTOTHISWINDOW) (HWND, BOOL); 
            PROCSWITCHTOTHISWINDOW SwitchToThisWindow; 
            HMODULE hUser32 = GetModuleHandle("user32"); 
            SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32, 
            "SwitchToThisWindow"); 

            hCurWnd = ::GetForegroundWindow();
            dwMyID = ::GetCurrentThreadId();
            dwCurID = ::GetWindowThreadProcessId(hCurWnd, NULL);
            ::AttachThreadInput(dwCurID, dwMyID, TRUE);
            ::SetForegroundWindow(m_hWnd);
            ::AttachThreadInput(dwCurID, dwMyID, FALSE);


              this->ShowWindow(SW_SHOWNA);//簡單的顯示主窗口完事兒
                        this->SetActiveWindow();
                        this->SetForegroundWindow();   
                        //this->SetWindowPos(this,LOWORD(lParam),HIWORD(lParam),c.Width(),c.Height(),SWP_NOACTIVATE);
                        this->BringWindowToTop();

            SW_HIDE 隱藏窗口,激活另一窗口

            SW_MINIMIZE 最小化窗口,激活另一窗口

            SW_RESTORE 用原來的大小和位置顯示一個(gè)窗口,同時(shí)令其進(jìn)入活動狀態(tài)

            SW_SHOW 用當(dāng)前的大小和位置顯示一個(gè)窗口,同時(shí)令其進(jìn)入活動狀態(tài)

            SW_SHOWMAXIMIZED 最大化窗口,并將其激活

            SW_SHOWMINIMIZED 最小化窗口,并將其激活

            SW_SHOWMINNOACTIVE 最小化一個(gè)窗口,但不改變活動窗口

            SW_SHOWNA 用當(dāng)前的大小和位置顯示一個(gè)窗口,不改變活動窗口

            SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個(gè)窗口,同時(shí)不改變活動窗口

            SW_SHOWNORMAL 與SW_RESTORE相同

            posted @ 2014-09-25 09:52 Enic 閱讀(3347) | 評論 (0)編輯 收藏

            gcc
                    GNU   C/C++編譯器也可以正確支持wchar_t字符和字符串,但是源代碼的保存格式必須符合
            下面條件:
                    一、源代碼文件的保存編碼必須是UTF-8
                    二、UTF-8編碼格式的源代碼文件,不能有BOM標(biāo)志頭。
                    只有源代碼文件符合上面兩個(gè)條件,gcc才會正確支持wchar_t字符和字符串。如果不符合
            上面兩個(gè)條件的話,有可能會編譯出錯(cuò),有可能會產(chǎn)生錯(cuò)誤的wchar_t字符和字符串。
                    gcc在Windows平臺下,wchar_t是16位類型,在Linux平臺下,wchar_t是32位類型。
                   
                    另外,GCC提供了以下的參數(shù)開關(guān)來支持其它文字編碼的源文件:
                    (a)-finput-charset=charset
                        gcc在默認(rèn)情況下,總是假設(shè)源代碼的編碼是UTF-8,如果是其它編碼的源代碼文件,
                        源代碼里面又用到了wchar_t的類型,則可以使用-finput-charset=charset這個(gè)參數(shù)
                        來實(shí)現(xiàn)。
                        例如通常使用GBK編碼的源代碼可以假如參數(shù):-finput-charset=GBK
                     (b)-fwide-exec-charset=charset
                        默認(rèn)情況下,gcc在Windows平臺下,寬字符串串常量的每個(gè)字符是16位UTF-16類型,
                        在Linux平臺下,寬字符串串常量的每個(gè)字符是32位UTF-32類型,
                        使用這個(gè)參數(shù),可以改變寬字符串串常量的類型。
                        例如在x86的機(jī)器環(huán)境,Linux操作系統(tǒng)下,要使例如 L"漢字" 編譯后保存為UTF-16
                        的字符串,則可以使用 -fwide-exec-charset=UTF-16LE 
            posted @ 2014-09-24 16:49 Enic 閱讀(903) | 評論 (0)編輯 收藏

            rundll32.exe編輯

            本詞條缺少信息欄,補(bǔ)充相關(guān)內(nèi)容使詞條更完整,還能快速升級,趕緊來編輯吧!
            rundll32.exe用于在內(nèi)存中運(yùn)行DLL文件,它們會在應(yīng)用程序中被使用。這個(gè)程序?qū)δ阆到y(tǒng)的正常運(yùn)行是非常重要的。注意:rundl132.exe和rundll32.exe相似。但是rundl132.exe是W32.Miroot.Worm病毒。該病毒允許攻擊者訪問你的計(jì)算機(jī),竊取密碼和個(gè)人數(shù)據(jù)。對該文件的建議是立即刪除。

            顧名思義,“執(zhí)行32位的DLL文件”。它的作用是執(zhí)行DLL文件中的內(nèi)部函數(shù),這樣在進(jìn)程當(dāng)中,只會有 Rundll32.exe,而不會有DLL后門的進(jìn)程,這樣,就實(shí)現(xiàn)了進(jìn)程上的隱藏。如果看到系統(tǒng)中有多個(gè)Rundll32.exe,不必驚慌,這證明用 Rundll32.exe啟動了多少個(gè)的DLL文件。當(dāng)然,這些Rundll32.exe執(zhí)行的DLL文件是什么,我們都可以從系統(tǒng)自動加載的地方找到。
            我來介紹一下Rundll32.exe這個(gè)文件,意思上邊已經(jīng)說過,功能就是以命令行的方式調(diào)用動態(tài)鏈接程序庫。系統(tǒng)中還有一個(gè) Rundll.exe文件,他的意思是“執(zhí)行16位的DLL文件”,這里要注意一下。再來看看Rundll32.exe使用的函數(shù)原型[1] 
            Void CALLBACK FunctionName (HWND hwnd,HINSTANCE hinst,LPTSTR lpCmdLine,Int nCmdShow);
            其命令行下的使用方法為:Rundll32.exe DLLname,Functionname [Arguments]
            DLLname為需要執(zhí)行的DLL文件名;Functionname為前邊需要執(zhí)行的DLL文件的具體引出函數(shù);[Arguments]為引出函數(shù)的具體參數(shù)。
            posted @ 2014-08-27 09:42 Enic 閱讀(628) | 評論 (0)編輯 收藏

            set _NT_SYMBOL_PATH = symsrv*D:\win_Symbols*http://msdl.microsoft.com/download/symbols

            gflags -i GameManager.exe +
            gflags-i GameManager.exe +
            7152 GameManager.exe   DUIPlazaWnd
            umdh -p:7152 -f:1.txt
            umdh -p:7152 -f:2.txt
            UMDH -d 1.txt 2.txt >> 1-2.txt


            gflags /i GameManager.exe +ust 
            umdh -p:7152 -f:1.txt
            umdh -p:7152 -f:2.txt
            UMDH -d 1.txt 2.txt >> 1-2.txt
            posted @ 2014-08-26 19:05 Enic 閱讀(154) | 評論 (0)編輯 收藏

            setlocale(LC_ALL, "");

            很大一快知識點(diǎn),暫時(shí)不想做深入研究
            http://www.360doc.com/content/12/1202/22/3398926_251650422.shtml
            posted @ 2014-08-08 11:33 Enic 閱讀(283) | 評論 (0)編輯 收藏

            客戶端架構(gòu)設(shè)計(jì)的簡單總結(jié)
            原文連接:http://www.shnenglu.com/weiym/archive/2014/07/26/207819.html
            我們知道,客戶端是相對服務(wù)端而言的,客戶端程序相對普通應(yīng)用程序,主要是增加了網(wǎng)絡(luò)通訊功能。在這個(gè)移動和云存儲的年代,大部分終端應(yīng)用程序都有網(wǎng)絡(luò)通訊功能, 所以都可以稱為客戶端。常見的客戶端如瀏覽器,IM客戶端, 網(wǎng)絡(luò)會議客戶端,郵件客戶端,微博和微信客戶端等...

            通過觀察,我們會發(fā)現(xiàn)所有的客戶端基本是大同小異,都會包括一些相同的功能組件, 下面簡單例舉下:
            通訊協(xié)議層

            既然客戶端都有網(wǎng)絡(luò)功能,就會涉及到通訊方式和數(shù)據(jù)格式以及協(xié)議, 這三者不是完全獨(dú)立,而是有機(jī)統(tǒng)一的。

            首先說通訊方式,常見的通訊方式包括TCP,UDP, P2P和http(s), 很多時(shí)候我們不會用單一的通訊方式,而是多種通訊方式的結(jié)合。比如說TCP端口被封,走不通時(shí),我們會轉(zhuǎn)成嘗試http(s)。IM中聊天文本走的是TCP, 由服務(wù)器轉(zhuǎn)發(fā),但是2個(gè)客戶端之間的文件傳輸我們可能走的又是P2P了, 多個(gè)人之間的語音聊天, 我們走的又是UDP了。

            其次說數(shù)據(jù)格式,常見的數(shù)據(jù)格式包括二進(jìn)制編碼,開源序列化協(xié)議和文本格式。
            二進(jìn)制一般是自定義的私有格式,通常對數(shù)值,我們會轉(zhuǎn)成大頭端,對字符串我們會用UTF8 編碼,因?yàn)闆]有冗余數(shù)據(jù),它的優(yōu)點(diǎn)是不會浪費(fèi)帶寬;主要缺點(diǎn)是有硬編碼的味道,不好擴(kuò)充。
            開源序列化協(xié)議這里主要是指google的protocal buffer,  現(xiàn)在很多公司都在用, 很多人基于它開發(fā)了自己的RPC框架。主要優(yōu)點(diǎn)是數(shù)據(jù)小,使用簡單而高效。
            文本格式主要是指xml和json. 相對來說xml比較清晰和容易擴(kuò)充,但是冗余數(shù)據(jù)比較多。json借助javascript對它語言層次的支持,感覺主要是前端人員使用的比較多。

            最后再說協(xié)議,  協(xié)議和我們的應(yīng)用相關(guān)聯(lián)。比如郵件客戶端,當(dāng)然是走SMTP和POP3了; IM客戶端的話,一般走XMPP了;  網(wǎng)絡(luò)會議的話,可以走ITU的T.120協(xié)議, 也可以RFC 6501定義的XCON, 信令走SIP, 數(shù)據(jù)走RTP等。

            通信協(xié)議層是整個(gè)客戶端網(wǎng)絡(luò)事件驅(qū)動的引擎,它可能會比較簡單,也可能會很復(fù)雜。如果是基于XMPP的IM, 它可能會比較簡單,因?yàn)榛旧现恍枰粚游谋緟f(xié)議的封包和解包就可以了。 當(dāng)如果是基于T.120網(wǎng)絡(luò)會議客戶端,就會比較復(fù)雜,它數(shù)據(jù)包走的自定義的二機(jī)制格式,按照T.120協(xié)議的建議, 在通訊協(xié)議層又分了3層:TP, MCS和GCC。TP層主要封裝數(shù)據(jù)傳輸?shù)姆绞? 可以讓上層無差別的區(qū)分TCP和http(s)。 MCS層主要提供多點(diǎn)傳輸功能, 它抽象出通道(channel)這個(gè)概念, 讓不同session的數(shù)據(jù)進(jìn)行邏輯隔離, 上層用戶可以同時(shí)加入不同的通道來進(jìn)行一對一和一對多的數(shù)據(jù)收發(fā),并且通道中的數(shù)據(jù)有不同的優(yōu)先級, 還有令牌這個(gè)機(jī)制。我們也可以在MCS層對數(shù)據(jù)進(jìn)行加密和壓縮, 還可以對上層的大數(shù)據(jù)包進(jìn)行切包等。 GCC層主要封裝會議的最基本邏輯,比如創(chuàng)建會議和加入session數(shù)據(jù)包的格式封裝等, 讓上層可以通過API調(diào)用而不用關(guān)心協(xié)議要求的數(shù)據(jù)包格式。不同的數(shù)據(jù)包會工作在不同的層次, 比如心跳包可能在底層TP層就被攔截了,它不要再往上層發(fā),因?yàn)樯厦娌挥藐P(guān)心這個(gè); 而有些數(shù)據(jù)包,則需要從底層往上層按照整個(gè)協(xié)議棧層層轉(zhuǎn)發(fā),當(dāng)然每層都會剝離掉自己的協(xié)議頭, 直至上層用戶數(shù)據(jù)到達(dá)它的最終用戶。

            總之,通訊協(xié)議層封裝了客戶端和服務(wù)端的通訊方式及協(xié)議格式, 讓上層用戶不用關(guān)心底層的通信機(jī)制, 而只關(guān)注應(yīng)用的接口事件。理論上我們可以在上層應(yīng)用不做大調(diào)整的前提下,直接將網(wǎng)絡(luò)會議客戶端中的T.120協(xié)議成基于SIP的XCON。
            功能組件

            一個(gè)客戶端程序通常是由很多功能模塊組成,模塊按功能來說可以分為基礎(chǔ)組件和應(yīng)用組件。

            基礎(chǔ)組件為應(yīng)用組件提供的基礎(chǔ)設(shè)施,基礎(chǔ)組件是可以在不同的項(xiàng)目中重復(fù)使用的(比如界面控件庫,2D渲染引擎Skia, 跨平臺的網(wǎng)絡(luò)和線程庫等)。 
            應(yīng)用組件通常和我們當(dāng)前的特定應(yīng)用程序相關(guān),比如我們的網(wǎng)絡(luò)會議客戶端包含的桌面共享模塊, 文檔共享模塊,視頻音頻模塊,文本聊天模塊等。

            應(yīng)用模塊本身分為帶界面和無界面兩種情況, 帶界面的情況下我們通常會給組件提供一個(gè)容器窗口的句柄, 讓組件自己在內(nèi)部組織自己的界面。這種帶界面的組件通常會為邏輯和界面的分離帶來麻煩,在Window上實(shí)現(xiàn)一些半透明和動畫效果也很難。 比如我們想提供跨平臺的SDK來封裝邏輯,這時(shí)我們會更傾向讓應(yīng)用組件采用無界面的模式,組件在跨平臺層只封裝邏輯和提供數(shù)據(jù), 而把數(shù)據(jù)發(fā)到最上層界面層后再統(tǒng)一處理。

            對功能組件我們的設(shè)計(jì)原則是盡量保持獨(dú)立和可復(fù)用,最好能以仿COM方式動態(tài)升級而不用重新編譯, 另外組件之間要保持層次性,避免雙向或是循環(huán)依賴。
            數(shù)據(jù)存儲

            客戶端本身是處理和收發(fā)網(wǎng)絡(luò)數(shù)據(jù), 這里就涉及到對這些數(shù)據(jù)如何組織和存儲的問題。這個(gè)通常會根據(jù)客戶端的類型采用不同的處處理方式:
            對于永久存儲的數(shù)據(jù),當(dāng)然是保存成文件或是存入數(shù)據(jù)庫,文件如xml, 數(shù)據(jù)庫如ACCESS,  SQL server, mysql等。
            臨時(shí)數(shù)據(jù)當(dāng)然是存入內(nèi)存了,根據(jù)需要采用不同的數(shù)據(jù)結(jié)構(gòu), 組織格式如array,list, map, hashmap等。
            還有一種是常見的數(shù)據(jù)保存方式是內(nèi)存數(shù)據(jù)庫,最常見是SQLite了, 內(nèi)存數(shù)據(jù)庫既能高效的分類保存大量數(shù)據(jù), 又可以直接用基于SQL語句進(jìn)行查詢和處理, 比如foxmail客戶端就是用SQLite存儲的郵件信息。
            還有一種是跨進(jìn)程共享的數(shù)據(jù),我們一般當(dāng)然是內(nèi)存映射文件了。比如我們有一個(gè)實(shí)時(shí)顯示log的工具, 我們通常會在對方應(yīng)用程序里分配共享內(nèi)存的內(nèi)存映射文件,所有的log都寫到里面,然后在log工具程序里讀取和顯示。
            當(dāng)然還有一些數(shù)據(jù)可能存到網(wǎng)上去的, 常見的比如我們的云筆記, 這時(shí)數(shù)據(jù)分服務(wù)端數(shù)據(jù)和本地cache。

            對于數(shù)據(jù)存儲我們的設(shè)計(jì)原則是根據(jù)需要,選擇簡單高效的方式。比如我們在設(shè)計(jì)網(wǎng)絡(luò)會議客戶端時(shí)曾討論要不要引入SQLite, 理想情況是引入內(nèi)存數(shù)據(jù)庫后各個(gè)組件和上層應(yīng)用的數(shù)據(jù)都可以統(tǒng)一存儲,采用數(shù)據(jù)驅(qū)動的方式,可以很方便的跟蹤整個(gè)客戶端的運(yùn)行情況。但后來發(fā)現(xiàn)這種設(shè)計(jì)會把本來各自獨(dú)立的組件通過數(shù)據(jù)庫耦合在了一起,而且各組件的數(shù)據(jù)格式本身都很不要一樣, 很難統(tǒng)一存儲, 另外很多數(shù)據(jù)實(shí)際也只是臨時(shí)數(shù)據(jù), 沒必要把簡單的時(shí)間做復(fù)雜了。
            客戶端框架

            客戶端框架一般有兩個(gè)作用:一是把所有的功能組件組織起來,進(jìn)行統(tǒng)一的管理和展現(xiàn); 二是實(shí)現(xiàn)整個(gè)客戶端的主界面。客戶端框架在協(xié)調(diào)各個(gè)組件時(shí), 要注意避免讓組件之間產(chǎn)生雙向依賴, 而是應(yīng)該讓組件把事件通知給框架后由框架統(tǒng)一協(xié)調(diào)和處理, 所以客戶端框架通常是整個(gè)客戶端邏輯最復(fù)雜的部分。 一個(gè)好的客戶端框架,通常會采用插件方式設(shè)計(jì),可以動態(tài)插拔需要的組件。最好是可以根據(jù)服務(wù)端的配置, 動態(tài)下載和更新所需要的插件。

            對于客戶端框架, 我們的設(shè)計(jì)原則是低耦合和可擴(kuò)展。基本上所有下層組件的改動都會影響到我們的客戶端框架,客戶的很多新需求和新組件也會導(dǎo)致框架產(chǎn)生壞味道, 這里我們設(shè)計(jì)時(shí)就要考慮如何讓客戶端框架能及時(shí)的適應(yīng)這些變化。
            界面庫

            客戶端肯定會有界面,在Windows平臺上,現(xiàn)在的界面大致分為以下幾類:
            基于Windows原始窗口控件句柄的C++ native 客戶端, 基于.net的winform客戶端,基于.net的WPF客戶端,基于C++的DirectUI客戶端, 以嵌入瀏覽器(如webkit)方式實(shí)現(xiàn)的客戶端, 還有一類是基于Xaml的Metro客戶端。

            對于企業(yè)級大型安裝應(yīng)用,主要考慮的是開發(fā)效率,所以客戶端還是以.net為主; 但是對于互聯(lián)網(wǎng)企業(yè), 更多的是要求客戶端精簡而高效, 所以還是以C++為主。 這里就設(shè)及到C++的兩種界面庫, 一種是基于windows窗口句柄和控件自繪機(jī)制的界面庫,還有一中是基于DirectUI的界面庫, 現(xiàn)在大一點(diǎn)的公司基本上都有自己的DirectUI界面庫。基于修改Webkit方式實(shí)現(xiàn)的界面庫可以通過Canvas和SVG動畫等方式實(shí)現(xiàn)一些很炫的效果, 但是它和標(biāo)準(zhǔn)程序的用戶體驗(yàn)還是有一定差距:一來web實(shí)現(xiàn)的控件跟Windows標(biāo)準(zhǔn)控件有很大不同, 二來web的流式布局和應(yīng)用程序的網(wǎng)格布局也不一樣。

            對于界面,個(gè)人覺得這個(gè)東西變化實(shí)在太快了,所以我覺得應(yīng)該盡量用界面和邏輯相分離的方式組織代碼。
            總結(jié)

            對于客戶端架構(gòu)設(shè)計(jì),個(gè)人覺得最大的原則就分層設(shè)計(jì), 每層都封裝一個(gè)概念并保持獨(dú)立, 同時(shí)根據(jù)依賴倒置的原則, 站在上層客戶的角度提供接口。軟件工程里面的一條黃金定律:“任何問題都可以通過增加一個(gè)間接層來解決。
            posted @ 2014-07-30 18:41 Enic 閱讀(207) | 評論 (0)編輯 收藏

            http://www.cmake.org/Bug/view.php?id=13774
            http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=89595d6b
            http://www.cmake.org/cmake/help/v2.8.10/cmake.html#variable:CMAKE_VS_PLATFORM_TOOLSET
            cmake ../ -G"Visual Studio 11" -Tv110_xp
            cmake-gui貌似還不知道怎么直接生成,這是CMAKE_VS_PLATFORM_TOOLSET貌似沒用,但是可以先用命令行生成,然后在用gui修改其他變量?
            posted @ 2014-06-27 14:12 Enic 閱讀(1564) | 評論 (1)編輯 收藏

            這樣完全只要關(guān)系邏輯了,別的都秒殺,只是代碼出錯(cuò)了,多半要用肉眼看,,,
            再有就是用luabind class的細(xì)節(jié),還不了解
            CTestClass =
            {
            m_TestVal = 0,
            m_funcTest = nul
            }
            function CTestClass:SetValue(v)
            self.m_TestVal = v;
            end
            function CTestClass:TestShow()
            print(self.m_TestVal);
            end
            function CTestClass:SetTestFunc(func)
            self.m_funcTest = func;
            end
            function CTestClass:CallTestFunc()
            self.m_funcTest();
            end
            function CTestClass:TestHandleFunc(msg)
            print(msg)
            end
            t1 = CTestClass;
            t1:SetValue(123321);
            t1:TestShow();
            t1:SetTestFunc(
            function ()
            t1:TestHandleFunc('TestHandleFunc')
            end);
            t1:CallTestFunc();
            posted @ 2014-06-26 10:58 Enic 閱讀(313) | 評論 (2)編輯 收藏

            參考了:cegui 魔獸世界  迅雷  mygui
            主要問題如下:
            Q1: 控件的屬性是放到xml節(jié)點(diǎn)的屬性中,還是作為子節(jié)點(diǎn)。放到屬性中方便,但是xml太長,人眼看的時(shí)候費(fèi)勁,子節(jié)點(diǎn)會好很多。
            Q2: 控件之間的父子關(guān)系是直接用xml的節(jié)點(diǎn)父子關(guān)系來表達(dá),還是和魔獸世界一樣允許parent="UIParent",這樣設(shè)置。我可能還需要“include”其他xml中定義的控件?
            直接xml父子節(jié)點(diǎn):優(yōu)勢是關(guān)系簡單明了,缺陷是UI復(fù)雜以后堆積的xml文件太長,人眼也無法看明白了
            魔獸世界:他們的做法可以分離每個(gè)控件出來,但是層次關(guān)系又不明朗了。
            允許類似<Window></InsertControlByName name="ChirdControl" type="Type"></Window>這樣的特殊節(jié)點(diǎn),平衡兩者有優(yōu)劣勢。但是名字空間還是需要非常留意的點(diǎn)。
            另外可以支持<ExportControls></Window name="ExportWnd"></ExportControls>,<InportControls></InportControl name="Import" type="Type" ImportFile="xxx.xml"><InportControls>
            type屬性不必要,但是加上以后可以讓xml自校驗(yàn)?zāi)芰Ω鼜?qiáng)

            解決名字沖突還是沒什么辦法。但是庫必須提供名字無關(guān)的控件消息綁定手段!允許全局重復(fù)名字的控件




            <GUILayout version="4" >
                <Window type="Generic/Image" name="GameOverRoot" >
                    <Property name="Area" value="{{0,0},{0,0},{1,0},{1,0}}" />
                    <Property name="Image" value="HUDDemo/Filler" />
                    <Property name="MaxSize" value="{{1,0},{1,0}}" />
                    <Property name="AlwaysOnTop" value="True" />
                    <Property name="ImageColours" value="tl:88888888 tr:88888888 bl:88888888 br:88888888" />
                    <Window type="Generic/Image" name="GameOverImage" >
                        <Property name="Area" value="{{0,0},{0.119444,0},{0,0},{0.519444,0}}" />
                        <Property name="MaxSize" value="{{1,0},{1,0}}" />
                        <Property name="AspectMode" value="Expand" />
                        <Property name="AspectRatio" value="1.923" />
                        <Property name="HorizontalAlignment" value="Centre" />
                    </Window>
                    <Window type="Generic/ImageButton" name="ButtonRestart" >
                        <Property name="Area" value="{{0,0},{0.597222,0},{0.153906,0},{0.661111,0}}" />
                        <Property name="HoverImage" value="HUDDemo/ButtonNormal" />
                        <Property name="NormalImage" value="HUDDemo/ButtonNormal" />
                        <Property name="PushedImage" value="HUDDemo/ButtonPressed" />
                        <Property name="DisabledImage" value="HUDDemo/ButtonNormal" />
                        <Property name="HorizontalAlignment" value="Centre" />
                        <Window type="Generic/Label" name="LabelRestart" >
                            <Property name="Area" value="{{0,0},{0.152778,0},{1,0},{1,0}}" />
                            <Property name="Font" value="GreatVibes-22" />
                            <Property name="Text" value="Restart" />
                            <Property name="MaxSize" value="{{1,0},{1,0}}" />
                            <Property name="NormalTextColour" value="FFFFFFFF" />
                            <Property name="DisabledTextColour" value="FFFFFFFF" />
                            <Property name="MousePassThroughEnabled" value="True" />
                        </Window>
                    </Window>
                </Window>
            </GUILayout>



            <Framename="EnterLeaveTest" parent="UIParent">

                         <Size x="100" y="100" />

                         <Anchors>

                                <Anchor point="CENTER"relativePoint="CENTER" relativeTo="UIParent" />

                         </Anchors>

                         <Layers>

                                <Layer level="BACKGROUND">

                                       <Texture name="$parentIcon"file="Interface\Icons\Spell_ShadowWordPain" setAllPoints="true"/>

                                </Layer>

                         </Layers>

                         <Scripts>

                                <OnEnter>

                                       ChatFrame1:AddMessage("++ 進(jìn)入窗體:" .. self:GetName())

                                </OnEnter>

                                <OnLeave>

                                       ChatFrame1:AddMessage("-- 離開窗體:" .. self:GetName())

                                </OnLeave>

                         </Scripts>

                  </Frame>






            <xlue>
            <control class="BoltFox.MainMenu.Item">
            <attr_def>
            <attr name="SubMenuTemplate" type="string"/>
            <attr name="Text" type="string"/>
            </attr_def>
            <method_def>
            <SetContainer file="MainMenu.xml.lua" func="MainMenu_Item_SetContainer"/>
            <PopupSubMenu file="MainMenu.xml.lua" func="MainMenu_Item_PopupSubMenu"/>
            <DestroySubMenu file="MainMenu.xml.lua" func="MainMenu_Item_DestroySubMenu"/>
            <SetEntered file="MainMenu.xml.lua" func="MainMenu_Item_SetEntered"/>
            <SetText file="MainMenu.xml.lua" func="MainMenu_Item_SetText"/>
            <GetText file="MainMenu.xml.lua" func="MainMenu_Item_GetText"/>
            </method_def>
            <event_def>
            <OnSelected />
            </event_def>
            <objtemplate>
            <children>
            <obj id="root" class="LayoutObject">
            <attr>
            <left>0</left>
            <top>0</top>
            <width>father.width</width>
            <height>father.height</height>
            </attr>
            <children>
            <obj id="hoverBkg" class="FillObject">
            <attr>
            <left>0</left>
            <top>0</top>
            <width>father.width</width>
            <height>father.height</height>
            <visible>false</visible>
            <filltype>singlecolor</filltype>
            <srccolor>235,0,0,155</srccolor>
            </attr>
            <children>
            <obj id="tosub" class="ImageObject">
            <attr>
            <left>10</left>
            <top>4</top>
            <width>father.width - 10</width>
            <height>5</height>
            <visible>false</visible>
            <image>bitmap.right.triangle</image>
            </attr>
            </obj>
            <obj id="text" class="TextObject">
            <attr>
            <left>10</left>
            <top>3</top>
            <width>father.width - 15</width>
            <height>father.height - 6</height>
            </attr>
            </obj>
            </children>
            </obj>
            </children>
            </obj>
            </children>
            <eventlist>
            <event name="OnMouseEnter" file="MainMenu.xml.lua" func="MainMenu_Item_OnMouseEnter"/>
            <event name="OnMouseLeave" file="MainMenu.xml.lua" func="MainMenu_Item_OnMouseLeave"/>
            <event name="OnLButtonDown" file="MainMenu.xml.lua" func="MainMenu_Item_OnLButtonDown"/>
            <event name="OnInitControl" file="MainMenu.xml.lua" func="MainMenu_Item_OnInitControl"/>
            </eventlist>
            </objtemplate>
            </control>



            <?xml version="1.0" encoding="UTF-8"?>
            <MyGUI type="Layout" version="3.2.0">
                <Widget type="Window" skin="WindowC" position="20 20 170 135" layer="Info" name="Root">
                    <Property key="Snap" value="true"/>
                    <UserString key="ButtonSkin" value="Button"/>
                    <Widget type="ImageBox" skin="ImageBox" position="5 5 50 50" name="Icon">
                        <Property key="ImageResource" value="MessageBoxIcon"/>
                        <Property key="ImageGroup" value="Icons"/>
                    </Widget>
                    <Widget type="TextBox" skin="TextBox" position="60 5 92 50" align="Stretch" name="Text">
                        <Property key="TextAlign" value="Left VCenter"/>
                    </Widget>
                    <Widget type="Widget" skin="PanelEmpty" position="20 60 120 26" align="HStretch Bottom" name="ButtonPlace">
                        <Widget type="Button" skin="Button" position="10 0 100 26" name="ButtonTemplate"/>
                    </Widget>
                </Widget>
            </MyGUI>
            posted @ 2014-06-24 11:45 Enic 閱讀(353) | 評論 (0)編輯 收藏

            目前覺得比較好的做法,C++寫具體控件效果,lua處理事件響應(yīng)
            <EventList>
                <Event Name="OnCreate" File="LogonWnd.xml.lua" Func="MSG_OnCreate"/>
            </EventList>

            function MSG_OnCreate(self)
            i = 0
            print(self)
            end

            self為事件源注冊到lua中的類型事例。

            迅雷界面庫中還有另一種做法:

            function OnInit()

            local owner = self:GetOwner()

                          local objFactory = XLGetObject("Xunlei.UIEngine.ObjectFactory")
                          local newIcon = objFactory:CreateUIObject("icon2","ImageObject")
                          local xarManager = XLGetObject("Xunlei.UIEngine.XARManager")
                          newIcon:SetResProvider(xarManager)
                          newIcon:SetObjPos(45,165,45+70,165+70)
                          newIcon:SetResID("app.icon2")
                          local function onClickIcon()
                               XLMessageBox("Don't touch me!")
                          end
                          newIcon:AttachListener("OnLButtonDown",true,onClickIcon)
                          self:AddChild(newIcon)
            end

            直接在lua層處理事件,貌似更舒服了。但是所引用的函數(shù)不能是上層C的,也不能有self參數(shù)了,否則內(nèi)存管理又是一大害處。
            這里的AttachListener應(yīng)該和上層的Wnd類或者對應(yīng)的派發(fā)消息的CPP里邊的《EventList》關(guān)聯(lián),貌似這樣能動態(tài)添加消息處理器,而且不用擔(dān)心對象生命周期管理。


            觀摩了一下迅雷的sdk給的粒子,發(fā)現(xiàn)他們可能修改了虛擬機(jī),發(fā)現(xiàn)在不同的文件中會有相同的函數(shù),而且都是全局的,聯(lián)想到前面配置的時(shí)候要給定一個(gè)文件名和一個(gè)函數(shù)名,要么就傻逼的每次調(diào)用前都要loadfile一次,不然很可能修改lua虛擬機(jī),或者lua api支持按文件索引。

            問題:cpp向lua派發(fā)事件的時(shí)候函數(shù)名,名字沖突。迅雷的做法是文件名+函數(shù)名索引,但是目前我的技術(shù)積累做不到。
            解決辦法:
            1.靠自己約定,即自己確保所有l(wèi)ua文件中都沒有相同的函數(shù)
            2.參考魔獸世界,然后加點(diǎn)佐料的做法:<scripts file="LogonWnd.lua" />  <Event EventName="BtnClick" EventSink="LogonWnd.BtnClick">
            也就是默認(rèn)每個(gè)文件名中的所有函數(shù)都在以文件名為名字控件的作用域下

            posted @ 2014-06-19 11:56 Enic 閱讀(399) | 評論 (0)編輯 收藏

            僅列出標(biāo)題
            共22頁: First 6 7 8 9 10 11 12 13 14 Last 
            国产ww久久久久久久久久| 久久国产精品二国产精品| 久久久久国产一级毛片高清板| 日韩精品无码久久久久久| 久久亚洲精品国产精品婷婷| 国内精品免费久久影院| 国产精品九九久久精品女同亚洲欧美日韩综合区| 无码日韩人妻精品久久蜜桃| 7777久久久国产精品消防器材| 久久91精品国产91| 久久精品国产清自在天天线| 国产亚洲美女精品久久久2020| 国产偷久久久精品专区| 久久久久99这里有精品10| 久久久久久国产a免费观看黄色大片 | 狠狠色丁香婷婷久久综合五月| 久久丝袜精品中文字幕| 亚洲伊人久久成综合人影院| 久久久这里有精品| 无码人妻久久一区二区三区免费| 人妻久久久一区二区三区| 国产情侣久久久久aⅴ免费| 91精品国产9l久久久久| 91精品国产91热久久久久福利 | 亚洲午夜精品久久久久久app| 久久亚洲AV无码西西人体| 四虎国产精品成人免费久久| 伊人久久精品无码二区麻豆| 精品国产91久久久久久久| 99久久免费国产精精品| 亚洲综合婷婷久久| 久久99这里只有精品国产| 欧洲精品久久久av无码电影| 久久九九青青国产精品| 午夜视频久久久久一区| 久久夜色精品国产噜噜亚洲AV| 国产精品久久久久久久午夜片| 亚洲国产视频久久| 久久综合九色综合97_久久久| 久久久久国产视频电影| 人妻精品久久无码区|