分享
 
 
 

一个典型的例子解决常见的高级Windows程序设计问题

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

//#######################################################################################

// Copyright(c) Vision Technologies 2002 All Rights Reserved.

//

// Project Name: FileInspector RT

// Software Version 1.0

//

// ----------------------------------------------------------

//

// File Name: FileInspector.h

// Function: Define of Classes

// Created Time: 28th Dec, 2002

// Author: HighTech Young

//

// ----------------------------------------------------------

//

// Revidion Time:

// Revision By:

// Revision Contents:

//

//#######################################################################################

#include "resource.h"

#include "stdafx.h"

#include "afxmt.h"

//---------------------------------------------------------------------------------------

//

// COMMENTS: Define of applacation class

//

//---------------------------------------------------------------------------------------

class CMyApp : public CWinApp

{

public:

virtual BOOL InitInstance ();

};

//---------------------------------------------------------------------------------------

//

// COMMENTS: Define of mainwindow class

//

//---------------------------------------------------------------------------------------

class CMainWindow : public CWnd

{

//

// Declare all objects of interface

//

private:

CStatic m_FiTip;

CButton m_GroupBoxFI;

CEdit m_ObjectPath;

CButton m_Browse;

CButton m_GroupBoxFS;

CStatic m_FsTip;

CEdit m_ObjectSize;

CButton m_GB;

CButton m_MB;

CButton m_KB;

CButton m_Byte;

CButton m_OK;

CButton m_Cancel;

CButton m_Exit;

public:

CMainWindow ();

BOOL boolWndHadShow; // Window display indicator

protected:

CEvent m_eventStopWatch;// CEvent object for synchonize thread

virtual void PostNcDestroy();

//

// Message handler declare

//

afx_msg int OnCreate(LPCREATESTRUCT lpcs);

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg LRESULT OnMyIconNotify(WPARAM wParam, LPARAM lParam);

afx_msg LRESULT OnShowAppIconic(WPARAM wParam, LPARAM lParam);

afx_msg void OnClose();

afx_msg void OnBrowseButonClicked();

afx_msg void OnObjectPathChanged();

afx_msg void OnOkButtonClicked();

afx_msg void OnCancelButtonClicked();

afx_msg void OnExitButtonClicked();

afx_msg LONG OnFileChanged(WPARAM wParam, LPARAM lParam);

DECLARE_MESSAGE_MAP ()

};

//##################################### End of File #######################################

//#######################################################################################

// Copyright(c) Vision Technologies 2002 All Rights Reserved.

//

// Project Name: FileInspector RT

// Software Version 1.0

//

// ----------------------------------------------------------

//

// File Name: FileInspector.cpp

// Function: Implementation of the class

// Created Time: 28th Dec, 2002

// Created by: HighTech Young

//

// ----------------------------------------------------------

//

// Revidion Time:

// Revision By:

// Revision Contents:

//

//#######################################################################################

#include "FileInspector.h"

//---------------------------------------------------------------------------------------

//

// COMMENTS: GLOBE DEFINATION AREA

//

//---------------------------------------------------------------------------------------

//

// User defined message for callback function

//

#define USER_WM_NOTIFYICON WM_USER + 0x001

//

// User defined message for display icon on statue bar of windows

//

#define USER_WM_SHOWAPPICONIC WM_USER + 0x002

//

// User defined message for file change notification

//

#define WM_USER_THREAD_FILE_CHANGED WM_USER + 0x003

//

// The structure was defined for the input of thread function parameters

//

typedef struct tagTHREADPARAM

{

HWND hWnd;

CEvent *pEvent;

}THREADPARAM;

//

// Worker thread function declare

//

UINT ThreadFunction(LPVOID pParam);

//---------------------------------------------------------------------------------------

//

// COMMENTS: MESSAGE MAP of CMainWindow class

//

//---------------------------------------------------------------------------------------

BEGIN_MESSAGE_MAP (CMainWindow, CWnd)

ON_WM_CREATE()

ON_MESSAGE(USER_WM_NOTIFYICON,OnMyIconNotify)

ON_MESSAGE(USER_WM_SHOWAPPICONIC,OnShowAppIconic)

ON_WM_SYSCOMMAND()

ON_WM_CLOSE()

ON_BN_CLICKED(IDC_BROWSE,OnBrowseButonClicked)

ON_EN_CHANGE(IDE_OBJ_PATH,OnObjectPathChanged)

ON_BN_CLICKED(IDC_OK,OnOkButtonClicked)

ON_BN_CLICKED(IDE_OBJ_PATH,OnObjectPathChanged)

ON_BN_CLICKED(IDC_EXIT_FI,OnExitButtonClicked)

ON_MESSAGE(WM_USER_THREAD_FILE_CHANGED,OnFileChanged)

END_MESSAGE_MAP ()

//

// defination of application object

//

CMyApp myApp;

//---------------------------------------------------------------------------------------

//

// FUNCTION: BOOL CMyApp::InitInstance ()

// PURPOSE: CMyApp member functions

// COMMENTS:

//

//---------------------------------------------------------------------------------------

BOOL CMyApp::InitInstance ()

{

m_pMainWnd = new CMainWindow;

m_pMainWnd->ShowWindow (m_nCmdShow);

m_pMainWnd->UpdateWindow ();

//

// Send MYWM_SHOWAPPICONIC so that the window can be

// hide after programe runed and the icon should be

// displayed on the statue area of task bar

//

m_pMainWnd -> PostMessage( USER_WM_SHOWAPPICONIC );

return TRUE;

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: CMainWindow::CMainWindow ()

// PURPOSE: The constructor of the CMainWindow class

// COMMENTS:

//

//---------------------------------------------------------------------------------------

CMainWindow::CMainWindow ():

m_eventStopWatch(FALSE,TRUE)

{

//

// Register a WNDCLASS.

//

CString strWndClass = AfxRegisterWndClass (

CS_DBLCLKS, // Class style

AfxGetApp ()->LoadStandardCursor (IDC_ARROW), // Class cursor

(HBRUSH) (COLOR_3DFACE + 1), // Background brush

AfxGetApp ()->LoadIcon( IDR_FILE_INSPECTOR) // Class icon

);

//

// Create a window.

//

CreateEx (0, strWndClass, _T ("File/Folder Supervisor"),

WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL);

//

// Size the window.

//

CRect rect (80,70, 452, 400);

CalcWindowRect (&rect);

SetWindowPos (NULL, 0, 0, rect.Width (), rect.Height (),

SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: int CMainWindow::OnCreate(LPCREATESTRUCT lpcs)

// PURPOSE: Create GUI of Programe

// COMMENTS:

//

//---------------------------------------------------------------------------------------

int CMainWindow::OnCreate(LPCREATESTRUCT lpcs)

{

if(CWnd::OnCreate(lpcs) == -1)

return -1;

//

// Object selected groupe box

//

m_GroupBoxFI.Create (_T (" Supervised Target:"),

WS_CHILD|BS_GROUPBOX| WS_VISIBLE,

CRect(10,10,360,115),

this,

IDC_GROUPBOX_FI);

m_FiTip.Create(_T("Please select the file or folder which you want to ask the File/Folder Supervisor supervise."),

WS_CHILD|WS_VISIBLE,

CRect(25,35,350,75),

this,

IDS_FI_TIP);

m_ObjectPath.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,

CRect(25,80,260,100),

this,

IDE_OBJ_PATH);

m_Browse.Create(_T("Browse.."),

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,

CRect(265,80,350,100),

this,

IDC_BROWSE);

//

// File size limitation config box

//

m_GroupBoxFS.Create (_T ("File Size Limitation:"),

WS_CHILD |BS_GROUPBOX| WS_VISIBLE,

CRect(10,120,360,280),

this,

IDC_GROUPBOX_FS);

m_FsTip.Create( _T("The Folder or File size must be less than:"),

WS_CHILD|WS_VISIBLE,

CRect(25,145,350,165),

this,

IDS_FS_TIP);

m_ObjectSize.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,

CRect(30,170,100,190),

this,

IDE_OBJ_SIZE);

m_GB.Create (_T("GB"),

WS_CHILD|WS_GROUP|WS_VISIBLE|BS_AUTORADIOBUTTON,

CRect(110,170,150,190),

this,

IDC_GB);

m_MB.Create (_T("MB"),

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,

CRect(155,170,195,190),

this,

IDC_MB);

m_KB.Create (_T("KB"),

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,

CRect(200,170,240,190),

this,

IDC_GB);

m_Byte.Create (_T("Byte"),

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,

CRect(245,170,325,190),

this,

IDC_BYTE);

m_KB.SetCheck (BST_CHECKED);

//

// Buttons

//

m_OK.Create(_T("Start"),

WS_CHILD|WS_GROUP|BS_DEFPUSHBUTTON| WS_VISIBLE,

CRect(50,290,150,315),

this,

IDC_OK);

m_Cancel.Create(_T("Cancel"),

WS_CHILD|BS_PUSHBUTTON| WS_VISIBLE,

CRect(155,290,255,315),

this,

IDC_CANCEL);

m_Cancel.EnableWindow(FALSE);

m_Exit.Create(_T("Stop"),

WS_CHILD|BS_PUSHBUTTON| WS_VISIBLE,

CRect(260,290,360,315),

this,

IDC_EXIT_FI);

return 0;

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: void CMainWindow::PostNcDestroy()

// PURPOSE: PostNcDestroy will be used for delete the window

// COMMENTS:

//

//---------------------------------------------------------------------------------------

void CMainWindow::PostNcDestroy()

{

delete this;

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: BOOL MyTaskBarAddIcon(HWND hwnd,UINT uID, HICON hicon, LPSTR lpszTip)

// PURPOSE: Add icon in the statu area on the task bar

// COMMENTS:

//

//---------------------------------------------------------------------------------------

BOOL MyTaskBarAddIcon(HWND hwnd,UINT uID, HICON hicon, LPSTR lpszTip)

{

BOOL bResult;

NOTIFYICONDATA tnid;

tnid.cbSize = sizeof(NOTIFYICONDATA);

tnid.hWnd = hwnd;

tnid.uID = uID;

tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;

tnid.uCallbackMessage = USER_WM_NOTIFYICON; // Callback message

tnid.hIcon = hicon; // Icon used

if (lpszTip)

lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip));

else

tnid.szTip[0] = '\0';

//

// Send NIM_ADD to create icon

//

bResult = Shell_NotifyIcon(NIM_ADD, &tnid);

if (hicon) DestroyIcon(hicon);

return bResult;

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)

// PURPOSE: DELETE icon in the statu area on the task bar

// COMMENTS:

//

//---------------------------------------------------------------------------------------

BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)

{

BOOL bResult;

NOTIFYICONDATA tnid;

tnid.cbSize = sizeof(NOTIFYICONDATA);

tnid.hWnd = hwnd;

tnid.uID = uID;

//

//Send NIM_DELETE to create icon

//

bResult = Shell_NotifyIcon(NIM_DELETE, &tnid);

return bResult;

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: LRESULT CMainWindow::OnMyIconNotify( WPARAM wParam, LPARAM lParam )

// PURPOSE: Call back function of message MYWM_NOTIFYICON

// COMMENTS:

//

//---------------------------------------------------------------------------------------

LRESULT CMainWindow::OnMyIconNotify( WPARAM wParam, LPARAM lParam )

{

UINT nID;

UINT uMouseMsg;

nID = (UINT)wParam;

uMouseMsg = (UINT) lParam;

//

// Show or hide window

//

if (uMouseMsg == WM_LBUTTONDOWN) // Click on icon

{

if ( boolWndHadShow )

ShowWindow( SW_HIDE );

else

ShowWindow( SW_SHOWNORMAL );

boolWndHadShow = ~boolWndHadShow;

}

return TRUE;

}

//---------------------------------------------------------------------------------------

//

// FUNCTION:

// LRESULT CMainWindow::OnShowAppIconic( WPARAM wParam, LPARAM lParam )

// PURPOSE:

// Message handler of show icon on statu bar

// and hide the window when programe run

// COMMENTS:

// Call back function of message MYWM_SHOWAPPICONIC

//

//---------------------------------------------------------------------------------------

LRESULT CMainWindow::OnShowAppIconic( WPARAM wParam, LPARAM lParam )

{

HICON theIcon = LoadIcon(AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDR_FILE_INSPECTOR) );

MyTaskBarAddIcon(GetSafeHwnd(),

100,

theIcon,

_T("File/Folder Supervisor"));

ShowWindow( SW_HIDE );

boolWndHadShow = FALSE;

return 1;

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: void CMainWindow::OnClose()

// PURPOSE:

// When you want to close programe, the icon should

// be delete from statue area on task bar,

// We can use WM_CLOSE message and message handler to do this

// COMMENTS:

//

//---------------------------------------------------------------------------------------

void CMainWindow::OnClose()

{

//

// Add your message handler code here and/or call default

//

MyTaskBarDeleteIcon( GetSafeHwnd(), 100 );

CWnd::OnClose();

}

//---------------------------------------------------------------------------------------

//

// FUNCTION:

// void CMainWindow::OnSysCommand( UINT nID, LPARAM lParam )

// PURPOSE:

// When window were minimumized, the window should be hide,

// we use ON_SYSCOMMAND message and message handle to do this

// COMMENTS:

//

//---------------------------------------------------------------------------------------

void CMainWindow::OnSysCommand( UINT nID, LPARAM lParam )

{

if ( nID==SC_MINIMIZE )

{

ShowWindow( SW_HIDE );

boolWndHadShow = FALSE;

}

else

CWnd::OnSysCommand( nID, lParam );

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: void CMainWindow::OnBrowseButonClicked ()

// PURPOSE: Message handler of OK button

// COMMENTS:

//

//---------------------------------------------------------------------------------------

void CMainWindow::OnBrowseButonClicked ()

{

//

// Must call IMalloc::Free to free the memory by this pointer

//

LPMALLOC pMalloc;

BROWSEINFO bi;

char pszDirName[MAX_PATH];// Save the directory name

LPITEMIDLIST pidl;

//

// If retrieve a handle to the Shell allocator's IMalloc interface sucessfuly

//

if (SUCCEEDED(SHGetMalloc(&pMalloc)))

{

ZeroMemory(&bi,sizeof(bi));

bi.hwndOwner = GetSafeHwnd();

bi.pidlRoot = NULL;

bi.pszDisplayName = pszDirName;

bi.lpszTitle = _T("Select the file or folder which will be Supervised:");

bi.ulFlags = BIF_BROWSEINCLUDEFILES;

bi.lpfn = NULL;

bi.lParam = 0;

if ((pidl = ::SHBrowseForFolder(&bi)) != NULL)

{

//

// Get full path user selected

//

if (::SHGetPathFromIDList(pidl, pszDirName))

m_ObjectPath.SetWindowText(pszDirName);

}

pMalloc->Free(pidl);

pMalloc->Release();

}

//

// Try to detect the inspect object is directory or file

// Can also use:

// DWORD GetFileAttributes(LPCTSTR lpFileName);

//

DWORD ObjectType;

ObjectType = GetFileAttributes(pszDirName);

if(ObjectType & FILE_ATTRIBUTE_DIRECTORY)

{

m_GroupBoxFI.SetWindowText (_T("Folder Supervised:"));

m_GroupBoxFS.SetWindowText (_T("Folder Size Limitation"));

}

else

{

m_GroupBoxFI.SetWindowText (_T("File Supervised:"));

m_GroupBoxFS.SetWindowText (_T("File Size Limitation"));

}

//

//Enable the Cancel button

//

m_Cancel.EnableWindow(TRUE);

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: void CMainWindow::OnOkButtonClicked ()

// PURPOSE: Message handler of OK button

// COMMENTS:

// This function transfer a structure's pointer

// as a LPVOID parameter to worker thread. this is the normal way

// to handle the worker thread parameters. Besides, you can also

// input a address of an object directly.

//

//---------------------------------------------------------------------------------------

void CMainWindow::OnOkButtonClicked ()

{

m_Cancel.EnableWindow( FALSE );

ShowWindow( SW_HIDE );

boolWndHadShow = FALSE;

//

// Reset the manual event object before start worker thread

//

m_eventStopWatch.ResetEvent ();

//

// Prepare the parameter for worker thread

// sometimes if you only need m_hWnd, you can also

// input &m_hWnd directly there

//

THREADPARAM * pThreadParam=new THREADPARAM;

pThreadParam->hWnd= m_hWnd; // Message target

pThreadParam->pEvent = &m_eventStopWatch; // Event to stop thread

//

// Start File Inspector thread.

//

AfxBeginThread(ThreadFunction, pThreadParam);

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: void CMainWindow::OnCancelButtonClicked ()

// PURPOSE: Message handler of Cancel button

// COMMENTS:

//

//---------------------------------------------------------------------------------------

void CMainWindow::OnCancelButtonClicked ()

{

ShowWindow( SW_HIDE );

boolWndHadShow = FALSE;

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: void CMainWindow::OnExitButtonClicked ()

// PURPOSE: Message handler of Exit button

// COMMENTS:

//

//---------------------------------------------------------------------------------------

void CMainWindow::OnExitButtonClicked ()

{

ShowWindow( SW_HIDE );

boolWndHadShow = FALSE;

m_eventStopWatch.SetEvent();

//

// Close the window

//

PostMessage (WM_CLOSE,0,0);

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: void CMainWindow::OnObjectPathChanged ()

// PURPOSE: Message handler of Object Path changed

// COMMENTS:

//

//---------------------------------------------------------------------------------------

void CMainWindow::OnObjectPathChanged ()

{

m_Cancel.EnableWindow(TRUE);

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: UINT ThreadFunction(LPVOID pParam)

// PURPOSE: Worker thread Function

// COMMENTS:

//

//---------------------------------------------------------------------------------------

UINT ThreadFunction(LPVOID pParam)

{

//

// Unbound the parameters

//

THREADPARAM *pThreadParam = (THREADPARAM * ) pParam;

HWND hWnd = pThreadParam -> hWnd;

CEvent *pEvent = pThreadParam -> pEvent;

//delete pThreadParam;

delete pThreadParam;

DWORD dwWaitStatus;

HANDLE *dwChangeHandles=new HANDLE[3];

//

// Use this event handle to stop the thread

//

dwChangeHandles[2] = pEvent->m_hObject;

//

// Watch the C:\ directory for file creation and deletion.

//

dwChangeHandles[0] = FindFirstChangeNotification(

"C:\\", // directory to watch

FALSE, // do not watch the subtree

FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes

//

// Watch the D:\ subtree for directory creation and deletion.

//

dwChangeHandles[1] = FindFirstChangeNotification(

"D:\\", // directory to watch

TRUE, // watch the subtree

FILE_NOTIFY_CHANGE_DIR_NAME); // watch dir. name changes

while (TRUE)

{

/*--------------------------------------------------------------------------

Examples:

Here is the examples if you want to use WaitForSingleObject

to imply the function.

//

// Check if user want to Exit File Inspector.

// Please make sure that the second parameter of

// WaitForSingleObject is 0, and in this case the

// first parameter must be manual event.

// WaitForSingleObject will check the first parameter,

// if it is signaled,the loop will break.

//

if(WaitForSingleObject(pEvent->m_hObject,0)==WAIT_OBJECT_0)

return (UINT) -1;

WaitForSingleObject(dwChangeHandles[1],INFINITE);

PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0);

FindNextChangeNotification(dwChangeHandles);

---------------------------------------------------------------------------*/

//

// Wait for notification.

//

dwWaitStatus = WaitForMultipleObjects(3, dwChangeHandles,

FALSE, INFINITE);

if (dwWaitStatus == WAIT_OBJECT_0 + 2) return (UINT) -1;

switch (dwWaitStatus)

{

case WAIT_OBJECT_0:

//

// A file was created or deleted in C:\WINDOWS.

// Refresh this directory and restart the

// change notification. RefreshDirectory is an

// application-defined function.

//

PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0);

FindNextChangeNotification(dwChangeHandles[0]);

break;

case WAIT_OBJECT_0 + 1:

//

// A directory was created or deleted in C:\.

// Refresh the directory tree and restart the

// change notification. RefreshTree is an

// application-defined function.

//

PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0);

FindNextChangeNotification( dwChangeHandles[1]);

break;

}

}

delete[] dwChangeHandles;

return 0;

}

//---------------------------------------------------------------------------------------

//

// FUNCTION: LONG CMainWindow::OnFileChanged(WPARAM wParam, LPARAM lParam)

// PURPOSE:

// COMMENTS:

//---------------------------------------------------------------------------------------

LONG CMainWindow::OnFileChanged(WPARAM wParam, LPARAM lParam)

{

//

// Add process sentence if file changed here.

//

return 0;

}

//##################################### End of File #######################################

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有