📄 dic.c
字号:
lpCandList->dwCount = i;
if (i < MAXCANDPAGESIZE)
lpCandList->dwPageSize = i;
else
lpCandList->dwPageSize = MAXCANDPAGESIZE;
// Total pages
pages = i / lpCandList->dwPageSize + i % lpCandList->dwPageSize;
if (select)
{
int sel = lpCandList->dwSelection / lpCandList->dwPageSize;
sel *= lpCandList->dwPageSize;
sel +=select - 1;
if (sel >= i)
sel = i - 1;
lpCandList->dwSelection = sel;
offset = 0;
}
else if (offset > 2)
{
// last (END)
lpCandList->dwSelection = i - 1;
offset = 0; // reset
} else if (offset < -2)
{
// first (HOME)
lpCandList->dwSelection = 0;
offset = 0; // reset
}
// PgUp/PgDn
if (offset ==2) offset = lpCandList->dwPageSize;
else if (offset ==-2) offset = -(int)lpCandList->dwPageSize;
if (offset < 0 && (int)(lpCandList->dwSelection + offset) < 0)
{
int select = lpCandList->dwSelection + offset;
//if (select < 0) select= pages * lpCandList->dwPageSize - offset;
if (select < 0) select= 0;
if (select >= i)
select = i - 1;
lpCandList->dwSelection = (DWORD)select;
} else {
lpCandList->dwSelection += offset;
if (offset > 1 && lpCandList->dwSelection >= (DWORD)i)
lpCandList->dwSelection = i - 1;
}
// 盖 场 + 1捞搁 盖 贸澜栏肺
if (lpCandList->dwSelection >= (DWORD)i)
{
lpCandList->dwPageStart = 0;
lpCandList->dwSelection = 0;
} else {
int spage = lpCandList->dwSelection / lpCandList->dwPageSize;
lpCandList->dwPageStart= spage * lpCandList->dwPageSize;
}
//
// Generate messages.
//
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_CHANGECANDIDATE;
GnMsg.lParam = 1L;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
//
// If the selected candidate string is changed, the composition string
// should be updated.
//
lpstr = (LPMYSTR)((LPSTR)lpCandList +
lpCandList->dwOffset[lpCandList->dwSelection]);
goto set_compstr;
}
cvk_exit40:
ImmUnlockIMCC(lpIMC->hCandInfo);
cvk_exit20:
ImmUnlockIMCC(lpIMC->hCompStr);
cvk_exit10:
ImmUnlockIMC(hIMC);
return bRc;
}
/**********************************************************************/
/* */
/* IsEat( code ) */
/* */
/**********************************************************************/
BOOL PASCAL IsEat( code )
register WORD code;
{
return TRUE;
}
/**********************************************************************/
/* */
/* DeleteChar() */
/* */
/**********************************************************************/
void PASCAL DeleteChar( HIMC hIMC ,UINT uVKey)
{
LPINPUTCONTEXT lpIMC;
LPCOMPOSITIONSTRING lpCompStr;
LPCANDIDATEINFO lpCandInfo;
LPMYSTR lpstr;
LPMYSTR lpread;
LPMYSTR lpptr;
int nChar;
BOOL fDone = FALSE;
DWORD dwCurPos;
TRANSMSG GnMsg;
WCHAR cs = 0;
if (!IsCompStr(hIMC))
return;
if (!(lpIMC = ImmLockIMC(hIMC)))
return;
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
dwCurPos = lpCompStr->dwCursorPos;
lpstr = GETLPCOMPSTR(lpCompStr);
if( uVKey == VK_BACK )
{
if( dwCurPos == 0 )
goto dc_exit;
lpptr = MyCharPrev( lpstr, lpstr+dwCurPos );
if ( ic.len && (dwOptionFlag & BACKSPACE_BY_JAMO)) {
// Delete jamos
if (--ic.len > 0) {
ic.laststate--;
*lpptr = cs = hangul_ic_get(&ic,0);
} else {
hangul_ic_init(&ic);
Mylstrcpy( lpptr, lpstr+dwCurPos );
if (dwCurPos > 0)
cs = *(lpptr-1);
dwCurPos--;
}
} else {
nChar = 1;
if( lpstr == lpptr && Mylstrlen(lpstr) == nChar )
{
dwCurPos = 0;
*lpstr = MYTEXT('\0');
}
else
{
Mylstrcpy( lpptr, lpstr+dwCurPos );
dwCurPos -= nChar;
cs = *(lpptr-1);
}
}
fDone = TRUE;
}
else if( uVKey == VK_DELETE )
{
if( dwCurPos == (DWORD)Mylstrlen(lpstr) )
goto dc_exit;
nChar = 1;
Mylstrcpy( lpstr+dwCurPos, lpstr+dwCurPos+nChar );
fDone = TRUE;
}
if (fDone)
{
lpstr = GETLPCOMPSTR(lpCompStr);
lpread = GETLPCOMPREADSTR(lpCompStr);
/*lZenToHan (lpread,lpstr);
*/
lmemset(GETLPCOMPATTR(lpCompStr),ATTR_INPUT,Mylstrlen(lpstr));
lmemset(GETLPCOMPREADATTR(lpCompStr),ATTR_INPUT,Mylstrlen(lpread));
//
// make length
//
lpCompStr->dwCompStrLen = Mylstrlen(lpstr);
lpCompStr->dwCompReadStrLen = Mylstrlen(lpread);
lpCompStr->dwCompAttrLen = Mylstrlen(lpstr);
lpCompStr->dwCompReadAttrLen = Mylstrlen(lpread);
lpCompStr->dwCursorPos = dwCurPos;
// DeltaStart is same of Cursor Pos at DeleteChar time.
lpCompStr->dwDeltaStart = dwCurPos;
//
// make clause info
//
SetClause(GETLPCOMPCLAUSE(lpCompStr),Mylstrlen(lpstr));
SetClause(GETLPCOMPREADCLAUSE(lpCompStr),Mylstrlen(lpread));
lpCompStr->dwCompClauseLen = 8;
lpCompStr->dwCompReadClauseLen = 8;
if (lpCompStr->dwCompStrLen)
{
GnMsg.message = WM_IME_COMPOSITION;
GnMsg.wParam = cs;
GnMsg.lParam = GCS_COMPALL | GCS_CURSORPOS | GCS_DELTASTART;
if (dwImeFlag & SAENARU_ONTHESPOT)
GnMsg.lParam |= CS_INSERTCHAR | CS_NOMOVECARET;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
}
else
{
if (IsCandidate(lpIMC))
{
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
ClearCandidate(lpCandInfo);
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_CLOSECANDIDATE;
GnMsg.lParam = 1;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
ImmUnlockIMCC(lpIMC->hCandInfo);
}
ClearCompStr(lpCompStr,CLR_RESULT_AND_UNDET);
GnMsg.message = WM_IME_COMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = GCS_COMPALL | GCS_CURSORPOS | GCS_DELTASTART;
if (dwImeFlag & SAENARU_ONTHESPOT)
GnMsg.lParam |= CS_INSERTCHAR | CS_NOMOVECARET;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
GnMsg.message = WM_IME_ENDCOMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = 0;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
// PostMessage(lpIMC->hWnd,WM_IME_ENDCOMPOSITION,0,0);
}
}
dc_exit:
ImmUnlockIMCC(lpIMC->hCompStr);
ImmUnlockIMC(hIMC);
}
#if 0
/**********************************************************************/
/* */
/* AddChar() */
/* */
/* One character add function */
/* */
/**********************************************************************/
void PASCAL AddChar( hIMC, code )
HIMC hIMC;
WORD code;
{
LPMYSTR lpchText;
LPMYSTR lpread;
LPMYSTR lpstr;
LPMYSTR lpprev;
WORD code2 = 0;
WORD code3;
DWORD fdwConversion;
LPINPUTCONTEXT lpIMC;
LPCOMPOSITIONSTRING lpCompStr;
DWORD dwStrLen;
DWORD dwSize;
TRANSMSG GnMsg;
DWORD dwGCR = 0L;
WCHAR Katakana, Sound;
lpIMC = ImmLockIMC(hIMC);
if (ImmGetIMCCSize(lpIMC->hCompStr) < sizeof (MYCOMPSTR))
{
// Init time.
dwSize = sizeof(MYCOMPSTR);
lpIMC->hCompStr = ImmReSizeIMCC(lpIMC->hCompStr,dwSize);
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
lpCompStr->dwSize = dwSize;
}
else
{
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
}
dwStrLen = lpCompStr->dwCompStrLen;
if (!dwStrLen)
{
// 绝栏搁 檬扁拳
InitCompStr(lpCompStr,CLR_RESULT_AND_UNDET);
GnMsg.message = WM_IME_STARTCOMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = 0;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
}
else if (IsConvertedCompStr(hIMC))
{
MakeResultString(hIMC,FALSE);
InitCompStr(lpCompStr,CLR_UNDET);
dwGCR = GCS_RESULTALL;
}
if( IsEat( code ) )
{
// Get ConvMode from IMC.
fdwConversion = lpIMC->fdwConversion;
lpchText = GETLPCOMPSTR(lpCompStr);
lpstr = lpchText;
if( lpCompStr->dwCursorPos )
lpstr += lpCompStr->dwCursorPos;
lpstr = lpchText + Mylstrlen(lpchText);
lpprev = MyCharPrev( lpchText, lpstr );
if( fdwConversion & IME_CMODE_CHARCODE ) {
code = (WORD)(LONG_PTR)AnsiUpper( (LPSTR)(LONG_PTR)code );
if( !( (code >= MYTEXT('0') && code <= MYTEXT('9')) ||
(code >= MYTEXT('A') && code <= MYTEXT('F')) ) || lpCompStr->dwCursorPos >= 4 ){
MessageBeep( 0 );
goto ac_exit;
}
*lpstr++ = (BYTE)code;
lpCompStr->dwCursorPos++;
}
else if ( fdwConversion & IME_CMODE_FULLSHAPE )
{
if ( fdwConversion & IME_CMODE_ROMAN &&
fdwConversion & IME_CMODE_NATIVE )
{
if (*lpprev) {
code2 = *lpprev;
}
else
{
if( IsSecond( code ) )
{
code = ConvChar(hIMC, 0, code );
if (!(fdwConversion & IME_CMODE_HANGUL))
{
code = KataToHira(code);
}
}
goto DBCS_BETA;
}
if (!( code2 = ZenToHan( code2 ) ))
{
if( IsSecond( code ) )
{
code = ConvChar(hIMC, 0, code );
if (!(fdwConversion & IME_CMODE_HANGUL))
{
code = KataToHira(code);
}
}
goto DBCS_BETA;
}
if ( IsSecond( code ) )
{
if ( IsFirst( code2 ) &&
(code3 = ConvChar(hIMC, code2, code )))
{
if (fdwConversion & IME_CMODE_HANGUL)
{
*lpprev = code3;
}
else
{
*lpprev = KataToHira(code3);
}
}
else
{
code = ConvChar(hIMC, 0, code );
if (!(fdwConversion & IME_CMODE_HANGUL))
{
code = KataToHira(code);
}
goto DBCS_BETA;
}
}
else if( (WORD)(LONG_PTR)CharUpperW( (LPMYSTR)(LONG_PTR)code ) == 'N'
&& (WORD)(LONG_PTR)CharUpperW( (LPMYSTR)(LONG_PTR)code2 ) == 'N' )
{
code3 = 0xFF9D;
code2 = HanToZen( code3, 0,fdwConversion);
*lpprev = code2;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -