📄 hikerwbui.cpp
字号:
PostKey(wParam, lParam);
gbTmpPy = FALSE;
giLastKey = wParam;
}
else if (32 == wParam && bShiftDown) //shift+space;
{
gbSBCSta = !gbSBCSta;
staWnd->SetSbcSta(gbSBCSta);
gbTmpPy = FALSE;
giLastKey = wParam;
}
else if (190 == wParam && bCtrlDown) //Control+.; note! c is different from wParam if it's a punctuation
{
gbChsPctSta = !gbChsPctSta;
staWnd->SetChsPct(gbChsPctSta);
giLastKey = wParam;
}
else if (13 == wParam && bCtrlDown) //Control+space;
{
// ((CHikerWBStartDlg*)AfxGetMainWnd())->OnMenuStart();
// giLastKey = wParam;
}
else if ((50 == wParam || 51 == wParam || 52 == wParam || 53 == wParam || 54 == wParam
|| 55 == wParam || 187 == wParam || 189 == wParam) && bCtrlDown)//Control+2,3,4,5,6,7 and '+', new word
{
int loc = GetCurrLoc();
CString csSent = CString(wordstr);
CString csWord;
int lenw = 4 + (wParam-50)*2;
if (wParam <= 55)
{
csWord = csSent.Mid(loc-lenw, lenw);
if (csWord.GetLength() < lenw)
csWord = "";
newWordWnd.m_bNew = TRUE;
}
else if (187 == wParam)
{
csWord = "";
newWordWnd.m_bNew = TRUE;
}
else if (189 == wParam)
{
csWord = csSent.Mid(loc-wordstr[currpos], wordstr[currpos]);
newWordWnd.m_bNew = FALSE;
}
if (csWord == "")
{
newWordWnd.m_csWord = "";
newWordWnd.m_csCode = "";
}
else
{
CString csCode;
UIGeneCode(csWord, csCode);
newWordWnd.m_csWord = csWord;
newWordWnd.m_csCode = csCode;
}
newWordWnd.UpdateData(FALSE);
newWordWnd.ShowWindow(SW_HIDE);
newWordWnd.ShowWindow(SW_SHOW);
}
else if (192 == wParam && !bShiftDown) //temporary pinyin
{
if (giLastKey == 192)
return TRUE;
if (codelen > 0 && codelen < giMaxCodeLen && code[codelen-1] != 32 ) //code is not full, return
return TRUE;
currpos ++;
memset(code, 0, sizeof(code));
memset(wordlist, 0, sizeof(wordlist));
giPageNo = 0;
selwordnum = 0;
gbTmpPy = TRUE;
staWnd->SetCode((LPCSTR)code);
staWnd->SetWord((LPCSTR)CString("临时拼音"));
//staWnd.SetSent((LPCSTR)wordstr);
if (!staWnd->IsWindowVisible())
ShowFloatStaWnd();
giLastKey = wParam;
}
else if (27 == wParam) //escape key
{
if (27 != giLastKey)
{
if (codelen >= giMaxCodeLen || code[codelen-1] == 32)
{
//delete last input word
DeleteCode(currpos);
DeleteWord(currpos, TRUE);
// currpos --;
// GetCode(currpos, code);
}
currpos --;
memset(code, 0, sizeof(code));
giPageNo = 0;
selwordnum = 0;
gbTmpPy = 0;
memset(wordlist, 0, sizeof(wordlist));
staWnd->SetCode((LPCSTR)code);
staWnd->SetWord((LPCSTR)CString("再次按下Esc键清除内容!"));
staWnd->SetSent((LPCSTR)wordstr, wordslen, wordnum, currpos);
}
else
{
Clean();
}
giLastKey = wParam;
}
else //aplha in English state, or 0~9 digital number, or punctuation
{
CString csKeyName;
if (gbTmpPy)
{
if (codelen > 0)
return TRUE;
else
{
gbTmpPy = TRUE;
currpos --;
}
}
//if is a special key, find its code
if (isalpha(c) && 32 != c) //alpha
{
if (isupper(c))
c = wParam + 32; //!!!note, captical alpha key and lower case alpah key have the same wParam, But 0~9 key and punctuation key have not!
int keyid = GetKeyId(c);
if (!gbChsSta && gbSBCSta)
iSoftKeyboard = 11;
if (bCapsLock && !bShiftDown || !bCapsLock && bShiftDown)//captical
{
if (0 == iSoftKeyboard) //soft pc-keyboard
csKeyName = gKeyArr[iSoftKeyboard*2][keyid*2];
else
csKeyName = CString(gKeyArr[iSoftKeyboard*2][keyid*2]) +
CString(gKeyArr[iSoftKeyboard*2][keyid*2+1]);
}
else //lower letter
{
if (0 == iSoftKeyboard) //soft pc-keyboard
csKeyName = gKeyArr[iSoftKeyboard*2+1][keyid*2];
else
csKeyName = CString(gKeyArr[iSoftKeyboard*2+1][keyid*2]) +
CString(gKeyArr[iSoftKeyboard*2+1][keyid*2+1]);
}
}
else if (48 <= c && c <= 57) //0~9 digital
{
int keyid = GetKeyId(c);
if (gbSBCSta)
iSoftKeyboard = 11;
if (0 == iSoftKeyboard) //soft pc-keyboard
csKeyName = gKeyArr[iSoftKeyboard*2+1][keyid*2];
else
csKeyName = CString(gKeyArr[iSoftKeyboard*2+1][keyid*2]) +
CString(gKeyArr[iSoftKeyboard*2+1][keyid*2+1]);
}
else if ( ispunct(c))
{
int keyid = GetKeyId(c);
if (gbChsPctSta) //Chinses punctuation
{
if (c != 34)
csKeyName = GetChsPunc(c);
else
{
if (gbFirstQuota)
{
csKeyName = "“";
gbFirstQuota = FALSE;
}
else
{
csKeyName = "”";
gbFirstQuota = TRUE;
}
}
}
else //English punctuation state
{
//csKeyName = CString(c);
if (gbSBCSta)
{
iSoftKeyboard = 11;
}
int iKbOffset = 1;
if (IsShPct(c))
iKbOffset = 0;
// if (0 == iSoftKeyboard) //soft pc-keyboard
// csKeyName = gKeyArr[iSoftKeyboard*2][keyid*2];
// else
csKeyName = CString(gKeyArr[iSoftKeyboard*2+iKbOffset][keyid*2]) +
CString(gKeyArr[iSoftKeyboard*2+iKbOffset][keyid*2+1]);
}
}
else if ( 32 == c )
{
int keyid = GetKeyId(c);
if (gbSBCSta) //SBC space
csKeyName = CString(" ");
else
csKeyName = CString(c);
}
//output
if (cslen > 0 || codelen > 0
|| (cslen == 0) && csKeyName.GetLength() >= 2 && !ispunct(c)
|| (cslen == 0) && csKeyName == "“") //from hard keyboard or soft pc-keyboard
{
if (gbFloatStaWnd && !staWnd->IsWindowVisible()) //show floating state window
{
ShowFloatStaWnd();
}
if (csKeyName != "")
{
if (codelen > 0 )
{
if (codelen < giMaxCodeLen && code[codelen-1] != 32) //current code is not full
{
code[strlen((char*)code)] = 32;
InsertCode(code, currpos);
}
}
memset(code, 0, sizeof(code));
FindKeyCode(csKeyName, code);
staWnd->SetCode((LPCSTR)code);
memset(wordlist, 0, sizeof(wordlist));
selwordnum = 1;
giPageNo = 0;
staWnd->SetWord((LPCSTR)csKeyName);
currpos++;
InsertCode(code, currpos);
strcpy((char*)lastwordstr, (char*)wordstr);
memset(wordstr, 0, sizeof(wordstr));
if (!Translate(codestr, wordstr, codenum, wordnum, codeslen, wordslen))
strcpy((char*)wordstr, (char*)lastwordstr);
if (codenum > 0)
{
CorrSent();
staWnd->SetSent((LPCSTR)wordstr, wordslen, wordnum, currpos);
}
}
}
else
{
if (csKeyName != "")
PostChar(csKeyName);
// else if (c != 0) //for notepad on win2k
// PostChar(c);
else
//PostKey(wParam, lParam);
return FALSE;
staWnd->SetWord(""); //usually the word is empty when cslen=0, but some time
} //the word may be used for show some prompt information
giLastKey = wParam;
}
return TRUE;
}
void UISetFocusWnd(HWND hWnd)
{
ghFocusWnd = hWnd;
}
void UISetChsState(BOOL bState)
{
gbChsSta = bState;
}
void UISetSbcState(BOOL bState)
{
gbSBCSta = bState;
}
void UISetChsPctState(BOOL bState)
{
gbChsPctSta = bState;
}
void UISetCurrPos(int pos)
{
currpos = pos;
lastpos = -1;
GetCode(currpos, code);
//get the code's corresponding words
memset(wordlist, 0, sizeof(wordlist));
GetWords(code, codestr, currpos, wordlist, selwordnum);
giPageNo = 0;
CString csWords = TransWords(giPageNo);
CHikerWBStateWnd* staWnd;
staWnd = (CHikerWBStateWnd*)CWnd::FromHandle(GetStaWndHandle());
staWnd->SetCode((LPCSTR)code);
staWnd->SetWord((LPCSTR)csWords, giPageNo, selwordnum);
staWnd->SetSent((LPCSTR)wordstr, wordslen, wordnum, currpos);
}
void UINewWord(CString csCode, CString csWord)
{
NewWord((unsigned char*)(LPCSTR)csCode, (unsigned char*)(LPCSTR)csWord);
}
void UIDeleteWord(CString csCode, CString csWord)
{
DeleteWord((unsigned char*)(LPCSTR)csCode, (unsigned char*)(LPCSTR)csWord);
memset(wordstr, 0, sizeof(wordstr));
Translate(codestr, wordstr, codenum, wordnum, codeslen, wordslen);
//get select words again(by post)
memset(wordlist, 0, sizeof(wordlist));
GetWords(code, codestr, currpos, wordlist, selwordnum);
giPageNo = 0;
CString csWords = TransWords(giPageNo);
//show select words
CHikerWBStateWnd* staWnd;
staWnd = (CHikerWBStateWnd*)CWnd::FromHandle(GetStaWndHandle());
staWnd->SetWord((LPCSTR)csWords, giPageNo, selwordnum);
//display translated word stream
CorrSent();
if (codenum > 0)
staWnd->SetSent((LPCSTR)wordstr, wordslen, wordnum, currpos);
}
BOOL UIGeneCode(CString csWord, CString& csCode)
{
CString code;
GeneCode((unsigned char*)(LPCSTR)csWord, (unsigned char*)code.GetBuffer(CODELEN));
code.ReleaseBuffer();
csCode = code;
return TRUE;
}
HKWB_API HWND UICreateSubWnd()
{
//create makeword window
//newWordWnd.Create(IDD_DIALOG_MAKEWORD, NULL);
LPCTSTR cname = AfxRegisterWndClass(0);
//staWnd.Create(cname, "HikerWB", |WS_BORDER|WS_VISIBLE, rect, CWnd::FromHandle(hWnd), 0);
gStaWnd.CreateEx(WS_EX_LEFT|WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW/*|WS_EX_TRANSPARENT*/, cname, "HikerWB",
WS_VISIBLE|WS_POPUP|WS_CLIPSIBLINGS,
0, 0, 0, 0, 0, 0, 0);
//note!, hWnd isn't specified as parent, for display the float state window at correct position.
// SetWindowPos(staWnd.GetSafeHwnd(), HWND_TOPMOST, rect.left, rect.top, rect.Width(), rect.Height(), SWP_HIDEWINDOW);
gStaWnd.SetChsSta(gbChsSta);
gStaWnd.SetSbcSta(gbSBCSta);
gStaWnd.SetChsPct(gbChsPctSta);
hFile = CreateFileMapping((HANDLE)0xFFFFFFFF, 0, PAGE_READWRITE, 0, sizeof(HANDLE)*4, "Hook");
pMem = (HANDLE*)MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0, sizeof(HANDLE)*4);
(*pMem) = gStaWnd.GetSafeHwnd();
return gStaWnd.GetSafeHwnd();
}
HKWB_API BOOL UIDestroySubWnd(HWND hStaWnd)
{
DestroyWindow(hStaWnd);
UnmapViewOfFile(pMem);
CloseHandle(hFile);
return TRUE;
}
HKWB_API BOOL UIInitHook()
{
InitHook();
// UISetOutputStyle(1);
// UISetOutputCharset(0);
Clean();
return TRUE;
}
HKWB_API BOOL UIEndHook()
{
EndHook();
return TRUE;
}
HKWB_API BOOL UIHookOn()
{
CHikerWBStateWnd* staWnd;
staWnd = (CHikerWBStateWnd*)CWnd::FromHandle(GetStaWndHandle());
if (!gbFloatStaWnd)
staWnd->ShowWindow(SW_SHOW);
gbOpenSta = TRUE;
return HookOn();
}
HKWB_API BOOL UIHookOff()
{
//staWnd.ShowWindow(SW_HIDE);
if (strlen((char*)wordstr) > 0)
PostSent();
Clean();
gbOpenSta = FALSE;
CHikerWBStateWnd* staWnd;
staWnd = (CHikerWBStateWnd*)CWnd::FromHandle(GetStaWndHandle());
staWnd->ShowWindow(SW_HIDE);
return HookOff();
}
//05.11.10
HKWB_API BOOL UIShowSoftKeyboard(BOOL bShow, int iKeyboardId)
{
return ShowSoftKeyboard(bShow, iKeyboardId);
}
HKWB_API BOOL UITrainFromFile()
{
char bigBuff[2048] = "";
CFileDialog dlg(TRUE, "txt", NULL, OFN_ALLOWMULTISELECT|OFN_EXPLORER,
"Text Files (*.txt)|*.txt||", NULL);
dlg.m_ofn.lpstrTitle = "打开学习文章";
dlg.m_ofn.lpstrFile = bigBuff;
dlg.m_ofn.nMaxFile = sizeof(bigBuff);
if (dlg.DoModal() == IDCANCEL)
return FALSE;
CString csFileName;
for (POSITION pos = dlg.GetStartPosition(); pos; )
{
csFileName = dlg.GetNextPathName(pos);
TrainFromFile((LPCSTR)csFileName);
}
return TRUE;
}
HKWB_API int UIGetOutputStyle()
{
return ((giMaxCodeLen == 4)?0:1);
}
HKWB_API int UIGetOutputCharset()
{
return giCharset;
}
HKWB_API int UIGetFloatWndStyle()
{
return ((gbFloatStaWnd)?1:0);
}
HKWB_API void UISetOutputStyle(int iStyle)
{
PostSent();
Clean();
giMaxCodeLen = ((iStyle == 0)?4:2);
SetStyle(iStyle);
}
HKWB_API void UISetOutputCharset(int iCharset)
{
giCharset = iCharset;
SetCharset(iCharset);
}
HKWB_API void UISetFloatWndStyle(int iStyle)
{
CHikerWBStateWnd* staWnd;
staWnd = (CHikerWBStateWnd*)CWnd::FromHandle(GetStaWndHandle());
gbFloatStaWnd = ((iStyle == 1)?TRUE:FALSE);
staWnd->SetFloat(gbFloatStaWnd);
if (!gbOpenSta)
return;
if (!gbFloatStaWnd)
{
staWnd->ShowFix();
}
else
{
if (strlen((char*)codestr)>0 || strlen((char*)code)>0)
{
ShowFloatStaWnd();
}
else
{
staWnd->ShowWindow(SW_HIDE);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -