MFC六大技術(shù)之MFC程序的初始化

分享源自:http://blog.csdn.net/liyi268/article/details/297875

MFC程序的初始化過程

簡單的MFC窗口程序

設(shè)計一個簡單完整MFC程序,產(chǎn)生一個窗口。當(dāng)然這不能讓AppWizard自動為我們生成崖堤。我們可以在Win32 Application工程下面那樣寫:

#include <afxwin.h>   
class MyApp : public CWinApp  
 {   
 public:   
     BOOL InitInstance()  //②程序入點  
     {     
          CFrameWnd *Frame=new CFrameWnd();//構(gòu)造框架     
          m_pMainWnd=Frame; //將m_pMainWnd設(shè)定為Frame;     
          Frame->Create(NULL,"最簡單的窗口");//建立框架     
          Frame->ShowWindow(SW_SHOW);  //顯示框架     
          return true;         //返回    
     }   
};   
MyApp theApp;  //①建立應(yīng)用程序沪编。  

設(shè)定鏈接MFC庫,運行找颓,即可看見一個窗口。

從上面,大家可以看到建立一個MFC窗口很容易奈泪,只用兩步:一是從CWinApp派生一個應(yīng)用程序類(這里是MyApp),然后建立應(yīng)用程序?qū)ο螅╰heApp)灸芳,就可以產(chǎn)生一個自己需要的窗口(即需要什么樣就在InitInstance()里創(chuàng)建就行了)涝桅。

整個程序,就改寫一個InitInstance()函數(shù)烙样,創(chuàng)建那么一個對象(theApp)冯遂,就是一個完整的窗口程序。這就是“黑盒”操作的魔力谒获!

在我們正想為微軟鼓掌的時候蛤肌,我們突然覺得心里空蕩蕩的,我們想知道微軟幫我們做了什么事情究反,而我們想編自己的程序時又需要做什么事情寻定,哪怕在上面幾行的程序里面,我們還有不清楚的地方精耐,比如狼速,干嘛有一個m_pMainWnd指針變量,它從哪里來卦停,又要到哪里去呢向胡?想一想在DOS下編程是多么美妙的一件事呵恼蓬,我們需要什么變量,就聲明什么變量僵芹,需要什么樣的函數(shù)处硬,就編寫什么樣的函數(shù),或者引用函數(shù)庫……但是現(xiàn)在我們怎么辦拇派?

我們可以逆向思維一下荷辕,MFC要達到這種效果,它是怎么做的呢件豌?首先我們要弄明白疮方,VC++不是一種語言,它就象我們學(xué)c語言的時候的一個類似記事本的編輯器(請原諒我的不貼切的比喻)茧彤,所以骡显,在VC里面我們用的是C++語言編程,C++才是根本(初學(xué)者總是以為VC是一門什么新的什么語言曾掂,一門比C++先進很多的復(fù)雜語言惫谤,汗)。說了那么多珠洗,我想用一句簡單的話概括“MFC黑箱’溜歪,就是為我們的程序加入一些固化的‘C++代碼’的東西”。

既然MFC黑箱幫我們加入了代碼险污,那么大家想想它會幫我們加入什么樣的代碼呢痹愚?他會幫我們加入求解一元二次方程的代碼嗎?當(dāng)然不會,所以它加入的實際上是每次編寫窗口程序必須的,通用的代碼硼控。

再往下想,什么才是通用的呢动壤?我們每次視窗編程都要寫WinMain()函數(shù),都要有注冊窗口淮逻,產(chǎn)生窗口琼懊,消息循環(huán),回調(diào)函數(shù)……即然每次都要的東西爬早,就讓它們從我們眼前消失哼丈,讓MFC幫忙寫入!

手動模擬MFC程序的初始化

要知道MFC初始化過程筛严,大家當(dāng)然可以跟蹤執(zhí)行程序醉旦。但這種跟蹤很麻煩,我相信大家都會跟蹤的暈頭轉(zhuǎn)向。本人覺得哪怕你理解了MFC代碼车胡,也很容易讓人找不著北檬输,我們完全不懂的時候,在成千上萬行程序的迷宮中如何能找到出口匈棘?

我們要換一種方法丧慈,不如就來重新編寫個MFC庫吧,嘩主卫!大家不要笑逃默,小心你的大牙,我不是瘋子(雖然瘋子也說自己不瘋)队秩。我們要寫的就是最簡單的MFC類庫笑旺,就是把MFC宏觀上的,理論上的東西寫出來馍资。我們要用最簡化的代碼,簡化到剛好能運行关噪。

1鸟蟹、需要“重寫”的MFC庫

既然,我們這一節(jié)寫的是MFC程序的初始化過程使兔,上面我們還有了一個可執(zhí)行的MFC程序建钥。程序中只是用了兩個MFC類,一個是CWinApp虐沥,另一個是CFrameWnd熊经。當(dāng)然,還有很多同樣重要MFC類如視圖類欲险,文檔類等等镐依。但在上面的程序可以不用到,所以暫時省去了它(總之是為了簡單)天试。

好槐壳,現(xiàn)在開始寫MFC類庫吧……唉,面前又有一個大難題喜每,就是讓大家背一下MFC層次結(jié)構(gòu)圖务唐。天,那張魚網(wǎng)怎么記得住带兜,但既然我們要理解他枫笛,總得知道它是從那里派生出來的吧。

考慮到大家都很辛苦刚照,那我們看一下上面兩個類的父子關(guān)系(箭頭代表派生):

       CObject->CCmdTarget->CWinThread->CWinApp->自己的重寫了InitInstance()的應(yīng)用程序類刑巧。
       CObject(同上)->CCmdTarget(同上)->CWnd->CFrameWnd

看到層次關(guān)系圖之后,終于可以開始寫MFC類庫了。按照上面層次結(jié)構(gòu)海诲,我們可以寫以下六個類(為了直觀繁莹,省去了構(gòu)造函數(shù)和析構(gòu)函數(shù))。

/////////////////////////////////////////////////////////   
class CObiect{};//MFC類的基類特幔。   
class CCmdTarget : public CObject{};   
------------------------------------------------   
class CWinThread : public CCmdTarget{};   
class CWinApp : public CWinThread{};   
------------------------------------------------   
class CWnd : public CCmdTarget{};  
class CFrameWnd : public CWnd{};   
/////////////////////////////////////////////////////////

大家再想一下咨演,在上面的類里面,應(yīng)該有什么蚯斯?大家馬上會想到薄风,CWinApp類或者它的基類CCmdTarget里面應(yīng)該有一個虛函數(shù)virtual BOOL InitInstance(),是的拍嵌,因為那里是程序的入口點遭赂,初始化程序的地方,那自然少不了的横辆∑菜可能有些朋友會說,反正InitInstance()在派生類中一定要重載狈蚤,我不在CCmdTarget或CWinApp類里定義困肩,留待CWinApp的派生類去增加這個函數(shù)可不可以。扯到這個問題可能有點越說越遠脆侮,但我想信C++的朋友對虛函數(shù)應(yīng)該是沒有太多的問題的锌畸。總的來說靖避,作為程序員如果清楚知道基類的某個函數(shù)要被派生類用到潭枣,那定義為虛函數(shù)要方便很多。

也有很多朋友問幻捏,C++為什么不自動把基類的所有函數(shù)定義為虛函數(shù)呢盆犁,這樣可以省了很多麻煩,這樣所有函數(shù)都遵照派生類有定義的函數(shù)就調(diào)用派生類的粘咖,沒定義的就調(diào)用基類的蚣抗,不用寫virtual的麻煩多好!其實瓮下,很多面向?qū)ο蟮恼Z言都這樣做了翰铡。但定義一個虛函數(shù)要生成一個虛函數(shù)表,要占用系統(tǒng)空間讽坏,虛函數(shù)越多锭魔,表就越大,有時得不償失路呜!這里哆嗦幾句迷捧,是因為往后要說明的消息映射中大家更加會體驗到這一點织咧,好了,就此打往漠秋。

上面我們自己解決了一個問題笙蒙,就是在CCmdTarge寫一個virtual BOOL InitInstance()。

2庆锦、WinMain()函數(shù)和CWinApp類

大家再往下想捅位,我們還要我們MFC“隱藏”更多的東西:WinMain()函數(shù),設(shè)計窗口類搂抒,窗口注冊艇搀,消息循環(huán),回調(diào)函數(shù)……我們馬上想到封裝想封裝他們求晶。大家似乎隱約地感覺到封裝WinMain()不容易焰雕,覺得WinMain()是一個特殊的函數(shù),許多時候它代表了一個程序的起始和終結(jié)芳杏。所以在以前寫程序的時候矩屁,我們寫程序習(xí)慣從WinMain()的左大括寫起,到右大括弧返回爵赵、結(jié)束程序档插。

我們換一個角度去想,有什么東西可以拿到WinMain()外面去做亚再,許多初學(xué)者們,總覺得WinMain()函數(shù)是天大的函數(shù)晨抡,什么函數(shù)都好象要在它里面才能真正運行氛悬。其實這樣了解很片面,甚至錯誤耘柱。我們可以寫一個這樣的C++程序:

////////////////////////////////////////////////////  
#include <iostream.h>   
class test
{   
public:    
      test()
      {
            cout<<"請改變你對main()函數(shù)的看法如捅!"<<endl;
      }   
};  
test test1;   
/**************************/  
void main(){}  
 ////////////////////////////////////////////////////  

在上面的程序里,入口的main()函數(shù)表面上什么也不做调煎,但程序執(zhí)行了(注:實際入口函數(shù)做了一些我們可以不了解的事情)镜遣,并輸出了一句話(注:全局對象比main()首先運行)。現(xiàn)在大家可以知道我們的WinMain()函數(shù)可以什么都不做士袄,程序依然可以運行悲关,但沒有這個入口函數(shù)程序會報錯。

那么WinMain()函數(shù)會放哪個類上面呢娄柳,請看下面程序:

#include <afxwin.h>
class MyApp : public CWinApp   
{   
public:    
      BOOL InitInstance()  //②程序入點    
      {     
            AfxMessageBox("程序依然可以運行寓辱!");     
            return true;   
      }   
};     
MyApp theApp;  //①建立應(yīng)用程序。  

大家可以看到赤拒,我并沒有構(gòu)造框架秫筏,而程序卻可以運行了——彈出一個對話框(如果沒有WinMain()函數(shù)程序會報錯)诱鞠。上面我這樣寫還是為了直觀起見,其實我們只要寫兩行程序:

#include <afxwin.h>       
CWinApp theApp;     //整個程序只構(gòu)造一個CWinApp類對象这敬,程序就可以運行航夺!

所以說,只要我們構(gòu)造了CWinApp對象崔涂,就可以執(zhí)行WinMain()函數(shù)阳掐。我們馬上相信WinMain()函數(shù)是在CWinApp類或它的基類中,而不是在其他類中堪伍。其實這種看法是錯誤的锚烦,我們知道編寫C++程序的時候,不可能讓你在一個類中包含入口函數(shù)帝雇,WinMain()是由系統(tǒng)調(diào)用涮俄,跟我們的平時程序自身調(diào)用的函數(shù)有著本質(zhì)的區(qū)別。我們可以暫時簡單想象成尸闸,當(dāng)CWinApp對象構(gòu)造完的時候彻亲,WinMain()跟著執(zhí)行。

現(xiàn)在大家明白了吮廉,大部分的“通用代碼(我們想封裝隱藏的東西)”都可以放到CWinApp類中苞尝,那么它又是怎樣運行起來的呢?為什么構(gòu)造了CWinApp類對象就“自動”執(zhí)行那么多東西宦芦。

大家再仔細想一下宙址,CWinApp類對象構(gòu)造之后,它會“自動”執(zhí)行自己的構(gòu)造函數(shù)调卑。那么我們可以把想要“自動”執(zhí)行的代碼放到CWinApp類的構(gòu)造函數(shù)中抡砂。

那么CWinApp類可能打算這樣設(shè)計(先不計較正確與否):

class CWinApp : public CWinThead
 {    
public:    
      virtual BOOL InitInstance(); //解釋過的程序的入點      
      CWinApp ::CWinApp()
      {//構(gòu)造函數(shù)         
            ////////////////////////        
            WinMain();  //這個是大家一眼看出的錯誤        
            Create();    //設(shè)計、創(chuàng)建恬涧、更新顯示窗口        
            Run();     //消息循環(huán)        //////////////////////     
      }   
};  

寫完后注益,大家又馬上感覺到似乎不對,WinMain()函數(shù)在這里好象真的一點用處都沒有溯捆,并且能這樣被調(diào)用嗎(請允許我把手按在圣經(jīng)上聲明一下:WinMain()不是普通的函數(shù)丑搔,它要肩負著初始化應(yīng)用程序,包括全局變量的初始化提揍,是由系統(tǒng)而不是程序本身調(diào)用的啤月,WinMain()返回之后,程序就結(jié)束了碳锈,進程撤消)顽冶。再看Create()函數(shù),它能確定設(shè)計什么樣的窗口售碳,創(chuàng)建什么樣的窗口嗎强重?如果能在CWinApp的構(gòu)造函數(shù)里確定的話绞呈,我們以后設(shè)計MFC程序時窗口就一個樣,這樣似乎不太合理间景。

回過頭來佃声,我們可以讓W(xué)inMain()函數(shù)一條語句都不包含嗎?不可以倘要,我們看一下WinMain() 函數(shù)的四個參數(shù):

WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

其中第一個參數(shù)指向一個實例句柄圾亏,我們在設(shè)計WNDCLASS的時候一定要指定實例句柄。我們窗口編程封拧,肯定要設(shè)計窗口類志鹃。所以,WinMain()再簡單也要這樣寫:

int WinMain(HINSTANCE hinst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{  
      hInstance=hinst 
}

既然實例句柄要等到程序開始執(zhí)行才能知道泽西,那么我們用于創(chuàng)建窗口的Create()函數(shù)也要在WinMain()內(nèi)部才能執(zhí)行(因為如果等到WinMain()執(zhí)行完畢后曹铃,程序結(jié)束,進程撤消捧杉,當(dāng)然Create()也不可能創(chuàng)建窗口)陕见。

再看Run()(消息循環(huán))函數(shù),它能在WinMain()函數(shù)外面運行嗎味抖?眾所周知评甜,消息循環(huán)就是相同的那么幾句代碼,但我們也不要企圖把它放在WinMain()函數(shù)之外執(zhí)行仔涩。

所以我們的WinMain()函數(shù)可以像下面這樣寫:

WinMain(……)       
{              
      ……
      窗口類對象執(zhí)行創(chuàng)建窗口函數(shù)
      ……              
      ……
      程序類對象執(zhí)行消息循環(huán)函數(shù)
      ……       
}

對于WinMain()的問題忍坷,得總結(jié)一下,我們封裝的時候是不可以把它封裝到CWinApp類里面熔脂,但由于WinMain()的不變性(或者說有規(guī)律可循)承匣,MFC完全有能力在我們構(gòu)造CWinApp類對象的時候,幫我們完成那幾行代碼锤悄。

轉(zhuǎn)了一個大圈,我們仿佛又回到了SDK編程的開始嘉抒。但現(xiàn)在我們現(xiàn)在能清楚地知道零聚,表面上MFC與SDK編程截然不同,但實質(zhì)上MFC只是用類的形式封裝了SDK函數(shù)些侍,封裝之后隶症,我們在WinMain()函數(shù)中只需要幾行代碼,就可以完成一個窗口程序岗宣。我們也由此知道了應(yīng)如何去封裝應(yīng)用程序類(CWinApp)和主框架窗口類(CFrameWnd)蚂会。下面把上開始設(shè)計這兩個類。

3耗式、MFC庫的“重寫”

為了簡單起見胁住,我們忽略這兩個類的基類和派生類的編寫趁猴,可能大家會認為這是一種很不負責(zé)任的做法,但本人覺得這既可減輕負擔(dān)彪见,又免了大家在各類之間穿來穿去儡司,更好理解一些(我們在關(guān)鍵的地方作注明)。還有余指,我把全部代碼寫在同一個文件中捕犬,讓大家看起來不用那么吃力,但這是最不提倡的寫代碼方法酵镜,大家不要學(xué)哦碉碉!

#include <windows.h>    
HINSTANCE hInstance;     
class CFrameWnd     
{    
      HWND hwnd;   
public:    
      CFrameWnd();   //也可以在這里調(diào)用Create()    
      virtual ~CFrameWnd();    
      int Create();    //類就留意這一個函數(shù)就行了!    
      BOOL ShowWnd();   
};  
class CWinApp1    
{   
public:    
      CFrameWnd* m_pMainWnd;//在真正的MFC里面   
      //它是CWnd指針淮韭,但這里由于不寫CWnd類   
      //只要把它寫成CFrameWnd指針    
      CWinApp1* m_pCurrentWinApp;//指向應(yīng)用程序?qū)ο蟊旧?   
      CWinApp1();    
      virtual ~CWinApp1();    
      virtual BOOL InitInstance();//MFC原本是必須重載的函數(shù)垢粮,最重要的函數(shù)!8妆簟W愣!    
      virtual BOOL Run();//消息循環(huán)   
};   
CFrameWnd::CFrameWnd(){}   
CFrameWnd::~CFrameWnd(){}     
int CFrameWnd::Create()   //封裝創(chuàng)建窗口代碼   
{    
      WNDCLASS wndcls;    
      wndcls.style=0;    
      wndcls.cbClsExtra=0;    
      wndcls.cbWndExtra=0;    
      wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);                       
      wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);    
      wndcls.hIcon=LoadIcon(NULL,IDC_ARROW);    wndcls.hInstance=hInstance;        
      wndcls.lpfnWndProc=DefWindowProc;//默認窗口過程函數(shù)庇配。   
      //大家可以想象成MFC通用的窗口過程斩跌。                
      wndcls.lpszClassName="WindowClassName";       
      wndcls.lpszMenuName=NULL;    
      RegisterClass(&wndcls);          
      hwnd=CreateWindow("WindowClassName","WindowInstanceTitle",
                        WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);     
      return 0;   
}     
BOOL CFrameWnd::ShowWnd()//顯示更新窗口   
{    
      ShowWindow(hwnd,SW_SHOWNORMAL);    
      UpdateWindow(hwnd);    
      return 0;   
}    
/////////////   
CWinApp1::CWinApp1()   
{    
      m_pCurrentWinApp=this;   
}   
CWinApp1::~CWinApp1(){}   
//以下為InitInstance()函數(shù),MFC中要為CWinApp的派生類改寫捞慌,   
//這里為了方便理解耀鸦,把它放在CWinApp類里面完成!   
//你只要記住真正的MFC在派生類改寫此函數(shù)就行了啸澡。   
BOOL CWinApp1::InitInstance()   
{          
      m_pMainWnd=new CFrameWnd;   
      m_pMainWnd->Create();   
      m_pMainWnd->ShowWnd();    
      return 0;   
}     
BOOL CWinApp1::Run()//////////////////////封裝消息循環(huán)   
{    
      MSG msg;                
      while(GetMessage(&msg,NULL,0,0))    
      {     
            TranslateMessage(&msg);    
            DispatchMessage(&msg);    
      }    
      return 0;   
} //////////////////////////////////////////////////////封裝消息循環(huán)     
CWinApp1 theApp;   //應(yīng)用程序?qū)ο螅ㄈ郑?    
int WINAPI WinMain( HINSTANCE hinst, HINSTANCE hPrevInstance,
         LPSTR lpCmdLine,  int nCmdShow)   
{    
      hInstance=hinst;    
      CWinApp1* pApp=theApp.m_pCurrentWinApp;   //真正的MFC要寫一個全局函數(shù)AfxGetApp袖订,
                                                //以獲取CWinApp指針。    
      pApp->InitInstance();    
      pApp->Run();    
      return 0;   
}   

代碼那么長嗅虏,實際上只是寫了三個函數(shù)洛姑,一是CFrameWnd類的Create(),第二個是CWinApp類的InitInstance()和Run()皮服。在此特別要說明的是InitInstance()楞艾,真正的MFC中,那是我們跟據(jù)自己構(gòu)造窗口的需要龄广,自己改寫這個函數(shù)硫眯。

大家可以看到,封裝了上面兩個類以后择同,在入口函數(shù)WinMain中就寫幾行代碼两入,就可以產(chǎn)生一個窗口程序。在MFC中敲才,因為WinMain函數(shù)就是固定的那么幾行代碼裹纳,所以MFC絕對可以幫我們自動完成(MFC的特長就是幫我們完成有規(guī)律的代碼)择葡,也因此我們創(chuàng)建MFC應(yīng)用程序的時候,看不到WinMain函數(shù)痊夭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刁岸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子她我,更是在濱河造成了極大的恐慌虹曙,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酝碳,死亡現(xiàn)場離奇詭異恨狈,居然都是意外死亡疏哗,警方通過查閱死者的電腦和手機禾怠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門返奉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芽偏,你說我怎么就攤上這事∥畚荆” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵往产,是天一觀的道長被碗。 經(jīng)常有香客問我,道長仿村,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任包颁,我火速辦了婚禮压真,結(jié)果婚禮上蘑险,老公的妹妹穿的比我還像新娘。我一直安慰自己佃迄,他們只是感情好贵少,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布堆缘。 她就那樣靜靜地躺著,像睡著了一般录平。 火紅的嫁衣襯著肌膚如雪缀皱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天表箭,我揣著相機與錄音钮莲,去河邊找鬼。 笑死崔拥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的握童。 我是一名探鬼主播姆怪,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼稽揭,長吁一口氣:“原來是場噩夢啊……” “哼肥卡!你這毒婦竟也來了溪掀?” 一聲冷哼從身側(cè)響起步鉴,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤氛琢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阳似,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡俏讹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年泽疆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殉疼。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驱证,靈堂內(nèi)的尸體忽然破棺而出恋腕,到底是詐尸還是另有隱情,我是刑警寧澤荠藤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布哈肖,位于F島的核電站吻育,受9級特大地震影響淤井,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜游两,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一漩绵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宝踪,春花似錦碍扔、人聲如沸瘩燥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽站蝠。三九已至卓鹿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澜倦,已是汗流浹背杰妓。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巷挥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓雏节,卻偏偏與公主長得像高职,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子怔锌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容