青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-90  評(píng)論-947  文章-0  trackbacks-0

事情的緣起是,耐不住寂寞,準(zhǔn)備開始造GUI的輪子。

GUI框架,要做的事情我想大概是這么幾步:

  1. 實(shí)現(xiàn)回調(diào)函數(shù)的成員化。
  2. 實(shí)現(xiàn)方便程度可接受的消息映射。
  3. 確定上述核心部件的使用方式。
  4. 制造大量的控件。

前三步要走的比較小心,第四步是體力勞動(dòng)。

第一步,Windows下可參考的是MFC方式、WTL方式,以及利用Window相關(guān)屬性中的某些空位。前不久剛初步看過(guò)WTL的機(jī)制,雖然當(dāng)時(shí)沒寫GUI框架的打算,不過(guò)也有點(diǎn)技術(shù)準(zhǔn)備的意思了。現(xiàn)學(xué)現(xiàn)用吧。這里一個(gè)可以預(yù)見的問題是64位兼容,現(xiàn)在沒有測(cè)試環(huán)境,先不管。

接下來(lái)看第二步了,所要做的事情就是把 WndProc 下的 一堆 case 有效地組織起來(lái),或者換個(gè)寫法。之前還真不知道 MFC/WTL 的 BEGIN_MSG_MAP。以為很高深的,想不到就是拼裝成一個(gè)大的 WndProc。先抄了,做成一個(gè)可運(yùn)行的版本。但是,這方面會(huì)直接決定以后的大部分使用方式,單單抄一下意義不大。后來(lái)去 @OwnWaterloo 曾推薦過(guò)的 @cexer 的博客上逛了幾圈,第一圈看了一些描述性文字,第二圈大概看了下技術(shù),第三圈是挖墳,那個(gè)傳說(shuō)中的 cppblog 第一高樓啊。。其中有一個(gè)使用方式很新穎,嗯……是那個(gè)不需要手動(dòng)寫映射代碼,直接實(shí)現(xiàn)消息處理函數(shù)的方式。不過(guò)我后來(lái)覺得還是不要這種樣子了,憑我個(gè)人的直覺,如果我寫下這樣的處理函數(shù),我大概會(huì)因?yàn)椴恢篮螘r(shí)注冊(cè)了這個(gè)函數(shù)而找不到調(diào)用來(lái)源而感到郁悶。在Windows回調(diào)機(jī)制的影響下,我可能會(huì)很抱有偏見地認(rèn)為,只有直接來(lái)自WndProc的調(diào)用,才算是來(lái)源明確的,不需要繼續(xù)追蹤的——當(dāng)然,這是建立在我不熟悉這個(gè)框架的基礎(chǔ)上的。框架必然需要隱藏調(diào)用來(lái)源,以及其他一些細(xì)節(jié),但是在這一步,我覺得稍微有點(diǎn)早。

剛才說(shuō)到的都是靜態(tài)綁定。現(xiàn)在我有點(diǎn)傾向于動(dòng)態(tài)綁定。從使用方便程度上來(lái)看,動(dòng)態(tài)綁定更具靈活性。從性能上,動(dòng)態(tài)綁定下,消息到處理函數(shù)的查找過(guò)程可以更快,靜態(tài)綁定只能遍歷。當(dāng)然,未必將“添加處理函數(shù)”這樣的接口提供給最終用戶,但是這個(gè)操作對(duì)于整個(gè)控件體系的形成應(yīng)該蠻有幫助的吧。比如MFC下一個(gè)控件類使用Message Map做了一些事情,繼承類就無(wú)法直接繼承這個(gè)動(dòng)作,于是可能需要做兩套處理函數(shù)調(diào)用機(jī)制,一套是給內(nèi)部繼承用的,一套是給用戶的。如果在最開始的基類保存一個(gè)消息映射,每個(gè)消息對(duì)應(yīng)一族處理函數(shù),每個(gè)繼承類都可以添加處理函數(shù),但不刪除父類已添加的函數(shù),這樣就可以在一套Message Map機(jī)制下獲得父類的行為。以上,不知道考慮得對(duì)不對(duì),歡迎討論。

其中,父類保存子類給出的可調(diào)用體并正確執(zhí)行是個(gè)問題。折騰了一些時(shí)間,都沒有成功。我比較糾結(jié),想知道除了用function之類的玩意兒外還有沒有其他簡(jiǎn)單可行的辦法。后來(lái)去@zblc的群上問,@vczh也說(shuō)需要一套function機(jī)制。看來(lái)是逃不開這個(gè)問題了。嗯……想起來(lái)大約兩個(gè)月前一個(gè)同事從codeproject找來(lái)了一個(gè)GUI框架看,看到幾行整整齊齊的 AddMsgHandler(WM_CREATE, XXX(this, &MyWindow::OnCreate));,嘆不已。我當(dāng)時(shí)打趣說(shuō),這很簡(jiǎn)單的,無(wú)非是搞了個(gè) function 而已,哥哥兩天就能搞定。于是他們叫我兩天搞定。我鼓搗了10分鐘,搞不定,只好丟一句,真的很簡(jiǎn)單的,類似boost::function,你去看一下就知道了,哥哥要干活了。

既然現(xiàn)在還是繞不開這個(gè)問題,那還是搞一下了,搞好以后就權(quán)且當(dāng)做給他們交作業(yè)吧。我會(huì)另寫一篇文章說(shuō)說(shuō)function的事情,這里先略過(guò)。現(xiàn)在開始假設(shè)這個(gè)設(shè)施已經(jīng)造好了。那么,窗口類中大概可以這么定義相關(guān)類型:

typedef Function<bool (WPARAM, LPARAM)> MsgHandler;
typedef List<MsgHandler> MsgHandlerList;
typedef Map<UINT, MsgHandlerList> MsgMap;

然后再定義一個(gè)變量:

MsgMap  m_MsgMap;

它用于保存消息映射。最終的回調(diào)函數(shù)可以寫成:

LRESULT WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    bool bHandled = false;

    MsgMap::Iterator itMsgMap = m_MsgMap.Find(uMsg);

    if (itMsgMap != m_MsgMap.End())
    {
        for (MsgHandlerList::Iterator it = itMsgMap->Value.Begin();
             !bHandled && it != itMsgMap->Value.End(); ++it)
        {
            bHandled = (*it)(wParam, lParam);
        }
    }

    return bHandled ? TRUE : DefWindowProc(m_hWnd, uMsg, wParam, lParam);
}

最后給個(gè)添加消息映射的接口:

void AppendMsgHandler(UINT uMsg, MsgHandler pMsgHandler)
{
    m_MsgMap[uMsg].PushBack(pMsgHandler);
}

到目前為止,我們的窗口類大致上可以寫成這樣:

#include <Windows.h>
#include <tchar.h>
#include "../GUIFramework/xlWindowBase.h"

class Window : public xl::WindowBase
{
public:
    Window()
    {
        AppendMsgHandler(WM_ERASEBKGND, MsgHandler(this, &Window::OnEraseBackground));
        AppendMsgHandler(WM_PAINT,      MsgHandler(this, &Window::OnPaint));
        AppendMsgHandler(WM_LBUTTONUP,  MsgHandler(this, &Window::OnLButtonUp));
        AppendMsgHandler(WM_RBUTTONUP,  MsgHandler(this, &Window::OnRButtonUp));
        AppendMsgHandler(WM_DESTROY,    MsgHandler(this, &Window::OnDestroy));
    }

protected:
    bool OnEraseBackground(WPARAM wParam, LPARAM lParam)
    {
        return false;
    }

    bool OnPaint(WPARAM wParam, LPARAM lParam)
    {
        PAINTSTRUCT ps = {};
        BeginPaint(m_hWnd, &ps);

        RECT rect = { 200, 200, 400, 400 };
        DrawText(ps.hdc, _T("Hello, world!"), -1, &rect, DT_CENTER | DT_VCENTER);

        EndPaint(m_hWnd, &ps);
        return false;
    }

    bool OnLButtonUp(WPARAM wParam, LPARAM lParam)
    {
        MessageBox(m_hWnd, _T("LButtonUp"), _T("Message"), MB_OK | MB_ICONINFORMATION);
        return false;
    }

    bool OnRButtonUp(WPARAM wParam, LPARAM lParam)
    {
        MessageBox(m_hWnd, _T("RButtonUp"), _T("Message"), MB_OK | MB_ICONINFORMATION);
        return false;
    }

    bool OnDestroy(WPARAM wParam, LPARAM lParam)
    {
        PostQuitMessage(0);
        return false;
    }
};

在最基礎(chǔ)的 WindowBase 里,搞成這樣大概差不是很多了。暫時(shí)先看第三步。到目前為止,我所聽說(shuō)過(guò)的 GUI 框架都是真正的框架,似乎沒有“GUI 庫(kù)”。為什么一定要以繼承某個(gè)基類的方式來(lái)使用呢?如果像下面這樣使用呢?

class Window
{
private:
    xl::WindowBase m_WindowBase;

public:
    Window()
    {
        m_WindowBase.AppendMsgHandler(WM_ERASEBKGND, MsgHandler(this, &Window::OnEraseBackground));
        m_WindowBase.AppendMsgHandler(WM_PAINT,      MsgHandler(this, &Window::OnPaint));
        m_WindowBase.AppendMsgHandler(WM_LBUTTONUP,  MsgHandler(this, &Window::OnLButtonUp));
        m_WindowBase.AppendMsgHandler(WM_RBUTTONUP,  MsgHandler(this, &Window::OnRButtonUp));
        m_WindowBase.AppendMsgHandler(WM_DESTROY,    MsgHandler(this, &Window::OnDestroy));
    }
};

這個(gè)問題,不知道各位有沒有什么思考?

還有一個(gè)問題是,接下去要不要將 WPARAM 和 LPARAM 的含義徹底解析掉,搞成一系列 PaintParam、EraseBackgroundParam、LButtonUpParam、RButtonUpParam,DestroyParam,讓使用的時(shí)候與原始消息參數(shù)徹底隔離呢?

最后一步,雖說(shuō)是體力活,但這跟最終的應(yīng)用場(chǎng)合密切相關(guān),需要提供怎么樣的功能是一件需要考量的事。

目前走在第二步,所以下面的兩個(gè)問題思考得不多。求經(jīng)驗(yàn),求意見。

posted on 2011-01-16 20:05 溪流 閱讀(4228) 評(píng)論(11)  編輯 收藏 引用 所屬分類: C++Windows

評(píng)論:
# re: 也談?wù)凣UI框架 2011-01-17 01:06 | 飯中淹
這個(gè)GUI框架挺好的
我是保留WPARAM和LPARAM
不過(guò)一些常用的消息,做進(jìn)了內(nèi)部邏輯了。比如onpaint這種,在這個(gè)內(nèi)部邏輯里,PARAM就被轉(zhuǎn)換成真實(shí)的變量了,比如HDC這樣的。

另外,我直接用VS的DIALOG編輯器,編輯成無(wú)窗口模式,然后用一個(gè)FORM套住這個(gè)無(wú)窗口模式的DIALOG,就間接實(shí)現(xiàn)了界面的所見即所得編輯。

用法,無(wú)所謂。可用就行。
  回復(fù)  更多評(píng)論
  
# re: 也談?wù)凣UI框架 2011-01-17 09:54 | right
覺得QT的sigslot用起來(lái)最舒服  回復(fù)  更多評(píng)論
  
# re: 也談?wù)凣UI框架 2011-01-17 11:59 | abeng
對(duì)GUI框架了解不多,不過(guò)如果能把QT跟DirectUI結(jié)合起來(lái)就完美了。  回復(fù)  更多評(píng)論
  
# re: 也談?wù)凣UI框架 2011-01-26 00:29 | 欲三更
按照我暫時(shí)的體會(huì),我倒覺得GUI框架的難點(diǎn)不在你說(shuō)的這幾個(gè)點(diǎn)上。我說(shuō)說(shuō)我的體會(huì):

首先,基本庫(kù)的選型。基本的容器和算法可以使用stl,但是stl有個(gè)問題就是他是模板庫(kù),可能會(huì)遇到版本和內(nèi)存問題,而且stl的string類不太好用,至少在多種編碼方式共存的情況下不太好用,我的解決方法是自己寫一個(gè)string類,內(nèi)部使用ucs-2,支持比較常用的編碼轉(zhuǎn)換,不常用的那些可以引入iconv。string用自己會(huì)帶來(lái)附加問題,就是一些基于字符串的功能要自己寫,比如常用的xml封裝等等,可以自己實(shí)現(xiàn)夠用的就行,也可以找支持多種編碼的庫(kù)來(lái)集成。

然后是GUI API的封裝,最常用的比如win21和Xwindows,這個(gè)其實(shí)也不好做,主要是要制定一套合理的接口和錯(cuò)誤碼機(jī)制,這個(gè)要對(duì)幾種系統(tǒng)的功能覆蓋面和特點(diǎn)有全面的了解,以我現(xiàn)在的水平還不太行。而且這部分很繁雜。

再然后是類層次的設(shè)計(jì),這個(gè)我們可以參考比較經(jīng)典的實(shí)現(xiàn),比如MFC或者QT。我個(gè)人比較喜歡的是borland的VCL,思想樸實(shí)但是絕對(duì)夠用。這里面比較復(fù)雜的部分是我覺得是:首先控件主要分兩種,一種是帶窗口id(win上師句柄)的,另一種是不帶id的,完全自己封裝的“偽控件”,這兩種結(jié)合在一起統(tǒng)一管理,不太好做。其次這一步如果不合理,那可擴(kuò)展性就會(huì)變得不好。

接下來(lái)就是偽控件的實(shí)現(xiàn),這個(gè)部分要實(shí)現(xiàn)的很多,要仿照原生控件實(shí)現(xiàn)z-order的管理,消息傳遞等等,要思考得很清楚才行。

再下來(lái)是渲染,我個(gè)人傾向于完全自己渲染,大部分人不同意,但是我覺的這樣更好實(shí)現(xiàn)界面的統(tǒng)一。如果自己渲染的話,首先得懂一點(diǎn)美工或者認(rèn)識(shí)一個(gè)洞美工的給你把把關(guān),不能太難看,其次分塊渲染這部分本來(lái)就不太好做,可以使用gdi+,但是跨平臺(tái)的話就得用一些開源庫(kù)比如agg。那你還得封裝一層,這個(gè)確實(shí)是工作量的問題。

下面的問題我和你的觀點(diǎn)倒是一樣的,就是回調(diào)函數(shù)的問題。這是個(gè)大問題,首先要實(shí)現(xiàn)回調(diào)函數(shù)成員化,這個(gè)不難,屬于小技巧吧,可能高手實(shí)現(xiàn)的話效率會(huì)好一點(diǎn)。但是回調(diào)函數(shù)和多線程結(jié)合起來(lái),怎么做一個(gè)比較好的實(shí)現(xiàn)還是不容易,我是做了一個(gè)qt機(jī)制的簡(jiǎn)化版,勉強(qiáng)能用吧,但是我覺得不太好。而且這里還有一個(gè)問題就是如果你的框架被用來(lái)寫模塊,主程序不是你的,怎么辦?比如我用你的框架寫了一個(gè)ActiveX,怎么搞。所以這個(gè)回調(diào)機(jī)制得是應(yīng)單線程,同步,異步,以及沒有消息隊(duì)列的情況。我覺得高手來(lái)做的話這部分會(huì)很精彩,比如qt。

最后就是附帶性的問題了,比如怎么支持皮膚,怎么支持RAD開發(fā),是不是要支持外掛腳本。這些工作量絕對(duì)不小于核心功能的工作量。還有你說(shuō)的大量空間,別的就不說(shuō)了光一個(gè)彩色多字號(hào)的文本編輯器,就要用去不少時(shí)間了。

以上是我的想法,有點(diǎn)啰嗦,歡迎批評(píng)^_^  回復(fù)  更多評(píng)論
  
# re: 也談?wù)凣UI框架 2011-01-26 01:40 | 欲三更
順便說(shuō)一句,你要是想如你所說(shuō)把兩個(gè)param的解析徹底封裝起來(lái),你這個(gè)MsgMap的模式可能要改。因?yàn)闉榱朔奖闶褂茫瑢?duì)于不同消息可能要有一些特殊的處理步驟,而且你自己可能還要塞一些自己的消息進(jìn)去,你可能得多封裝一層  回復(fù)  更多評(píng)論
  
# re: 也談?wù)凣UI框架 2011-02-15 14:48 | 小龍紅
@欲三更
ls分析得相當(dāng)明了,做GUI框架工作就在與此吧。至于偽控件問題,我也建議盡量用這個(gè)實(shí)現(xiàn),因?yàn)檫@樣就不需要windows的窗體資源,而且可以完全自己實(shí)現(xiàn)管理,統(tǒng)一資源管理。  回復(fù)  更多評(píng)論
  
# re: 也談?wù)凣UI框架 2011-02-16 00:38 | 溪流
@欲三更
謝謝你的分享~
控件工作量確實(shí)很多啊,標(biāo)準(zhǔn)的,自己的,才做了一個(gè)半~突然又有點(diǎn)不想解析 WPARAM LPARAM 了。。。  回復(fù)  更多評(píng)論
  
# re: 也談?wù)凣UI框架 2011-02-16 00:40 | 溪流
@abeng
@小龍紅
你們倆都有DirectUI傾向。。。就是因?yàn)椴幌胍猈indows來(lái)管理嗎?想了解下,Windows管理方式的那些方面值得我們拋棄它?  回復(fù)  更多評(píng)論
  
# re: 也談?wù)凣UI框架 2011-02-28 13:19 | zdhsoft
如果你了解一下VCL,估計(jì)會(huì)有新的收獲。  回復(fù)  更多評(píng)論
  
# re: 也談?wù)凣UI框架 2011-02-28 23:10 | 溪流
@zdhsoft
謝謝推薦,抽空一定看看  回復(fù)  更多評(píng)論
  
