www.pudn.com > XmudOSr.rar > MainFunction.cpp


#include "stdafx.h" 
#include "XMudClient.h" 
#include "MainWnd.h" 
#include "MainScreen.h" 
#include "3DFunction.h" 
#include "faceplate.h" 
#include "3DSound.h" 
#include "MenuCreateNew.h" 
#include "NpcInfo.h" 
 
extern CString g_szInputMsg; 
extern int g_nSelStart; 
extern int g_nSelEnd; 
extern int g_nInputMsgPos; 
 
extern D3DVECTOR g_lightgammer; 
extern LPDIRECT3DRMLIGHT g_parallel; 
 
extern rmfullglobals myglobs; 
extern RECT rc3DMainFace; 
extern CList quicktalklist; 
extern CStringList g_strlistMesssage; 
extern CStringList g_szInputMsgList; 
extern CStringList g_strlistOnline; 
extern CListnpcskilllist; 
extern CList  chatchannellist; 
extern CStringList g_strlistChannel; 
extern CListplayerlist; 
extern CListequiplist; 
extern CListequiprentlist; 
//extern CStringList g_equiprentlist; 
 
extern TOldMsg m_OldMsg; 
extern CList  skilllist;	//	技能信息链表 
// Nuke +1 
extern CList npcAsklist; 
 
extern SOCKET hLCltForRSvrSock; 
extern void SaveConfigFile(void); 
 
//鼠标左键按下 
void CMainScreen::GameMainOnLButtonDown(POINT Pos) 
{ 
	if( nMouseState == MouseNone ) 
	{ 
		nMouseState = LButtonDown; 
 
		if(PtInRect(&rc3DMainFace,Pos))//在3D视区内 
		{ 
			nMouseWorkField = _3DField; 
			D3DOnLButtonDown(Pos); 
			return; 
		} 
		else if(PtInRect(&rcSysUseField, Pos))//在系统功能区 
		{ 
			nMouseWorkField = SysUseField; 
			SysUseLButtonDown(Pos); 
  	  mUserFD.bReDraw[0] = TRUE; 
	    mUserFD.bReDraw[1] = TRUE; 
			return; 
		} 
		else if(PtInRect(&rcUserUseField, Pos))//在用户功能区 
		{ 
			nMouseWorkField = UserUseField; 
			UserUseLButtonDown(Pos); 
			return; 
		} 
		else if(PtInRect(&rcFirstField, Pos))//在第一滚动条区 
		{ 
			nMouseWorkField = FirstField; 
			FirstFieldLButtonDown(Pos); 
			return; 
		} 
		else if(PtInRect(&rcSecondField, Pos))//在第二滚动条区 
		{ 
			nMouseWorkField = SecondField; 
			SecondFieldLButtonDown(Pos); 
			return; 
		} 
		else if(PtInRect(&rcTalkMessField, Pos))//在对话信息区 
		{ 
			nMouseWorkField = TalkMessField; 
			if(mTalkFD.mDragBar.LButtonDown(Pos)) 
      { 
				mTalkFD.bReDraw[0] = TRUE; 
				mTalkFD.bReDraw[1] = TRUE; 
      } 
			return; 
		} 
		else if(PtInRect(&rcInputMsgField, Pos))//在命令输入框区 
		{ 
			nMouseWorkField = InputMsgField; 
			InputMsgFieldLButtonDown(Pos); 
			return; 
		} 
		else if(PtInRect(&rcClearScreen, Pos))//清屏按钮 
		{ 
      bClearScrRed = 1; 
			nMouseWorkField = ClearScreenField; 
  	  mUserFD.bReDraw[0] = TRUE; 
	    mUserFD.bReDraw[1] = TRUE; 
		} 
	} 
} 
 
//系统功能区鼠标按下 
void CMainScreen::SysUseLButtonDown(POINT Pos) 
{ 
	D3DVECTOR pSysSoundPos = D3DVECTOR(15,0,15); 
	pSysSoundPos.x += (rand() % 2 == 0 ? (rand() % 250) : -(rand() % 250)); 
	pSysSoundPos.z += (rand() % 2 == 0 ? (rand() % 250) : -(rand() % 250)); 
 
	if(PtInRect(&mSysFD.rcCommunicate,Pos)) 
	{ 
		mSysFD.whatBtnDown = BtnCommunicate;  //频道按钮按下 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mUserFD.nSysStatus = UBS_communicate; 
    Send(hLCltForRSvrSock,szGetChannel); 
		mFirstFD.bReDraw[0] = TRUE; 
		mFirstFD.bReDraw[1] = TRUE; 
	} 
	else if(PtInRect(&mSysFD.rcAdventure,Pos)) 
	{ 
		mSysFD.whatBtnDown = BtnAdventure;    //冒险按钮按下 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mUserFD.nSysStatus = UBS_adventure; 
		mFirstFD.nShowState = SHOWSKILL; 
		mFirstFD.bReDraw[0] = TRUE; 
		mFirstFD.bReDraw[1] = TRUE; 
	} 
	else if(PtInRect(&mSysFD.rcPractice,Pos)) 
	{ 
		mSysFD.whatBtnDown = BtnPractice;     //武术按钮按下 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mUserFD.nSysStatus = UBS_practice; 
		mFirstFD.nShowState = SHOWSKILL; 
		mFirstFD.bReDraw[0] = TRUE; 
		mFirstFD.bReDraw[1] = TRUE; 
	} 
	else if(PtInRect(&mSysFD.rcBasicSkill,Pos)) 
	{ 
		mSysFD.whatBtnDown = BtnBasicSkill;   //道具按钮是否按下 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mUserFD.nSysStatus = UBS_basicskill; 
		mFirstFD.nShowState = SHOWEQUIP; 
		mFirstFD.bReDraw[0] = TRUE; 
		mFirstFD.bReDraw[1] = TRUE; 
	} 
	else if(PtInRect(&mSysFD.rcOrganize,Pos)) 
	{ 
		mSysFD.whatBtnDown = BtnOrganize;     //组织按钮是否按下 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mUserFD.nSysStatus = UBS_organize; 
//		mFirstFD.nShowState = SHOWEQUIP; 
		mFirstFD.bReDraw[0] = TRUE; 
		mFirstFD.bReDraw[1] = TRUE; 
	} 
	else if(PtInRect(&mSysFD.rcFamily,Pos)) 
	{ 
		mSysFD.whatBtnDown = BtnFamily;       //门派按钮是否按下 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mUserFD.nSysStatus = UBS_family; 
//		mFirstFD.nShowState = SHOWEQUIP; 
		mFirstFD.bReDraw[0] = TRUE; 
		mFirstFD.bReDraw[1] = TRUE; 
	} 
	else if(PtInRect(&mSysFD.rcEmotion,Pos)) 
	{ 
		mSysFD.whatBtnDown = BtnEmotion;      //表情按钮按下 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mUserFD.nSysStatus = UBS_emotion; 
		mFirstFD.bReDraw[0] = TRUE; 
		mFirstFD.bReDraw[1] = TRUE; 
	} 
/* 
	else if(PtInRect(&mSysFD.rcHappyface,Pos)) 
	{ 
    SetRect(&mSecondFD.rcGreenUp,299,601,356,621);			//橘色按钮资源位置 
    SetRect(&mSecondFD.rcGreenDown,  0,627, 57,647);		//橘色按钮按下 
		mSysFD.whatBtnDown = BtnHappyface;//高兴表情 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mSecondFD.nKindState = ETK_smile; 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
	} 
	else if(PtInRect(&mSysFD.rcAngryface,Pos)) 
	{ 
    SetRect(&mSecondFD.rcGreenUp,356,601,413,621);			//红色按钮资源位置 
    SetRect(&mSecondFD.rcGreenDown, 57,627,114,647);		//红色按钮按下 
		mSysFD.whatBtnDown = BtnAngryface;//愤怒表情 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mSecondFD.nKindState = ETK_angry; 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
	} 
	else if(PtInRect(&mSysFD.rcBuleface,Pos)) 
	{ 
    SetRect(&mSecondFD.rcGreenUp,413,601,470,621);			//蓝色按钮资源位置 
    SetRect(&mSecondFD.rcGreenDown,114,627,171,647);		//蓝色按钮按下 
		mSysFD.whatBtnDown = BtnBuleface;//忧伤表情 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mSecondFD.nKindState = ETK_cry; 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
	} 
	else if(PtInRect(&mSysFD.rcOthereface,Pos)) 
	{ 
    SetRect(&mSecondFD.rcGreenUp,470,601,527,621);			//绿色按钮资源位置 
    SetRect(&mSecondFD.rcGreenDown,171,627,228,647);		//绿色按钮按下 
		mSysFD.whatBtnDown = BtnOtherface;//其他表情 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mSecondFD.nKindState = ETK_other; 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
	} 
*/ 
	else if(PtInRect(&mSysFD.rcOption,Pos)) 
	{ 
		mSysFD.whatBtnDown = BtnOption;//系统按钮 
		PlaySoundDS(PRESSBUTTON,pSysSoundPos,0); 
		mUserFD.nSysStatus = UBS_system; 
		// Spock +1 
		g_szInputMsg = "Save"; 
		g_nSelStart = 0; 
		g_nSelEnd = 0; 
		g_nInputMsgPos = g_szInputMsg.GetLength(); 
  	bChangeInputMsg[0] = TRUE; 
   	bChangeInputMsg[1] = TRUE; 
	} 
} 
 
static long LastBtnDown=-1; 
 
void CMainScreen::UserFDDraw() 
{ 
  RECT rcSour; 
   int nTempStatus; 
	{ 
    if(mUserFD.nSysStatus>=0){ 
      bltObject(rcUserUseField.left, 
        rcUserUseField.top, 
        myglobs.g_lpDDSGameMenu, 
        &rcUserUseField, 
        DDBLTFAST_SRCCOLORKEY); 
      nTempStatus = (mUserFD.nSysStatus >> 8) - 1; 
      rcSour = mUserFD.rcOrgBtn[nTempStatus]; 
      rcSour.left -= 2; 
      rcSour.top  -= 2; 
      rcSour.right += (mUserFD.nCount[nTempStatus] - 1) * UB_XSPACE; 
      bltObject(rcUserUseField.left, 
        rcUserUseField.top, 
        myglobs.g_lpDDSGameMenu, 
        &rcSour, 
        DDBLTFAST_SRCCOLORKEY); 
    } 
    switch(LastBtnDown){ 
    case BtnCommunicate: 
      bltObject(mSysFD.rcCommunicate.left, 
        mSysFD.rcCommunicate.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcCommunicate, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnAdventure: 
      bltObject(mSysFD.rcAdventure.left, 
        mSysFD.rcAdventure.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcAdventure, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnPractice: 
      bltObject(mSysFD.rcPractice.left, 
        mSysFD.rcPractice.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcPractice, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnBasicSkill: 
      bltObject(mSysFD.rcBasicSkill.left, 
        mSysFD.rcBasicSkill.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcBasicSkill, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnOrganize: 
      bltObject(mSysFD.rcOrganize.left, 
        mSysFD.rcOrganize.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcOrganize, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnFamily: 
      bltObject(mSysFD.rcFamily.left, 
        mSysFD.rcFamily.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcFamily, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnEmotion: 
      bltObject(mSysFD.rcEmotion.left, 
        mSysFD.rcEmotion.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcEmotion, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnOption: 
      bltObject(mSysFD.rcOption.left, 
        mSysFD.rcOption.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcOption, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    default: 
      break; 
    } 
    switch(mSysFD.whatBtnDown) 
    { 
    case BtnCommunicate: 
      bltObject(mSysFD.rcCommunicate.left, 
        mSysFD.rcCommunicate.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcCommunicateDownSource, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnAdventure: 
      bltObject(mSysFD.rcAdventure.left, 
        mSysFD.rcAdventure.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcAdventureDownSource, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnPractice: 
      bltObject(mSysFD.rcPractice.left, 
        mSysFD.rcPractice.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcPracticeDownSource, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnBasicSkill: 
      bltObject(mSysFD.rcBasicSkill.left, 
        mSysFD.rcBasicSkill.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcBasicSkillDownSource, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnOrganize: 
      bltObject(mSysFD.rcOrganize.left, 
        mSysFD.rcOrganize.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcOrganizeDownSource, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnFamily: 
      bltObject(mSysFD.rcFamily.left, 
        mSysFD.rcFamily.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcFamilyDownSource, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnEmotion: 
      bltObject(mSysFD.rcEmotion.left, 
        mSysFD.rcEmotion.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcEmotionDownSource, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    case BtnOption: 
      bltObject(mSysFD.rcOption.left, 
        mSysFD.rcOption.top, 
        myglobs.g_lpDDSGameMenu, 
        &mSysFD.rcOptionDownSource, 
        DDBLTFAST_SRCCOLORKEY); 
      break; 
    default: 
      break; 
    } 
    if(mUserFD.nWhatBtnDown>=0){ 
      RECT rcTmp,rcTmpSour; 
      nTempStatus = (mUserFD.nSysStatus >> 8) - 1; 
      rcTmpSour = mUserFD.rcOrgBtn[nTempStatus]; 
      rcTmpSour.left  += (mUserFD.nWhatBtnDown * UB_XSPACE); 
      rcTmpSour.right += (mUserFD.nWhatBtnDown * UB_XSPACE); 
      switch(mUserFD.nStatus) 
      { 
      case UB_mousedown: 
        rcTmpSour.top -= UB_HEIGHT + 6; 
        rcTmpSour.bottom -= UB_HEIGHT + 6; 
      case UB_mouseon: 
        rcTmpSour.top -= UB_HEIGHT + 6; 
        rcTmpSour.bottom -= UB_HEIGHT + 6; 
      case UB_mousenone: 
        break; 
      default: 
        mUserFD.nStatus = UB_mousenone; 
        mUserFD.nWhatBtnDown = UB_none; 
        return; 
      } 
      rcTmp = mUserFD.rcBtns[mUserFD.nWhatBtnDown]; 
      bltObject(rcTmp.left, 
        rcTmp.top, 
        myglobs.g_lpDDSGameMenu, 
        &rcTmpSour, 
        DDBLTFAST_SRCCOLORKEY); 
    } 
 
    if(bClearScrRed==1){ 
      bltObject(rcClearScreen.left, 
        rcClearScreen.top, 
        myglobs.g_lpDDSGameMenu, 
        &rcClearScreenDownSource, 
        DDBLTFAST_SRCCOLORKEY); 
    }else if(bClearScrRed==2){ 
      bltObject(rcClearScreen.left, 
        rcClearScreen.top, 
        myglobs.g_lpDDSGameMenu, 
        &rcClearScreenOnSource, 
        DDBLTFAST_SRCCOLORKEY); 
    }else{ 
      bltObject(rcClearScreen.left, 
        rcClearScreen.top, 
        myglobs.g_lpDDSGameMenu, 
        &rcClearScreen, 
        DDBLTFAST_SRCCOLORKEY); 
    } 
	} 
} 
 
void CMainScreen::UserUseLButtonDown(POINT Pos) 
{ 
	UserBtnMake(2); 
 
	CPlayerInfo *lpPlayerInfo; 
	lpPlayerInfo = playerlist.GetHead(); 
	 
	BOOL bCanReturn = FALSE; 
 
	int nWhatBtn = mUserFD.nSysStatus|mUserFD.nWhatBtnDown; 
	 
	switch(nWhatBtn) 
	{ 
	case UB_joinchannel: 
		g_szInputMsg = "JoinChannel "; 
		break; 
	case UB_channel: 
		g_szInputMsg = "Channel"; 
		break; 
	case UB_talk: 
		g_szInputMsg = "Talk "; 
		break; 
	case UB_shout: 
		g_szInputMsg = "Shout "; 
		break; 
	case UB_tell: 
		g_szInputMsg = "Tell "; 
		break; 
	case UB_who_l: 
		g_szInputMsg = "Who-l"; 
		break; 
	case UB_who: 
		g_szInputMsg = "Who"; 
		break; 
	case UB_leavechannel: 
		g_szInputMsg = "LeaveChannel"; 
		break; 
 
	case UB_ask: 
		g_szInputMsg = "Ask "; 
		g_szInputMsg += m_OldMsg.szAsk; 
		break; 
	case UB_look: 
		g_szInputMsg = "Look "; 
		break; 
	case UB_apprentice: 
		g_szInputMsg = "Apprentice"; 
		break; 
	case UB_skill: 
		g_szInputMsg = "Skill"; 
		break; 
	case UB_drill: 
	case UB_fight: 
		g_szInputMsg = "Fight"; 
		break; 
 
	case UB_kill: 
		g_szInputMsg = "Kill"; 
		break; 
	case UB_dazuo: 
		g_szInputMsg = "DaZuo "; 
		g_szInputMsg += m_OldMsg.szDaZuo; 
		break; 
	case UB_tuna: 
		g_szInputMsg = "TuNa "; 
		g_szInputMsg += m_OldMsg.szTuNa; 
		break; 
	case UB_yungong: 
		g_szInputMsg = "YunGong "; 
		g_szInputMsg += m_OldMsg.szYunGong; 
		break; 
	case UB_mapping: 
		g_szInputMsg = "Mapping "; 
		break; 
	case UB_escape: 
		g_szInputMsg = "Escape "; 
		break; 
	case UB_restart:  
		g_szInputMsg = "Restart"; 
		break; 
 
	case UB_use: 
		g_szInputMsg = "Use "; 
		g_szInputMsg += m_OldMsg.szUse; 
		break; 
	case UB_watch: 
		g_szInputMsg = "Look "; 
		g_szInputMsg += m_OldMsg.szLook; 
		break; 
	case UB_give: 
		g_szInputMsg = "Give "; 
  	g_szInputMsg += m_OldMsg.szGive; 
		break; 
	case UB_get: 
		g_szInputMsg = "Get "; 
		g_szInputMsg += m_OldMsg.szGet; 
		break; 
	case UB_drop: 
		g_szInputMsg = "Drop "; 
		g_szInputMsg += m_OldMsg.szDrop; 
		break; 
	case UB_arm: 
		g_szInputMsg = "Arm "; 
		g_szInputMsg += m_OldMsg.szArm; 
		break; 
	case UB_unarm: 
		g_szInputMsg = "Unarm "; 
		g_szInputMsg += m_OldMsg.szUnArm; 
		break; 
	case UB_practice: 
		g_szInputMsg = "Practice "; 
		g_szInputMsg += m_OldMsg.szPractice; 
		break; 
 
	case UB_jointeam: 
		g_szInputMsg = "JoinTeam "; 
		break; 
	case UB_leaveteam: 
		g_szInputMsg = "LeaveTeam"; 
		break; 
	case UB_who_t: 
		g_szInputMsg = "Who-t"; 
		break; 
	case UB_format: 
		g_szInputMsg = "Format "; 
		g_szInputMsg += m_OldMsg.szFormat; 
		break; 
	case UB_unformat: 
		g_szInputMsg = "Unformat"; 
		break; 
 
	case UB_assign: 
		g_szInputMsg = "Assign "; 
		g_szInputMsg += m_OldMsg.szAssign; 
		break; 
	case UB_cancel: 
		g_szInputMsg = "Cancel "; 
		g_szInputMsg += m_OldMsg.szCancel; 
		break; 
	case UB_newleader: 
		g_szInputMsg = "NewLeader "; 
		break; 
	case UB_newfamily: 
		g_szInputMsg = "NewFamily "; 
		break; 
	case UB_newnpc: 
		g_szInputMsg = "NewNPC "; 
		break; 
	case UB_setskill: 
		g_szInputMsg = "SetSkill "; 
		break; 
 
	case UB_cheer: 
    SetRect(&mSecondFD.rcGreenUp,470,601,527,621); 
    SetRect(&mSecondFD.rcGreenDown,171,627,228,647); 
		mSecondFD.nKindState = ETK_smile; 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
		return; 
	case UB_angry: 
    SetRect(&mSecondFD.rcGreenUp,356,601,413,621); 
    SetRect(&mSecondFD.rcGreenDown, 57,627,114,647); 
		mSecondFD.nKindState = ETK_angry; 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
		return; 
	case UB_sadness: 
    SetRect(&mSecondFD.rcGreenUp,413,601,470,621); 
    SetRect(&mSecondFD.rcGreenDown,114,627,171,647); 
		mSecondFD.nKindState = ETK_cry; 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
		return; 
	case UB_happy: 
    SetRect(&mSecondFD.rcGreenUp,299,601,356,621); 
    SetRect(&mSecondFD.rcGreenDown,  0,627, 57,647); 
		mSecondFD.nKindState = ETK_other; 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
		return; 
 
	case UB_stop: 
		g_szInputMsg = "Exit"; 
		break; 
	case UB_music: 
		g_szInputMsg = m_OldMsg.szMusic; 
		break; 
	case UB_addlight: 
		g_lightgammer.x += 0.2f; 
		g_lightgammer.y += 0.2f; 
		g_lightgammer.z += 0.2f; 
		g_parallel->SetColorRGB( g_lightgammer.x,g_lightgammer.y,g_lightgammer.z); 
    SaveConfigFile(); 
		return; 
	case UB_sublight: 
		g_lightgammer.x -= 0.2f; 
		g_lightgammer.y -= 0.2f; 
		g_lightgammer.z -= 0.2f; 
		g_parallel->SetColorRGB( g_lightgammer.x,g_lightgammer.y,g_lightgammer.z); 
    SaveConfigFile(); 
		return; 
	case UB_switchport: 
		g_szInputMsg = "SwitchPort"; 
		break; 
	case UB_acceptfight: 
		g_szInputMsg = "AcceptFight"; 
		break; 
	case UB_rejectfight: 
		g_szInputMsg = "RejectFight"; 
		break; 
	default: 
		return; 
	} 
	g_nSelStart = 0; 
	g_nSelEnd = 0; 
	bChangeInputMsg[0] = TRUE; 
	bChangeInputMsg[1] = TRUE; 
	if(g_szInputMsg[g_szInputMsg.GetLength()-1] != ' ')	bCanReturn = TRUE; 
	g_nSelStart = g_szInputMsg.Find(' ')+1; 
	g_nSelEnd = g_szInputMsg.GetLength(); 
	if((g_nSelStart == 0)||(g_nSelStart > g_nSelEnd)) g_nSelStart = g_nSelEnd; 
	g_nInputMsgPos = g_szInputMsg.GetLength(); 
	if(mUserFD.nWhatBtnDown == UB_yungong) 
	{ 
		g_nInputMsgPos = 8; 
		g_nSelStart = 8; 
		g_nSelEnd = g_szInputMsg.Find(' ',8); 
	} 
	if((GetAsyncKeyState(VK_CONTROL)&0x8000)&&(bCanReturn)) 
	{ 
		PostMessage(myglobs.hWndMain, WM_KEYDOWN, (WPARAM)VK_RETURN, 0); 
		PostMessage(myglobs.hWndMain, WM_KEYUP, (WPARAM)VK_RETURN, 0); 
	} 
} 
 
void CMainScreen::FirstFieldLButtonDown(POINT Pos) 
{ 
	if(!mFirstFD.mDragBar.LButtonDown(Pos)){ 
		for(int i=0;i<8;i++) 
			if(PtInRect(&mFirstFD.rcBars[i], Pos)) 
				break; 
		if(i == 8) return; 
		i += mFirstFD.mDragBar.nFirstPos; 
		if(i >= mFirstFD.mDragBar.GetCount()) return; 
		DoClickOneFieldFunction(i); 
    mFirstFD.bReDraw[0] = TRUE; 
    mFirstFD.bReDraw[1] = TRUE; 
	} 
	else 
  { 
    mFirstFD.bReDraw[0] = TRUE; 
    mFirstFD.bReDraw[1] = TRUE; 
  } 
} 
 
void CMainScreen::SecondFieldLButtonDown(POINT Pos) 
{ 
	if(mSecondFD.mDragBar.LButtonDown(Pos)){ 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
	}else { 
		RECT rcTmp; 
		for(int i=0;i<27;i++){ 
			SetRect(&rcTmp,9,373,66,393); 
			rcTmp.top += (i/3)*SNB_HEIGHT; 
			rcTmp.bottom += (i/3)*SNB_HEIGHT; 
			rcTmp.left += (i%3)*SNB_WIDTH; 
			rcTmp.right += (i%3)*SNB_WIDTH; 
			if(PtInRect(&rcTmp, Pos)) 
				break; 
		} 
		if(i == 27) return; 
		i += mSecondFD.mDragBar.nFirstPos * 3; 
		if(i >= mSecondFD.nEmoteCount) return; 
 
 
		bltObject(rcTmp.left,rcTmp.top, 
			myglobs.g_lpDDSGameMenu, 
			&mSecondFD.rcGreenDown, 
			DDBLTFAST_SRCCOLORKEY); 
 
 
		rcTmp.left += 5; 
		rcTmp.right -= 5; 
		rcTmp.top += 3+3;  
		rcTmp.bottom -= 2; 
 
		TEmote * lpEmote = listCurEmote.GetAt(listCurEmote.FindIndex(i)); 
		CString szEmote = (mSecondFD.nShowState == EMT_SHOW_CHINESE)? lpEmote->szCEmote : lpEmote->szEmote; 
		DrawGameString((char *)(LPCSTR)szEmote 
						,&rcTmp 
						,DT_LEFT | DT_VCENTER 
						,RGB(0,0,0) 
						,RGB(0,0,0),TRUE); 
		rcTmp.left --; 
		rcTmp.right --; 
		rcTmp.top --; 
		rcTmp.bottom --; 
		DrawGameString((char *)(LPCSTR)szEmote 
						,&rcTmp 
						,DT_LEFT | DT_VCENTER 
						,RGB(255,248,122) 
						,RGB(0,0,0),TRUE); 
		mSecondFD.nSelect = i - mSecondFD.mDragBar.nFirstPos * 3; 
		BOOL bReturn = FALSE; 
		g_szInputMsg = CString(":") + lpEmote->szEmote; 
		g_szInputMsg += " "; 
		mSecondFD.szEmote = g_szInputMsg; 
		mSecondFD.nType = lpEmote->nType; 
		if(mSecondFD.nType & EMT_HAVE_NONAME) 
			bReturn = TRUE; 
		if(GetAsyncKeyState(VK_SHIFT) & 0x8000)//if Shift Down 
		{ 
			if( mSecondFD.nType & EMT_HAVE_SELF) 
			{ 
				g_szInputMsg += "me"; 
				bReturn = TRUE; 
			} 
			else bReturn = FALSE; 
		} 
 
		g_nSelStart = 0; 
		g_nSelEnd = 0; 
		g_nInputMsgPos = g_szInputMsg.GetLength(); 
  	bChangeInputMsg[0] = TRUE; 
	  bChangeInputMsg[1] = TRUE; 
 
		if((GetAsyncKeyState(VK_CONTROL) & 0x8000)&&(bReturn))//if Ctrl Down 
		{ 
			PostMessage(myglobs.hWndMain, WM_KEYDOWN, (WPARAM)VK_RETURN, 0); 
			PostMessage(myglobs.hWndMain, WM_KEYUP, (WPARAM)VK_RETURN, 0); 
		} 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
 
	} 
	return; 
} 
 
int GetCursorPos(int x) 
{ 
	int nCurLen, nStrLen; 
	int nCurPos; 
	CString strLeft; 
	bool bChinaChar; 
	nStrLen = g_szInputMsg.GetLength(); 
	nCurLen = GetStrWidth(g_szInputMsg, TRUE); 
	x -= 5; 
	if( x >= nCurLen ) return nStrLen;  
	else if(x <= 0)    return 0; 
	nCurPos = x * nStrLen / nCurLen; 
	strLeft = g_szInputMsg.Left(nCurPos); 
	nCurLen = GetStrWidth(strLeft, TRUE); 
	if(nCurLen > x) 
	{ 
		do  
		{ 
			nCurPos --; 
			strLeft = g_szInputMsg.Left(nCurPos); 
			nCurLen = GetStrWidth(strLeft, TRUE); 
		}while(nCurLen > x); 
	} 
	else 
	{ 
		do  
		{ 
			nCurPos ++; 
			strLeft = g_szInputMsg.Left(nCurPos); 
			nCurLen = GetStrWidth(strLeft, TRUE); 
		}while(nCurLen < x); 
		nCurPos--; 
	} 
	bChinaChar = false; 
	for(x=0;x 0) 
		pos--; 
	ch = g_szInputMsg.GetAt(pos); 
	if(IsChar(ch)) 
	{ 
		do { 
			ch = g_szInputMsg.GetAt(pos); 
			if( ! IsChar(ch)) 
			{ 
				pos++; 
				break; 
			} 
			pos--; 
		} while(pos >= 0); 
	} 
	else if(IsDBCSLeadByte(ch)) 
	{ 
		do { 
			ch = g_szInputMsg.GetAt(pos); 
			if( ! IsDBCSLeadByte(ch)) 
			{ 
				pos++; 
				break; 
			} 
			pos--; 
		} while(pos >= 0); 
	} 
	if(pos < 0) pos = 0; 
	g_nSelStart = pos; 
	ch = g_szInputMsg.GetAt(pos); 
	pos++; 
	if( pos >= g_szInputMsg.GetLength()) 
	{ 
	}else if(IsChar(ch)){ 
		do { 
			ch = g_szInputMsg.GetAt(pos); 
			pos++; 
			if( ! IsChar(ch)){ 
				pos--; 
				break; 
			} 
		} while(pos < g_szInputMsg.GetLength()); 
	}else if(IsDBCSLeadByte(ch)){ 
		do { 
			ch = g_szInputMsg.GetAt(pos); 
			pos++; 
			if( ! IsDBCSLeadByte(ch)) 
			{ 
				pos--; 
				break; 
			} 
		} while(pos < g_szInputMsg.GetLength()); 
	} 
	g_nSelEnd = pos; 
} 
 
void CMainScreen::InputMsgFieldLButtonDown(POINT Pos) 
{ 
	nMouseDownPos = g_nInputMsgPos = GetCursorPos(Pos.x); 
	g_nSelStart = g_nSelEnd = 0; 
	if(GetAsyncKeyState(VK_CONTROL)&0x8000)//if Ctrl down 
		GetWord(g_nInputMsgPos); 
	bChangeInputMsg[0] = TRUE; 
	bChangeInputMsg[1] = TRUE; 
	return; 
} 
 
extern BOOL g_Clear3DMessage[2]; 
void CMainScreen::GameMainOnLButtonUp(POINT Pos) 
{ 
  if(( nMouseState == LButtonDown )||( nMouseState == LButtonDrag )) 
  { 
    nMouseState = MouseNone; 
    switch(nMouseWorkField) 
    { 
    case FieldUnknown: break; 
    case FirstField: 
      if(mFirstFD.mDragBar.LButtonUp(Pos)){ 
        mFirstFD.bReDraw[0] = TRUE; 
        mFirstFD.bReDraw[1] = TRUE; 
      } 
      break; 
    case SecondField: 
      SecondFieldLButtonUp(Pos); 
      break; 
    case _3DField: 
      D3DOnLButtonUp(Pos); 
      break; 
    case SysUseField: 
      SysUseLButtonUp(Pos); 
      mUserFD.bReDraw[0] = TRUE; 
      mUserFD.bReDraw[1] = TRUE; 
      break; 
    case UserUseField: 
      UserBtnMake(1); 
      break; 
    case ClearScreenField: 
      if(PtInRect(&rcClearScreen,Pos)) 
      { 
        bClearScrRed = 2; 
        g_strlistMesssage.RemoveAll(); 
        g_Clear3DMessage[0]=TRUE; 
        g_Clear3DMessage[1]=TRUE; 
        mUserFD.bReDraw[0] = TRUE; 
        mUserFD.bReDraw[1] = TRUE; 
      } 
 
      break; 
    case InputMsgField: break; 
    case TalkMessField: 
      if(mTalkFD.mDragBar.LButtonUp(Pos)){ 
        mTalkFD.bReDraw[0] = TRUE; 
        mTalkFD.bReDraw[1] = TRUE; 
      } 
      break; 
    default: 
      break; 
    } 
    nMouseWorkField = FieldUnknown; 
  } 
} 
 
void CMainScreen::SecondFieldLButtonUp(POINT Pos) 
{ 
	if(mSecondFD.mDragBar.LButtonUp(Pos)){ 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
	}else if(mSecondFD.nSelect != -1){ 
		RECT rcTmp; 
		TEmote * lpEmote; 
		SetRect(&rcTmp,9,373,66,393); 
		int i = mSecondFD.nSelect; 
		rcTmp.top += (i/3)*SNB_HEIGHT; 
		rcTmp.bottom += (i/3)*SNB_HEIGHT; 
		rcTmp.left += (i%3)*SNB_WIDTH; 
		rcTmp.right += (i%3)*SNB_WIDTH; 
 
 
		bltObject(rcTmp.left,rcTmp.top, 
			myglobs.g_lpDDSGameMenu, 
			&mSecondFD.rcGreenUp, 
			DDBLTFAST_SRCCOLORKEY); 
 
 
		lpEmote = listCurEmote.GetAt(listCurEmote.FindIndex(i+mSecondFD.mDragBar.nFirstPos * 3)); 
		CString szEmote = (mSecondFD.nShowState == EMT_SHOW_CHINESE)? lpEmote->szCEmote : lpEmote->szEmote; 
 
		rcTmp.left += 5; 
		rcTmp.right -= 5; 
		rcTmp.top += 2+3;  
		rcTmp.bottom -= 3; 
		DrawGameString((char *)(LPCSTR)szEmote 
						,&rcTmp 
						,DT_LEFT | DT_VCENTER 
						,RGB(0,0,0) 
						,RGB(0,0,0),TRUE); 
		rcTmp.left --; 
		rcTmp.right --; 
		rcTmp.top --; 
		rcTmp.bottom --; 
 
		DrawGameString((char *)(LPCSTR)szEmote 
						,&rcTmp 
						,DT_LEFT | DT_VCENTER 
						,RGB(255,248,122) 
						,RGB(0,0,0),TRUE); 
		mSecondFD.nSelect = -1; 
		mSecondFD.bReDraw[0] = TRUE; 
		mSecondFD.bReDraw[1] = TRUE; 
	} 
} 
 
void CMainScreen::SysUseLButtonUp(POINT Pos) 
{ 
  LastBtnDown = mSysFD.whatBtnDown; 
	mSysFD.whatBtnDown = BtnNone; 
} 
 
void CMainScreen::GameMainOnLButtonDblClk(POINT Pos) 
{ 
	if(PtInRect(&rcInputMsgField, Pos)) 
	{ 
		g_nInputMsgPos = GetCursorPos(Pos.x); 
		GetWord(g_nInputMsgPos); 
  	bChangeInputMsg[0] = TRUE; 
	  bChangeInputMsg[1] = TRUE; 
		return; 
	} 
} 
 
void CMainScreen::GameMainOnRButtonDown(POINT Pos) 
{ 
	if(	nMouseState == MouseNone ) 
	{ 
		nMouseState = RButtonDown; 
		if(PtInRect(&rc3DMainFace,Pos)) 
		{ 
			D3DOnRButtonDown(Pos); 
			return; 
		} 
	} 
} 
 
void CMainScreen::GameMainOnRButtonUp(POINT Pos) 
{ 
	if(( nMouseState == RButtonDown )||( nMouseState == RButtonDrag )){ 
		nMouseState = MouseNone; 
		if(PtInRect(&rcInputMsgField,Pos)){ 
			ShowIconMenu(); 
		} 
	} 
} 
 
int CMainScreen::UserOnWhatBtn(POINT Pos) 
{ 
	int i; 
	RECT rcTmp; 
	for(i=0;i> 8) - 1; 
	if(i >= mUserFD.nCount[nTempStatus])	i = -1; 
	return i; 
} 
 
void CMainScreen::UserBtnMake(int nStatus) 
{ 
	mUserFD.nStatus = nStatus; 
	UserBtnMake(); 
} 
 
void CMainScreen::UserBtnMake() 
{ 
 
	if(mUserFD.nWhatBtnDown == UB_none) 
	{ 
		mUserFD.nStatus = 0; 
		return; 
	} 
	int nTempStatus = (mUserFD.nSysStatus >> 8) - 1; 
	if(mUserFD.nWhatBtnDown >= mUserFD.nCount[nTempStatus]) 
	{ 
		mUserFD.nWhatBtnDown = UB_none; 
		return; 
	} 
 
	if(mUserFD.nStatus == UB_mousenone) 
		mUserFD.nWhatBtnDown = UB_none; 
  mUserFD.bReDraw[0] = TRUE; 
  mUserFD.bReDraw[1] = TRUE; 
} 
 
void CMainScreen::GameMainOnMouseMove(POINT Pos) 
{ 
  mSysFD.ThisBtnMove=BtnNone; 
	switch(nMouseWorkField){ 
	case FieldUnknown:  
		if(nMouseState == MouseNone) 
		{ 
      if(PtInRect(&mSysFD.rcHintNameField,Pos)){ 
        if(PtInRect(&mSysFD.rcCommunicate,Pos)) 
        { 
          mSysFD.ThisBtnMove=BtnCommunicate; 
          mSysFD.LastBtnTick=timeGetTime(); 
        } 
        else if(PtInRect(&mSysFD.rcAdventure,Pos)) 
        { 
          mSysFD.ThisBtnMove=BtnAdventure; 
          mSysFD.LastBtnTick=timeGetTime(); 
        } 
        else if(PtInRect(&mSysFD.rcPractice,Pos)) 
        { 
          mSysFD.ThisBtnMove=BtnPractice; 
          mSysFD.LastBtnTick=timeGetTime(); 
        } 
        else if(PtInRect(&mSysFD.rcBasicSkill,Pos)) 
        { 
          mSysFD.ThisBtnMove=BtnBasicSkill; 
          mSysFD.LastBtnTick=timeGetTime(); 
        } 
        else if(PtInRect(&mSysFD.rcOrganize,Pos)) 
        { 
          mSysFD.ThisBtnMove=BtnOrganize; 
          mSysFD.LastBtnTick=timeGetTime(); 
        } 
        else if(PtInRect(&mSysFD.rcFamily,Pos)) 
        { 
          mSysFD.ThisBtnMove=BtnFamily; 
          mSysFD.LastBtnTick=timeGetTime(); 
        } 
        else if(PtInRect(&mSysFD.rcEmotion,Pos)){ 
          mSysFD.ThisBtnMove=BtnEmotion; 
          mSysFD.LastBtnTick=timeGetTime(); 
        } 
        else if(PtInRect(&mSysFD.rcOption,Pos)){ 
          mSysFD.ThisBtnMove=BtnOption; 
          mSysFD.LastBtnTick=timeGetTime(); 
        } 
      } 
			else if(bClearScrRed){ 
				if(PtInRect(&rcClearScreen,Pos)) 
					break; 
				bClearScrRed = 0; 
        mUserFD.bReDraw[0] = TRUE; 
        mUserFD.bReDraw[1] = TRUE; 
			}else if(mUserFD.nWhatBtnDown != UB_none){ 
				if(PtInRect(&rcUserUseField, Pos)){ 
					int i = UserOnWhatBtn( Pos ); 
					if(i != mUserFD.nWhatBtnDown){ 
						UserBtnMake(0); 
						mUserFD.nWhatBtnDown = i; 
						UserBtnMake(1); 
					} 
					break; 
				} 
				UserBtnMake(0); 
			} 
			if(PtInRect(&rcUserUseField, Pos)){ 
				mUserFD.nWhatBtnDown = UserOnWhatBtn(Pos); 
				UserBtnMake(1); 
			} 
			else if(PtInRect(&rcClearScreen,Pos)) 
			{ 
				bClearScrRed = 2; 
        mUserFD.bReDraw[0] = TRUE; 
        mUserFD.bReDraw[1] = TRUE; 
			} 
		} 
		break; 
	case FirstField:  
		if(mFirstFD.mDragBar.OnMouseMove(Pos)){ 
			mFirstFD.bReDraw[0] = TRUE; 
			mFirstFD.bReDraw[1] = TRUE; 
    } 
		break; 
	case SecondField:  
		if(mSecondFD.mDragBar.OnMouseMove(Pos)){ 
  		mSecondFD.bReDraw[0] = TRUE; 
	  	mSecondFD.bReDraw[1] = TRUE; 
    } 
		break; 
	case _3DField: break; 
	case SysUseField: break; 
	case UserUseField: break; 
	case ClearScreenField: break; 
	case InputMsgField:  
		if(nMouseState == LButtonDrag){ 
			g_nInputMsgPos = g_nSelStart = GetCursorPos(Pos.x); 
			g_nSelEnd = nMouseDownPos; 
    	bChangeInputMsg[0] = TRUE; 
	    bChangeInputMsg[1] = TRUE; 
		} 
		break; 
	case TalkMessField:  
		if(mTalkFD.mDragBar.OnMouseMove(Pos)) 
    { 
			mTalkFD.bReDraw[0] = TRUE; 
			mTalkFD.bReDraw[1] = TRUE; 
    } 
		break; 
	default: break; 
	} 
} 
 
 
void CMainScreen::ShowIconMenu() 
{ 
	CMenu	ContextMenu ; 
	CPoint  CursorPos ; 
	CQuickTalk * lpQuickTalk; 
	CQuickTalk m_QuickTalk; 
	int i,j; 
	if(!quicktalklist.IsEmpty()) 
		quicktalklist.RemoveAll(); 
 
	CFile file; 
 
	if(!file.Open("QuickTalk.dat",CFile::modeReadWrite)) 
		return; 
	while(file.Read(&m_QuickTalk,sizeof(CQuickTalk))) 
	{ 
		lpQuickTalk = new CQuickTalk; 
		strcpy(lpQuickTalk->szTitle,m_QuickTalk.szTitle); 
		strcpy(lpQuickTalk->szTalkMsg,"Talk "); 
		strcat(lpQuickTalk->szTalkMsg,m_QuickTalk.szTalkMsg); 
		quicktalklist.AddTail(lpQuickTalk); 
	} 
	file.Close(); 
 
	GetCursorPos ( & CursorPos ) ; 
	ContextMenu.CreatePopupMenu () ; 
	j = quicktalklist.GetCount(); 
	for(i=0;iszTitle ) ; 
	} 
	ContextMenu.AppendMenu ( MF_SEPARATOR); 
	ContextMenu.AppendMenu ( MF_STRING , IDR_MAINFRAME + i + 1, "编辑聊天按钮" ) ; 
	SetForegroundWindow (myglobs.hWndMain) ; 
	ContextMenu.TrackPopupMenu ( TPM_RIGHTALIGN | TPM_RIGHTBUTTON,  
		                         CursorPos.x , 
								 CursorPos.y , 
								 CWnd::FromHandle(myglobs.hWndMain), 
								 NULL ) ; 
	return ; 
} 
 
void CMainScreen::ShowQuickMsg(int nIndex) 
{ 
	CQuickTalk * lpQuickTalk; 
	if(quicktalklist.GetCount() == nIndex) 
	{ 
		return; 
	} 
	if(quicktalklist.GetCount() < nIndex+1) 
		return; 
	lpQuickTalk = quicktalklist.GetAt(quicktalklist.FindIndex(nIndex)); 
	if(g_szInputMsgList.GetCount() > MSG_PIECE_NUMBER){ 
		g_szInputMsgList.AddTail(g_szInputMsgList.RemoveHead() = lpQuickTalk->szTalkMsg); 
	}else{ 
		g_szInputMsgList.AddTail(lpQuickTalk->szTalkMsg); 
	} 
	bChangeInputMsg[0] = TRUE; 
	bChangeInputMsg[1] = TRUE; 
} 
 
CString GetENameFromOnline(CString MyString) 
{ 
  static CString  NewString; 
            BOOL  bStart; 
            long  i,s; 
  bStart=FALSE; 
  for(i=0;im_sCNAME; 
			else if(!stricmp(g_szInputMsg.Left(4),"Arm ")) 
				g_szInputMsg = CString("Arm ") + lpEquipInfo->m_sCNAME; 
			else if(!stricmp(g_szInputMsg.Left(6),"Unarm ")) 
				g_szInputMsg = CString("Unarm ") + lpEquipInfo->m_sCNAME; 
			else if(!stricmp(g_szInputMsg.Left(5),"Drop ")) 
				g_szInputMsg = CString("Drop ") + lpEquipInfo->m_sCNAME; 
			else if(!stricmp(g_szInputMsg.Left(5),"Look ")) 
				g_szInputMsg = CString("Look ") + lpEquipInfo->m_sCNAME; 
			else if(!stricmp(g_szInputMsg.Left(9),"Practice ")) 
				g_szInputMsg = CString("Practice ") + lpEquipInfo->m_sCNAME; 
			else 
				g_szInputMsg += CString(" ") + lpEquipInfo->m_sCNAME; 
    	bChangeInputMsg[0] = TRUE; 
    	bChangeInputMsg[1] = TRUE; 
		} 
		break; 
	case SHOWSKILL: 
		{ 
			lpSkillInfo = skilllist.GetAt(skilllist.FindIndex(nIndex)); 
			if(!stricmp(g_szInputMsg.Left(8),"Mapping ")) 
				g_szInputMsg += CString(" ") + lpSkillInfo->m_sCNAME; 
			else 
				g_szInputMsg = CString("Learn ") + lpSkillInfo->m_sCNAME/* +CString(" 1")*/; 
 
    	bChangeInputMsg[0] = TRUE; 
    	bChangeInputMsg[1] = TRUE; 
			bCanReturn = TRUE; 
		} 
		break; 
	case SHOWCHANNEL: 
		{ 
			g_szInputMsg = CString("JoinChannel ") + g_strlistChannel.GetAt(g_strlistChannel.FindIndex(nIndex)); 
    	bChangeInputMsg[0] = TRUE; 
    	bChangeInputMsg[1] = TRUE; 
			bCanReturn = TRUE; 
		} 
		break; 
	case SHOWCHANNELUSER: 
		{ 
			lpChatChannel = chatchannellist.GetAt(chatchannellist.FindIndex(nIndex)); 
			if(g_szInputMsg.IsEmpty()) 
				g_szInputMsg = CString("Tell ") + lpChatChannel->m_sENAME; 
			else if (g_szInputMsg[0] == ':') 
			{ 
				int pos; 
				pos = g_szInputMsg.Find(' '); 
				if(pos == -1)  
					pos = g_szInputMsg.GetLength()-1; 
				g_szInputMsg = g_szInputMsg.Left(pos+1); 
				if(g_szInputMsg != mSecondFD.szEmote) 
				{ 
					g_szInputMsg += lpChatChannel->m_sENAME; 
					bCanReturn = TRUE; 
				} 
				else if(mSecondFD.nType & EMT_HAVE_TARGET) 
				{ 
					g_szInputMsg += lpChatChannel->m_sENAME; 
					bCanReturn = TRUE; 
				} 
			} 
			else  
			{ 
				int pos; 
				pos = g_szInputMsg.Find(' '); 
				if(pos == -1)  
				{ 
					pos = g_szInputMsg.GetLength(); 
					g_szInputMsg += ' '; 
				} 
				g_szInputMsg = g_szInputMsg.Left(pos+1); 
				g_szInputMsg += lpChatChannel->m_sENAME; 
			} 
    	bChangeInputMsg[0] = TRUE; 
    	bChangeInputMsg[1] = TRUE; 
		} 
		break; 
	case SHOWNPCSKILL: 
		{ 
			if(nIndex == 0)break; 
			lpNpcSkillInfo = npcskilllist.GetAt(npcskilllist.FindIndex(nIndex)); 
			g_szInputMsg = CString("Learn ") + lpNpcSkillInfo->m_sCNAME /*+ CString(" 1")*/; 
    	bChangeInputMsg[0] = TRUE; 
    	bChangeInputMsg[1] = TRUE; 
			bCanReturn = TRUE; 
		} 
		break; 
	case SHOWNPCEQUIP: 
		break; 
	case SHOWFRIEND: 
		break; 
	case SHOWALLONLINEUSERS: 
		{ 
      CString MyString; 
			MyString = g_strlistOnline.GetAt(g_strlistOnline.FindIndex(nIndex)); 
			if(g_szInputMsg.IsEmpty()){ 
				g_szInputMsg = CString("Tell ") + GetENameFromOnline(MyString); 
			}else if (g_szInputMsg[0] == ':'){ 
				int pos; 
				pos = g_szInputMsg.Find(' '); 
				if(pos == -1) pos = g_szInputMsg.GetLength()-1; 
				g_szInputMsg = g_szInputMsg.Left(pos+1); 
				if(g_szInputMsg != mSecondFD.szEmote){ 
					g_szInputMsg += GetENameFromOnline(MyString); 
					bCanReturn = TRUE; 
				}else if(mSecondFD.nType & EMT_HAVE_TARGET){ 
					g_szInputMsg += GetENameFromOnline(MyString); 
					bCanReturn = TRUE; 
				} 
			}else{ 
				int pos; 
				pos = g_szInputMsg.Find(' '); 
				if(pos == -1){ 
					pos = g_szInputMsg.GetLength(); 
					g_szInputMsg += ' '; 
				} 
				g_szInputMsg = g_szInputMsg.Left(pos+1); 
				g_szInputMsg += GetENameFromOnline(MyString); 
			} 
    	bChangeInputMsg[0] = TRUE; 
    	bChangeInputMsg[1] = TRUE; 
		} 
		break; 
	case SHOWNPCASK: 
		lpNpcAskInfo = npcAsklist.GetAt(npcAsklist.FindIndex(nIndex)); 
			g_szInputMsg = CString("Ask ") + lpNpcAskInfo->m_sCNAME; 
		bChangeInputMsg[0] = TRUE; 
		bChangeInputMsg[1] = TRUE; 
		bCanReturn = TRUE; 
		break; 
	} 
	if(bChangeInputMsg[0]||bChangeInputMsg[1]) 
	{ 
		g_szInputMsg += " "; 
		g_nSelStart = 0; 
		g_nSelEnd = 0; 
		g_nInputMsgPos = g_szInputMsg.GetLength(); 
		if((GetAsyncKeyState(VK_CONTROL)&0x8000)&&(bCanReturn))//if Ctrl Down 
		{ 
			PostMessage(myglobs.hWndMain, WM_KEYDOWN, (WPARAM)VK_RETURN, 0); 
			PostMessage(myglobs.hWndMain, WM_KEYUP, (WPARAM)VK_RETURN, 0); 
		} 
	} 
}