鏶嶅嚑澶┼沄CKbase鐨勤椂鍊欑湅鍒頒簡榪欐牁涓綃呸枃褲狅細http://www.vckbase.com/document/viewdoc/?id=1415銆傛枃褲犱竴寮濮嬪氨浠嬬肅濱骨熀鏈畻娉曪紝鍗沖廳鑾峰緱QQ榪閃綽鐪嬬獥鍙e彝鏌徹紝鐒惰屻幏寰楀叾DC錛出扐鍚庡姣仁釜鏂規牸榪瀆棰滆壞鍙栨牁錛屻綆楀嚭姣忕鏂規牸鐨勯鑹茬壒寰佸鹼紝鏋勯豺嚭鏂規牸鐗瑰緛鋨┼樀錛岸渜璇煩闃典芄瀹炵幫榪閃綽鐪嬬殑綆楁磣錛屾ā鎷熼紶鏍囩偣鍑諱簨浠躲?/font>
鏂囩碔榪樼稃濱嗕竴孌靛剮閿殑浠g爜錛岸嵇鏋勯豹柟鏍肩壒寰佺煩闃甸儴鍒嗙殑浠g爜銆備笉榪囪佸疄璇達紝閭d塞浠g爜澶毦鐪嬩簡錛岸懡鍚嶆販涔卞緱寰堬紝鎴戠湅濱嗙湅婧愪唬鐮觥紝姣旒偅涓洿緋燂紝鍩烘湰娌℃敞閱娿備笉榪呸棦鐒剁煡閬撲簡綆楁磣錛屻嚜宸卞啟涔熻姣旇閭d塞闅劇湅鐨蹺唬鐮佹撒寰楁洿蹇竴濱蒞?/font>
緇忚繃瀹為獙錛屼綔鑰呯殑綆楁磣鐨動『涓嶉敊錛岸噯紜巼鎺繎100錛他紝鍙湁4縐嶅乏鍙崇殑鏂規牸鏃豹磣璇骨埆銆備絾鏄繖涓笉鏄棶棰橈紝鍙渶瑕佸曉鍙栨牁鐐瑰鍔豺埌6涓氨鍙互杈懼埌寰堥珮鐨勫垎杈ㄨ始鍔涗簡銆備絾鏄渜妯℃嫙榧豹爣鐨劇繃紼嬩腑閬囧埌濱嗕竴濱溳夯鐑︺備竴寮濮嬩嬌鐢╩ouse_event妯℃嫙榧豹爣鐨勫崟鍑伙紝浣奚槸鏈始濡傛效浠信錛屾瘡嬈〞彧鑳藉崟鍑諱竴涓柟鏍鹼紝鏃豹磣鍗曞嚮絎簩涓傚悗鏉張璇曚簡璇昐endInput錛岄棶棰樹緷鏃傚幓CSDN涓婇涗簡閫涳紝娌′粈涔壟敹鑾鳳紝鐜板渜榪樹笉鋨亡闀鍑哄渜鍝噷錛出湅鏉繕寰楄嚜宸辨參鎱三爺絀躲?/font>
璇暸獙榪囧悗錛屻寰楀螭浠曉榪鬱釜鎬濊礬鐢ㄥ埌綾諱技鐨勤父鎴仁腑錛屾瘮濡俀Q瀵瑰紕般傛瀯閫犵壒寰佺煩闃電殑鏂規磣涓鏍鳳紝鍙笉榪呸父鎴忕畻娉曚笉涓鏍瘋岸凡銆?/font>
闄徹細鎴戠殑Code錛出畻娉晨湁寰堝鐨勤敼榪涗綑鍦般?/font>
// For SendInput() and INPUT Struct
#include "Winable.h"
//
// 涓濱涘父閱忏拰鎖版嵁鐨勫畾涔?/font>
// 鑷畾涔倨秷鎮?br/>#define MM_DONE WM_USER + 1000
// 絀烘牸
#define GRID_BLANK (0)
// QQ榪閃綽鐪嬬殑娓告垙鍖烘柟鏍兼槸11琛?times;19鍒?br/>#define ROWS 11
#define COLS 19
// 娓告垙鍖虹溮瀵逛簬瀹二垌鍖虹殑鍋忕錛堝螭浠敼鍙橈級
#define YCOFFSET 181
#define XCOFFSET 14
// 榪閃綽鐪嬫柟鏍肩殑灝哄錛堝螭浠敼鍙橈級
#define WIDTH 31
#define HEIGHT 35
// 姣仁釜鏂規牸鐨勫彇鏍風偣涓暟錛堝螭浠敼鍙橈級
#define SAMPLES 4
// 鍚勫彇鏍風偣鐩稿濱庢柟鏍煎乏涓匊鐨勫嚲縐婚噺錛堝螭浠敼鍙橈級
const static POINT g_Offsets[SAMPLES] = {
{15, 17},
{11, 19},
{16, 17},
{21, 17}
};
// 鍒柇涓涓嶅俔棰滆壞鐨勫宸紙鍙互鏀瑰彉錛?br/>#define TOLERANCE 15
// 鏂規牸緇撴瀯
typedef struct _GRID_{
// 鏂規牸鐨動被鍒獻D錛地ash錛多紝澶簬絳變簬0錛?涓虹└鏍箋?br/> // 瀹冪殑浣滅敤寰壟梅鏄撅紝鍙湁鍚出被鐨勤柟鏍兼墠鍙始琚秷闄?br/> int iID;
// 璇柟鏍間腑蹇富潗鏍囷紙瀹二垌鐨徹紝涓轟簡閬垮厤鍥犱負榪閃綽鐪嬬獥鍙d綅緗發鐢熷彉鍖枻甫鏉殑闀錛?br/> CPoint pt;
// 璇柟鏍肩殑鍙栨牁鐐圭殑棰滆壞銆傚町鐨蹺綔鐢ㄦ槸涓轟簡甯姪紜畾鎵鏈倨柟鏍肩殑iID銆?br/> COLORREF cl[SAMPLES];
}GRID;
// 鎖翠釜娓告垙鍖烘塈鏈夌殑鏂規牸
static GRID g_Grid[ROWS][COLS];
// 褰撳墠鐨勤柟鏍肩綾籌D(Hash)鏈澶?br/>static int g_iGridID = 0;
// 浣滃紛鍣ㄧ獥鍙e彝鏌勩傜稃瀹富發閫佹秷鎮殑鏃跺欒鐢ㄥ埌
static HWND g_hThisWnd = NULL;
// 榪閃綽鐪?HWND
static HWND g_hLLKWnd = NULL;
//
// 涓濱瀆緟鍔┼畯
// 鑾峰緱RGB涓垎閱?br/>#define B(X) (GetBValue(X))
#define G(X) (GetGValue(X))
#define R(X) (GetRValue(X))
// 姣旇緝澶曤
#define MIN(X, Y) ((X) > (Y) ? (Y) : (X))
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
// 宸殑緇濆鍊?br/>#define ABS(X, Y) ((X) < (Y) ? (Y) - (X) : (X) - (Y))
//////////////////////////////////////////////////////////////////
// 璁$畻涓棰滆壞涓垎閱忕殑宸間莿鍜?br/>int Difference(const COLORREF &c1, const COLORREF &c2)
{
return ABS(R(c1), R(c2))
+ ABS(G(c1), G(c2))
+ ABS(B(c1), B(c2));
}
// 鍦ㄧ煩闃典腑鏌壘鍜屾寶瀹氶鑹茬殑宸埆鍦ㄥ宸寖鍥村唴鐨勤柟鏍?r, c)銆傚鏋滀笉瀛樺渜鍒欒繑鍥?錛?1,
// 鍚﹀垯榪斿洖0鍜屻棰滆壞鎵鍦ㄦ柟鏍肩殑浣嶇疆銆?br/>int FindColor(const COLORREF cl[SAMPLES], int &r, int &c)
{
int i, j, k, iDiff;
for(i = 0; i < ROWS; i ++)
{
for(j = 0 ; j < COLS; j ++)
{
// 涓嶇敤鍜出└鏍兼瘮杈?br/> if(g_Grid[i][j] .iID == GRID_BLANK)
continue;
iDiff = 0;
// 璁$畻璇鑹插拰鐫囧畾棰滆壞涔嬮輗鐨勫樊鍒?br/> for(k = 0; k < SAMPLES; k ++)
{
iDiff += Difference(g_Grid[i][j] .cl[k], cl[k]);
}
if(iDiff <= TOLERANCE)
{
// 鎵懼埌
r = i;
c = j;
return 0;
}
}
}
return - 1;
}
// 閫氳繃鍙栨牁鐐圭殑RGB鍊肩『瀹氫竴涓柟鏍肩殑綾誨埆ID(Hash)
int GetGridID(const COLORREF cl[SAMPLES])
{
// 鏍規嵁棰滆壞灝奚柟鏍煎垎綾?br/> for(int i = 0; i < SAMPLES; i ++)
{
// 絀烘牸鐨憑GB鍒嗛噺鑼富洿
// R(44~74), G(49~91), B(102~103)
if (R(cl[i]) > 44 && R(cl[i]) < 74
&& G(cl[i]) > 49 && G(cl[i]) < 91
&& B(cl[i]) > 102 && R(cl[i]) < 130)
{
}
else
{
// 鏄惁宸茬粡瀛樺渜錛?br/> int r, c;
if(FindColor(cl, r, c) == - 1)
{
// 涓嶅瓨鍦?鍒欐坊鍔?br/> g_iGridID ++;
return g_iGridID;
}
else
{
// 瀛樺渜鍒欒繑鍥濱D
return g_Grid[r][c] .iID;
}
}
}
// 絀烘牸
return GRID_BLANK;
}
// 鈮憡閿欒
void ReportError(CString strMsg)
{
AfxMessageBox(strMsg);
}
// 鑾峰緱娓告垙鏂規牸鐗瑰緛鋨┼樀
BOOL InitMatrix(HWND hWnd)
{
// 鑾峰緱榪閃綽鐪婥Wnd
CWnd* pWnd = CWnd ::FromHandle(hWnd);
if(NULL == pWnd)
return FALSE;
// 榪閃綽鐪嬫渶灝忏寲濱嗭紵
if(pWnd ->IsIconic())
{
pWnd ->ShowWindow(SW_RESTORE);
Sleep(1048);
}
// 榪閃綽鐪嬫病鏈倨縺媧伙紵
if(pWnd ->GetActiveWindow() ->GetSafeHwnd() != hWnd)
{
pWnd ->SetForegroundWindow();
pWnd ->SetActiveWindow();
Sleep(1048);
}
// 鑾峰緱榪閃綽鐪嬬殑CDC
CDC* pDC = pWnd ->GetDC();
if(pDC == NULL)
return FALSE;
// 鑾峰緱榪閃綽鐪嬫父鎴忏尯宸︿芄瑙掔涓涓柟鏍肩殑涓績鍧愭爣錛堝鎴峰尯鐨徹級
CPoint pt(0, 0);
// 鑾峰緱瀵瑰簲鎵鏈倨柟鏍肩殑鐗瑰緛
for(int i = 0; i < ROWS; i ++)
{
// 鏂規牸宸︿芄瑙掔殑Y鍧愭爣
pt .y = YCOFFSET + i * HEIGHT;
for(int j = 0; j < COLS; j ++)
{
// 鏂規牸宸︿芄瑙掔殑X鍧愭爣
pt .x = XCOFFSET + j * WIDTH;
// 淇濆瓨鏂規牸涓績鍧愭爣錛堝鎴峰尯錛?br/> g_Grid[i][j] .pt .Offset(pt .x + WIDTH / 2, pt .y + HEIGHT / 2);
// 寰楀埌璇柟鏍肩殑鍙栨牁鐐圭殑RGB
for(int k = 0; k < SAMPLES; k ++)
{
// 濡傛灉鐢ㄦ垌鍏抽棴濱嗙▼搴忕獥鍙?br/> if(::IsWindow(hWnd))
{
g_Grid[i][j] .cl[k] = pDC ->GetPixel(pt .x + g_Offsets[k] .x, pt .y + g_Offsets[k] .y);
}
else
{
// 紿楀彝宸茬粡琚剮闀紒
ReportError(_T("紿楀彝鍦ㄧ紕鐮佹椂琚剮闀紝璇鋒鏌綽榪炵湅鐨動姘鎬觥紝騫跺皾璇暸噸鏂扮紕鐮觥紒"));
return FALSE;
}
}
// 紜畾璇柟鏍肩被鍒獺ash
g_Grid[i][j] .iID = GetGridID(g_Grid[i][j] .cl);
TRACE(_T("%4d,"), g_Grid[i][j] .iID);
}
TRACE(_T("\r\n"));
}
return TRUE;
}
// 鍒柇涓釜鍦ㄥ俔涓琛岋紙鍒楋級鐨勤柟鏍?蹇呴』鍚出被錛岸螭浠槸絀烘牸)涔嬮輗鏄惁瀛樺渜鐩寸嚎閫氳礬
BOOL GridsConnected(int pivot, int l, int h, BOOL bHorizontal = TRUE)
{
// 鏄惁鍚出被錛?br/> if(bHorizontal)
{
if(g_Grid[pivot][l] .iID != g_Grid[pivot][h] .iID)
return FALSE;
}
else
{
if(g_Grid[l][pivot] .iID != g_Grid[h][pivot] .iID)
return FALSE;
}
int L = MIN(l, h);
int H = MAX(l, h);
// 涓釜鏂規牸涔嬮輗蹇呴』閮芥槸絀烘牸
for(int i = L + 1; i < H; i ++)
{
if(bHorizontal)
{
if(g_Grid[pivot][i] .iID != GRID_BLANK)
return FALSE;
}
else
{
if(g_Grid[i][pivot] .iID != GRID_BLANK)
return FALSE;
}
}
return TRUE;
}
// 杈撳嚭璺緞
void OutputPath(int r1, int c1, int r2, int c2)
{
if(r1 == r2 && c1 == c2)
return;
//TRACE(_T(">>>(%d, %d) -> (%d, %d).\r\n"), r1, c1, r2, c2);
}
// 鍒柇涓釜鏂規牸(r1, c1)鍜?r2, c2)(涓嶈始鏄└鏍?鏄惁鍙互娑堥櫎
BOOL Match(const int r1, const int c1, const int r2, const int c2)
{
// 涓嶈始鏄└鏍?br/> if(g_Grid[r1][c1] .iID == GRID_BLANK
|| g_Grid[r2][c2] .iID == GRID_BLANK)
return FALSE;
// 蹇呴』鏄俔涓縐嶆柟鏍?br/> if(g_Grid[r1][c1] .iID != g_Grid[r2][c2] .iID)
return FALSE;
// 璧峰鐐圭殑綾誨埆
const int iID = g_Grid[r1][c1] .iID;
// 瀹林滑鍦ㄥ俔涓琛岋紵
if(r1 == r2)
{
if(c1 <= c2)
{
// 瀹林滑涔嬮輗鏄惁鏈夌洿綰塊氳礬錛?br/> if(GridsConnected(r1, c1, c2))
{
OutputPath(r1, c1, r1, c2);
return TRUE;
}
// 鏄惁鏈綏叾浠栭氳礬錛?br/> for(int i = 0; i < ROWS; i ++)
{
// 宸茬粡鍒柇榪淵簡
if(i == r1)
continue;
// 涓釜鎷愮偣蹇呴』鏄└鏍?br/> if(GRID_BLANK == g_Grid[i][c1] .iID
&& GRID_BLANK == g_Grid[i][c2] .iID)
{
// 灝嗕袱涓嫄鐐圭殑綾誨埆璁劇疆涓篿ID錛出扐鍚庡垽鏂槸鍚︽湁璺緞
g_Grid[i][c1] .iID = g_Grid[i][c2] .iID = iID;
if(GridsConnected(c1, i, r1, FALSE)
&& GridsConnected(i, c1, c2)
&& GridsConnected(c2, i, r1, FALSE))
{
// OK錛屻繕鍘熹被鍒?br/> g_Grid[i][c1] .iID = GRID_BLANK;
g_Grid[i][c2] .iID = GRID_BLANK;
OutputPath(i, c1, r1, c1);
OutputPath(i, c1, i, c2);
OutputPath(i, c2, r1, c2);
return TRUE;
}
else
{
// 涓嶉氾紝鍒欐祴璇曚笅涓鏉¤礬寰徹紝騫朵笖榪樺師鎷愮偣綾誨埆
g_Grid[i][c1] .iID = GRID_BLANK;
g_Grid[i][c2] .iID = GRID_BLANK;
}
}
} // end for
// 涓嶉?br/> return FALSE;
}
else
{
return Match(r1, c2, r1, c1);
}
}
// 瀹林滑鍦ㄥ俔涓鍒楋紵
if(c1 == c2)
{
if(r1 <= r2)
{
if(GridsConnected(c1, r1, r2, FALSE))
{
OutputPath(r1, c1, r2, c1);
return TRUE;
}
// 鏄惁鏈綏叾浠栭氳礬錛?br/> for(int i = 0; i < COLS; i ++)
{
if(i == c1)
continue;
// 蹇呴』涓虹└鏍?br/> if( GRID_BLANK == g_Grid[r1][i] .iID
&& GRID_BLANK == g_Grid[r2][i] .iID)
{
//灝嗕袱涓嫄鐐圭殑綾誨埆璁劇疆涓篿ID錛出扐鍚庡垽鏂槸鍚︽湁璺緞
g_Grid[r1][i].iID = g_Grid[r2][i] .iID = iID;
if(GridsConnected(r1, i, c1)
&& GridsConnected(i, r1, r2, FALSE)
&& GridsConnected(r2, i, c1))
{
// OK, 榪樺師綾誨埆
g_Grid[r1][i].iID = GRID_BLANK;
g_Grid[r2][i].iID = GRID_BLANK;
OutputPath(r1, c1, r1, i);
OutputPath(r1, i, r2, i);
OutputPath(r2, i, r2, c1);
return TRUE;
}
else
{
// 涓嶉氾紝鍒欐祴璇曚笅涓鏉¤礬寰徹紝騫朵笖榪樺師鎷愮偣綾誨埆
g_Grid[r1][i].iID = GRID_BLANK;
g_Grid[r2][i].iID = GRID_BLANK;
}
}
}
// 涓嶉?br/> return FALSE;
}
else
{
return Match(r2, c1, r1, c1);
}
}
// 涓嶅渜鍚屼竴鍒楁守鑰呰
// 閫氳繃鍦ㄦ嫄鐐規瀯閫豺拰鏂規牸綾誨埆鐩稿俔鐨勤柟鏍鹼紝鐒跺悗鍒柇瀹林滑鏄惁鑱旒氾紙鏈澶?鏉$嚎錛屾渶灝?涓潯
// 鍏朵腑涓鏉¢鍖栵級
for(int i = 0; i < ROWS; i ++)
{
// 鎷愮偣1蹇呴』涓虹└鏍?br/> if(g_Grid[i][c1] .iID != GRID_BLANK)
continue;
// 璧風偣鍜屾嫄鐐?鑱旒氬悧錛?br/> g_Grid[i][c1] .iID = iID;
if(GridsConnected(c1, i, r1, FALSE))
{
// 鏄殑錛屾嫄鐐?蹇呴』涓虹└鏍?br/> if(g_Grid[i][c2] .iID != GRID_BLANK)
{
// 榪樺師鎷愮偣1鐨動被鍒紝灝濊瘯涓嬩竴鏉¤礬寰?br/> g_Grid[i][c1] .iID = GRID_BLANK;
continue;
}
// 鎷愮偣2鍜屾嫄鐐?鑱旒氬悧錛?br/> g_Grid[i][c2] .iID = iID;
if(GridsConnected(i, c1, c2))
{
// 鏄殑錛出扐鍚庡垽鏂嫄鐐?鍜?r2, c2)鏄惁鑱旒?br/> if(GridsConnected(c2, i, r2, FALSE))
{
// 鏄殑錛屻礬寰勤壘鍒幫紝榪樺師鎷愮偣綾誨埆
g_Grid[i][c2] .iID = GRID_BLANK;
g_Grid[i][c1] .iID = GRID_BLANK;
//
OutputPath(r1, c1, i, c1);
OutputPath(i, c1, i, c2);
OutputPath(i, c2, r2, c2);
return TRUE;
}
}
// 鎷愮偣2鍜屾嫄鐐?涓嶉氾紝榪樺師鎷愮偣綾誨埆錛岸皾璇曚笅涓琛?br/> g_Grid[i][c1] .iID = GRID_BLANK;
g_Grid[i][c2] .iID = GRID_BLANK;
}
else
{
// 璧風偣鍜屾嫄鐐?涓嶈仈閫氾紝榪樺師鎷愮偣綾誨埆
g_Grid[i][c1] .iID = GRID_BLANK;
}
} // end for
for(i = 0; i < COLS; i ++)
{
// 鎷愮偣1蹇呴』涓虹└鏍?br/> if(g_Grid[r1][i] .iID != GRID_BLANK)
continue;
// 璧風偣鍜屾嫄鐐?鑱旒氬悧錛?br/> g_Grid[r1][i] .iID = iID;
if(GridsConnected(r1, i, c1))
{
// 鏄殑錛屾嫄鐐? 蹇呴』涓虹└鏍?br/> if(g_Grid[r2][i] .iID != GRID_BLANK)
{
// 榪樺師鎷愮偣1鐨動被鍒紝灝濊瘯涓嬩竴鏉¤礬寰?br/> g_Grid[r1][i] .iID = GRID_BLANK;
continue;
}
// 鎷愮偣2鍜屾嫄鐐?鑱旒氬悧錛?br/> g_Grid[r2][i] .iID = iID;
if(GridsConnected(i, r1, r2, FALSE))
{
// 鏄殑錛出扐鍚庡垽鏂嫄鐐?鍜?r2, c2)鏄惁鑱旒?br/> if(GridsConnected(r2, i, c2))
{
// 鏄殑錛屻礬寰勤壘鍒幫紝榪樺師鎷愮偣綾誨埆
g_Grid[r1][i] .iID = GRID_BLANK;
g_Grid[r2][i] .iID = GRID_BLANK;
//
OutputPath(r1, c1, r1, i);
OutputPath(r1, i, r2, i);
OutputPath(r2, i, r2, c2);
return TRUE;
}
}
// 鎷愮偣2鍜屾嫄鐐?涓嶉氾紝榪樺師鎷愮偣綾誨埆錛岸皾璇曚笅涓琛?br/> g_Grid[r1][i] .iID = GRID_BLANK;
g_Grid[r2][i] .iID = GRID_BLANK;
}
else
{
// 璧風偣鍜屾嫄鐐?涓嶉氾紝鍒欒繕鍘熸嫄鐐圭被鍒紝灝濊瘯涓嬩竴鏉¤礬寰?br/> g_Grid[r1][i] .iID = GRID_BLANK;
}
}
return FALSE;
}
// 妯℃嫙鐐瑰嚮涓榧豹爣銆傚疄闄呮粲鍐墊湁鐐逛笉涓鏍鳳紝榧豹爣娌℃湁鐐瑰嚮涓錛屻嚦灝戠湅璧鋒撒鏄繖鏍楓備簨瀹炰芄鍙槸鐐瑰嚮濱嗙涓嬈★紝鍚庝竴嬈℃病鏈夌偣鍑匯傜敤SendInput闀涓鏍楓?br/>void MouseClick(const CPoint& p1, const CPoint& p2)
{
// 灝骨鎴峰尯鍧愭爣杞崲涓哄睆騫曞潗鏍?br/> CPoint pp1(p1), pp2(p2);
::ClientToScreen(g_hLLKWnd, &pp1);
::ClientToScreen(g_hLLKWnd, &pp2);
// 鐐瑰嚮涓榧豹爣
/* */
::SetCursorPos(pp1 .x, pp1 .y);
mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep(100);
::SetCursorPos(pp2 .x, pp2 .y);
mouse_event( MOUSEEVENTF_LEFTDOWN , 0, 0, 0, 0);
mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
/*
INPUT clk;
ZeroMemory(&clk, sizeof(clk));
clk .type = INPUT_MOUSE;
clk . mi .dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP;
clk . mi .dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP;
::SetCursorPos(pp1 .x, pp1 .y);
VERIFY(1 == SendInput(1, &clk, sizeof(clk)));
Sleep(300);
::SetCursorPos(pp2 .x, pp2 .y);
VERIFY(1 == SendInput(1, &clk, sizeof(clk)));
Sleep(300);
*/
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=370124