# re: 也談?wù)凣UI框架 2011-05-26 13:46 | 放屁阿狗
cpp的很多深入級(jí)的技術(shù)也琢磨了有一段時(shí)間,但最終還是要做項(xiàng)目,python成了我的首選,webservice,ice,gui native 全部使用python,前端的就用pyqt和flex來(lái)解決  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲日本免费电影| 欧美连裤袜在线视频| 一区在线视频| 亚洲国产精品999| 国产一区二区三区丝袜 | 久久精品二区亚洲w码| 欧美揉bbbbb揉bbbbb| 亚洲免费人成在线视频观看| 亚洲综合社区| 国产欧美在线播放| 亚洲一区二区三区视频播放| 一本色道久久综合精品竹菊| 一区二区三区视频观看| 国产日产欧美a一级在线| 欧美日本中文字幕| 免费在线成人av| 麻豆91精品91久久久的内涵| 国产精品老牛| 午夜精品福利一区二区蜜股av| 一本一本久久a久久精品综合妖精| 亚洲国产高清自拍| 久久久久久久一区二区三区| 久久精品综合网| 国产精品视频一二三| 亚洲一区在线直播| 亚洲专区在线| 久久精品国产亚洲精品| 亚洲欧美另类在线观看| 亚洲精品国产视频| av成人动漫| 亚洲一区二区在线免费观看视频 | 亚洲国产欧美在线人成| 亚洲一级片在线观看| 亚洲国产精品一区二区第一页| 亚洲第一二三四五区| 国产精品久久久久三级| 欧美成人激情视频| 鲁大师成人一区二区三区| 久久在精品线影院精品国产| 欧美激情按摩| 午夜精品成人在线| 亚洲丰满在线| 亚洲精品一品区二品区三品区| 国产精品99久久不卡二区| 欧美在线视频观看| 欧美不卡在线视频| 伊人久久成人| 日韩一区二区精品葵司在线| 日韩视频一区二区三区| 日韩小视频在线观看| 亚洲香蕉视频| 久久成人资源| 久久婷婷成人综合色| 另类图片国产| 正在播放亚洲一区| 久久影视精品| 久久精品国产精品亚洲综合| 亚洲欧洲综合另类| 亚洲人体1000| 黄色日韩精品| 亚洲一区在线免费| 欧美xart系列高清| 国产偷国产偷亚洲高清97cao | 亚洲三级电影全部在线观看高清| 日韩视频永久免费观看| 亚洲欧美一级二级三级| 欧美成人网在线| 曰韩精品一区二区| 久久九九国产| 亚洲色图综合久久| 老牛影视一区二区三区| 亚洲国产99精品国自产| 久久精品1区| 亚洲一区欧美激情| 欧美日韩系列| 亚洲精品久久久久久一区二区 | 亚洲影院高清在线| 女人色偷偷aa久久天堂| 亚洲欧美日韩精品| 欧美激情在线观看| 亚洲精品久久嫩草网站秘色| 欧美在线日韩在线| 午夜精品av| 久久影院午夜论| 精品99一区二区三区| 在线精品国产成人综合| 巨胸喷奶水www久久久免费动漫| 亚洲国产欧美一区二区三区久久| 免费黄网站欧美| 亚洲国产第一| 亚洲高清视频一区| 欧美激情bt| 欧美jizz19hd性欧美| 国产综合久久久久久| 欧美在线一二三区| 欧美自拍偷拍| 欧美大片专区| 久久xxxx| 在线免费观看一区二区三区| 欧美高清视频一区二区| 欧美夫妇交换俱乐部在线观看| 欧美一区二区视频97| 亚洲黄色免费电影| 另类综合日韩欧美亚洲| 久久久福利视频| 国产精品日韩精品| 精品成人a区在线观看| 午夜精品福利在线| 亚洲一区激情| 激情丁香综合| 亚洲国产日韩一区| 日韩一级黄色av| 欧美亚洲三区| 久久亚洲美女| 模特精品在线| 国产精品卡一卡二| 欧美午夜久久| 免费亚洲电影在线| 久久资源av| 国产精品国产精品| 久久综合五月| 欧美日产在线观看| 久久精品一区二区三区不卡牛牛| 午夜精品久久久久久久男人的天堂| 在线成人av| 亚洲人精品午夜| 国产欧美日韩精品丝袜高跟鞋| 久久九九久精品国产免费直播| 欧美激情久久久久| 国产精品久久久久久久久久尿 | 一区二区三区四区在线| 美女日韩在线中文字幕| 亚洲在线成人精品| 女生裸体视频一区二区三区 | 在线看视频不卡| 一区二区三区www| 亚洲人成人一区二区在线观看 | 鲁鲁狠狠狠7777一区二区| 亚洲一二区在线| 99在线精品免费视频九九视| 国语对白精品一区二区| 欧美一区二区三区视频在线| 欧美大片在线观看| 欧美日韩免费高清一区色橹橹| 久久视频一区| 久久精品亚洲一区| 午夜欧美视频| 欧美午夜精品久久久久久超碰| 欧美成人国产一区二区| 国产精品爽黄69| 99日韩精品| 在线亚洲一区| 欧美日本高清一区| 91久久线看在观草草青青| 久久大逼视频| 在线观看日韩| 久久成人免费电影| 久久精品欧美日韩| 国产日韩精品久久| 午夜伦理片一区| 久久精品国产2020观看福利| 国产精品一二三| 亚洲午夜精品在线| 欧美午夜大胆人体| 一本大道久久a久久综合婷婷 | 嫩草成人www欧美| 狠狠干综合网| 久久精品亚洲乱码伦伦中文| 久久嫩草精品久久久久| 国产精品一区二区在线| 午夜精品一区二区三区四区 | 欧美一区二区成人6969| 国产乱子伦一区二区三区国色天香| 亚洲日韩视频| 欧美91大片| 国产日本精品| 亚洲一区二区综合| 亚洲欧美日韩一区在线观看| 国产精品sss| 午夜精品久久久久久久久| 亚洲欧美综合另类中字| 国产午夜精品一区二区三区视频 | 开心色5月久久精品| 在线精品视频一区二区| 亚洲第一区中文99精品| 精品电影在线观看| 亚洲一本大道在线| 久久人人97超碰国产公开结果| 国产精品久久久久9999吃药| 亚洲天堂av高清| 亚洲高清资源| 久久综合国产精品| 久久久久久综合网天天| 国产日韩在线视频| 性欧美长视频| 国产一区二区福利| 亚洲曰本av电影| 韩日视频一区| 欧美理论在线| 亚洲欧美日韩国产一区|