void SelectForwardFromCand(HIMC hIMC,LPCANDIDATELIST lpCandList) { HDC hDC; HFONT oldFont; TCHAR szTotal[200],szTemp[100]; SIZE sz; WORD wPos; GENEMSG GnMsg; if(wConversionSet & CONVERSION_SET_SHAPE) { wPos = (WORD) lpCandList->dwSelection; if(wPos < lpCandList->dwCount) { hDC = GetDC(NULL); oldFont = SelectObject(hDC, hUIFont); lpCandList->dwPageStart = wPos + 2; _tcscpy(szTotal,"<>"); lpCandList->dwPageSize = 0; while(wPos < lpCandList->dwCount && lpCandList->dwPageSize < CAND_PAGESIZE) { _stprintf(szTemp,"%d%s ",1,GETLPCANDSTR(lpCandList,wPos+2)); _tcscat(szTotal,szTemp); GetTextExtentPoint(hDC,szTotal,_tcslen(szTotal),&sz); if(sz.cx > sizeCand[1].cx) { break; } (lpCandList->dwPageSize)++; wPos++; } SelectObject(hDC, oldFont); ReleaseDC(NULL,hDC); lpCandList->dwSelection = wPos; if(lpCandList->dwPageStart > 2) _tcscpy(GETLPCANDSTR(lpCandList,0),_T("<")); else _tcscpy(GETLPCANDSTR(lpCandList,0),_T("")); if(wPos < lpCandList->dwCount) _tcscpy(GETLPCANDSTR(lpCandList,1),_T(">")); else _tcscpy(GETLPCANDSTR(lpCandList,1),_T("")); GnMsg.msg = WM_IME_COMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = GCS_COMPSTR; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); } else MessageBeep(0xFFFFFFFF ); } else{ if( lpCandList->dwPageStart + lpCandList->dwPageSize -2 < lpCandList->dwCount) { lpCandList->dwPageStart += lpCandList->dwPageSize; lpCandList->dwPageSize = CAND_PAGESIZE; GnMsg.msg = WM_IME_COMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = GCS_COMPSTR; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); } else MessageBeep(0xFFFFFFFF ); } }
BOOL MakeResultString( HIMC hIMC,BOOL fFlag) { GENEMSG GnMsg; LPCOMPOSITIONSTRING lpCompStr; LPINPUTCONTEXT lpIMC; LPTSTR lpConvStr,lpPreResultStr; LPCANDIDATEINFO lpCandInfo; LPCANDIDATELIST lpCandList; /* if (!IsCompStr(hIMC)) return FALSE; */ wConversionMode = 0; dwCurPhraseAttrib=0; lpIMC = ImmLockIMC(hIMC); lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr); lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo); lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]); if(fFlag) { lpConvStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szConvCompStr; lpPreResultStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPreResultStr; _tcscpy(lpPreResultStr,lpConvStr); if(wConversionSet & CONVERSION_SET_BIG5) gb2big(lpConvStr); _tcscpy(GETLPRESULTSTR(lpCompStr),lpConvStr); lpCompStr->dwResultStrLen = _tcslen(lpConvStr); } else{ *GETLPRESULTSTR(lpCompStr) = _T('\0'); lpCompStr->dwResultStrLen = 0; } lpCandList->dwCount = 0; lpCompStr->dwCompStrLen = 0; _tcscpy(GETLPCANDSTR(lpCandList,0),_T("")); _tcscpy(GETLPCANDSTR(lpCandList,1),_T("")); ImmUnlockIMCC(lpIMC->hCompStr); ImmUnlockIMCC(lpIMC->hCandInfo); GnMsg.msg = WM_IME_COMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = GCS_RESULTSTR; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); GnMsg.msg = WM_IME_ENDCOMPOSITION; GnMsg.wParam = 0; GnMsg.lParam = 0; GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg); ImmUnlockIMC(hIMC); return TRUE; }
void SelectCandFromCandlist( HIMC hIMC, WORD wParam) { if( wParam >= _T('0') && wParam <= _T('9') ){ DWORD dwIdx; LPTSTR lpConvStr; LPINPUTCONTEXT lpIMC; LPCANDIDATEINFO lpCandInfo; LPCANDIDATELIST lpCandList; LPCOMPOSITIONSTRING lpCompStr; lpIMC = ImmLockIMC(hIMC); lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo); lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]); lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr); if( wParam == (WORD)_T('0') ) dwIdx=9; else dwIdx = wParam - _T('1'); if(dwIdx < lpCandList->dwPageSize ) { dwIdx += lpCandList->dwPageStart; if( dwIdx < (lpCandList->dwCount + 2) && lpCandList->dwCount){ lpConvStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szConvCompStr; _tcscpy(lpConvStr,GETLPCANDSTR(lpCandList,dwIdx)); MakeResultString(hIMC,TRUE); } } ImmUnlockIMCC(lpIMC->hCompStr); ImmUnlockIMCC(lpIMC->hCandInfo); ImmUnlockIMC(hIMC); } return; }
void MoveCandWindow(HWND hUIWnd,LPUIEXTRA lpUIExtra, LPINPUTCONTEXT lpIMC) { if (!IsWindow(lpUIExtra->uiCand.hWnd)) CreateCandWindow( hUIWnd, lpUIExtra); if (IsWindow(lpUIExtra->uiCand.hWnd)) { LPCANDIDATEINFO lpCandInfo; LPCANDIDATELIST lpCandList; HDC hDC; HFONT oldFont; SIZE sz; LPTSTR lpStr; sz.cx = 0; sz.cy = 0; if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo)) { lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]); if( lpCandList->dwCount <= 0) { ShowWindow(lpUIExtra->uiCand.hWnd, SW_HIDE); ImmUnlockIMCC(lpIMC->hCandInfo); return; } lpStr = GETLPCANDSTR(lpCandList,1); hDC = GetDC(lpUIExtra->uiCand.hWnd); oldFont = SelectObject(hDC, hUIFont); GetTextExtentPoint(hDC,lpStr,_tcslen(lpStr),&sz); SelectObject(hDC, oldFont); ReleaseDC(lpUIExtra->uiCand.hWnd,hDC); if(_tcslen(lpStr)) sz.cx += 3*sz.cx/_tcslen(lpStr); ImmUnlockIMCC(lpIMC->hCandInfo); } if(wConversionSet & CONVERSION_SET_SHAPE) { sz.cx = sizeCand[1].cx; sz.cy = sizeCand[1].cy; } else{ if(sz.cx < lpUIExtra->uiCand.sz.cx) sz.cx = lpUIExtra->uiCand.sz.cx; sz.cy = lpUIExtra->uiCand.sz.cy; } GetCandPosFromCompWnd(lpUIExtra,&sz); MoveWindow(lpUIExtra->uiCand.hWnd, lpUIExtra->uiCand.pt.x, lpUIExtra->uiCand.pt.y, sz.cx, sz.cy, TRUE); ShowWindow(lpUIExtra->uiCand.hWnd,SW_SHOWNOACTIVATE); InvalidateRect(lpUIExtra->uiCand.hWnd,NULL,FALSE); } }
BOOL CharHandleU( HIMC hIMC,WORD wParam,LONG lParam) { LPINPUTCONTEXT lpIMC; LPCANDIDATEINFO lpCandInfo; LPCANDIDATELIST lpCandList; LPCOMPOSITIONSTRING lpCompStr; WORD wHead; lpIMC = ImmLockIMC(hIMC); lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo); lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]); lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr); if( !lpCandList->dwCount ){ int i; wHead = wParam - _T('!'); for( i=0;_tcslen(aPunct[wHead][i]);i++){ _tcscpy(GETLPCANDSTR(lpCandList,i+2),aPunct[wHead][i]); } if( i == 0) MessageBeep(0xFFFFFFFF ); else if( i == 1 ){ LPTSTR lpConvStr; lpConvStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szConvCompStr; _tcscpy(lpConvStr,aPunct[wHead][0]); MakeResultString(hIMC,TRUE); } else { LPTSTR lpStr; WORD wStrLen; lpStr = GETLPCOMPSTR(lpCompStr); wStrLen = _tcslen(lpStr); *(lpStr + wStrLen) = (TCHAR)wParam; *(lpStr + wStrLen +1) = _T('\0'); lpStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr; wStrLen = _tcslen(lpStr); *(lpStr + wStrLen) = (TCHAR)wParam; *(lpStr + wStrLen +1) = _T('\0'); lpCandList->dwSelection = 0; lpCandList->dwCount = i; lpCandList->dwPageStart = 2; lpCandList->dwPageSize = 0; SelectForwardFromCand(hIMC,lpCandList); } } else{ if( wParam == _T('=') || wParam == _T('.') || wParam == _T('>')) { SelectForwardFromCand(hIMC,lpCandList); } else if( wParam == _T('-') || wParam == _T(',') || wParam == _T('<')) { SelectBackwardFromCand(hIMC,lpCandList); } else if( wParam >= _T('0') && wParam <= _T('9') ){ SelectCandFromCandlist(hIMC, wParam); } } ImmUnlockIMCC(lpIMC->hCompStr); ImmUnlockIMCC(lpIMC->hCandInfo); ImmUnlockIMC(hIMC); return TRUE; }
void PaintCandWindow( HWND hCandWnd) { PAINTSTRUCT ps; HIMC hIMC = NULL; LPINPUTCONTEXT lpIMC = NULL; LPCANDIDATEINFO lpCandInfo = NULL; LPCANDIDATELIST lpCandList = NULL; HDC hDC = NULL; HFONT oldFont = NULL; RECT rc; LPTSTR lpstr = NULL; TCHAR szStr[100]; int height,width; DWORD i; SIZE sz; HWND hSvrWnd = NULL; HBRUSH hBrush = NULL, hOldBrush = NULL; HPEN hPen = NULL, hOldPen = NULL; hDC = BeginPaint(hCandWnd,&ps); oldFont = (HFONT)SelectObject(hDC, hUIFont); GetClientRect(hCandWnd,&rc); hBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH); hOldBrush = (HBRUSH)SelectObject(hDC,hBrush); PatBlt(hDC, rc.left, rc.top , rc.right, rc.bottom, PATCOPY); if(hBrush && hOldBrush) { SelectObject(hDC,hOldBrush); } hPen = (HPEN)GetStockObject(WHITE_PEN); hOldPen = (HPEN)SelectObject(hDC,hPen); MoveToEx(hDC,0,rc.bottom - GetSystemMetrics(SM_CXEDGE)/2,NULL); LineTo(hDC,rc.right-GetSystemMetrics(SM_CXEDGE)/2,rc.bottom - GetSystemMetrics(SM_CXEDGE)/2); LineTo(hDC,rc.right-GetSystemMetrics(SM_CXEDGE)/2,0); hPen = CreatePen(PS_SOLID ,0,RGB(128,128,128)); SelectObject(hDC,hPen); MoveToEx(hDC,rc.right-GetSystemMetrics(SM_CXEDGE)/2,0,NULL); LineTo(hDC,0,0); LineTo(hDC,0,rc.bottom-GetSystemMetrics(SM_CYEDGE)/2); SelectObject(hDC,hOldPen); DeleteObject(hPen); hSvrWnd = (HWND)GetWindowLong(hCandWnd,FIGWL_SVRWND); if (hIMC = (HIMC)GetWindowLong(hSvrWnd,IMMGWL_IMC)) { lpIMC = ImmLockIMC(hIMC); if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo)) { DWORD dwMaxPaintPos; WORD wCount; height = 3; width = 1; lpCandList = (LPCANDIDATELIST)((LPTSTR)lpCandInfo + lpCandInfo->dwOffset[0]); SetBkMode(hDC, TRANSPARENT); SetPaintColor(hDC, wConversionMode); if(wConversionSet & CONVERSION_SET_SHAPE) { lpstr = GETLPCANDSTR(lpCandList, 0); TextOut(hDC, width, height, lpstr, _tcslen(lpstr)); GetTextExtentPoint(hDC, lpstr, _tcslen(lpstr), &sz); width += sz.cx * 3 / 2; } dwMaxPaintPos = lpCandList->dwPageStart +lpCandList->dwPageSize ; if(dwMaxPaintPos > lpCandList->dwCount + 2) dwMaxPaintPos = lpCandList->dwCount + 2; wCount = 0; for (i = lpCandList->dwPageStart; i < dwMaxPaintPos; i++) { wCount++; lpstr = GETLPCANDSTR(lpCandList,i); GetTextExtentPoint(hDC,lpstr, _tcslen(lpstr), &sz); if(wConversionSet & CONVERSION_SET_SHAPE) { _stprintf(szStr, TEXT("%d%s "), wCount % 10, lpstr); TextOut(hDC,width,height,szStr,_tcslen(szStr)); GetTextExtentPoint(hDC,szStr,_tcslen(szStr),&sz); width += sz.cx; } else { _stprintf(szStr,TEXT("%d %s "), wCount%10,lpstr); TextOut(hDC,width,height,szStr,_tcslen(szStr)); GetTextExtentPoint(hDC,szStr,_tcslen(szStr),&sz); height += sz.cy; } } if(wConversionSet & CONVERSION_SET_SHAPE) { lpstr = GETLPCANDSTR(lpCandList, 1); if(_tcslen(lpstr)) { GetTextExtentPoint(hDC, TEXT("A"), 1, &sz); width = sizeCand[1].cx - sz.cx * 3 / 2; TextOut(hDC, width, height, lpstr, _tcslen(lpstr)); } } ImmUnlockIMCC(lpIMC->hCandInfo); } ImmUnlockIMC(hIMC); } SelectObject(hDC, oldFont); EndPaint(hCandWnd, &ps); }
void ChangeCand(HWND hUIWnd) { LPUIPRIV lpUIPriv; HIMC hIMC; CONST INPUTCONTEXT * lpIMC; LPCANDIDATEINFO lpCandInfo; LPCANDIDATELIST lpCandList; int nCandWi, nCandHi; lpUIPriv = (LPUIPRIV)GetWindowLong(hUIWnd, IMMGWL_PRIVATE); if (!lpUIPriv) { return; } if (!(lpUIPriv->fdwUIFlags & UI_CAND_ALREADY_OPEN)) { return; } hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC); if (!hIMC) { return; } lpIMC = (CONST INPUTCONTEXT *)ImmLockIMC(hIMC); if (!lpIMC) { return; } if (!lpIMC->hCandInfo) { ImmUnlockIMC(hIMC); ImmUnlockIMCC(lpIMC->hCandInfo); return; } lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo); if (!lpCandInfo) { ImmUnlockIMCC(lpIMC->hCandInfo); ImmUnlockIMC(hIMC); return; } lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]); lpUIPriv->lpCandList = lpCandList; nCandWi = lpUIPriv->nCandWi; nCandHi = lpUIPriv->nCandHi; GetWorkArea(&g_sImeUIG.rcWorkArea); if (nCandWi != lpUIPriv->nCandWi || nCandHi != lpUIPriv->nCandHi) { lpUIPriv->nCandWi = g_sImeUIG.rcWorkArea.right; lpUIPriv->nCandHi = g_sImeUIG.nCandLineHi; SetWindowPos(lpUIPriv->hCandWnd, NULL, 0, 0, g_sImeUIG.rcWorkArea.right, g_sImeUIG.nCandLineHi, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER); } // Processeing page/line up/down if(lpCandList->dwStyle == 1) {//line down if(lpCandList->dwSelection < lpCandList->dwCount-1 ) lpCandList->dwSelection++; if(lpCandList->dwSelection > (lpCandList->dwPageStart + lpCandList->dwPageSize-1)) lpCandList->dwStyle = 3; // do page down later }else if(lpCandList->dwStyle == 2) { // line up if (lpCandList->dwSelection > 0) lpCandList->dwSelection--; if (lpCandList->dwSelection < lpCandList->dwPageStart) lpCandList->dwStyle = 4; // do page up later } if(lpCandList->dwStyle == 3) {//page down if (lpCandList->dwPageStart < (lpCandList->dwCount - lpCandList->dwPageSize)) { lpCandList->dwPageStart += lpCandList->dwPageSize; lpCandList->dwSelection = lpCandList->dwPageStart; } }else if(lpCandList->dwStyle == 4) {//page up int i,nCharCnt=0; nCandWi = g_sImeUIG.rcWorkArea.right - g_sImeUIG.nCandCharWi *2; for( i=0;i<32; i++){ if(lpCandList->dwPageStart > 0) lpCandList->dwPageStart--; else break; nCharCnt += wcslen(GETLPCANDSTR(lpCandList, lpCandList->dwPageStart) )+ 1; if(nCandWi - nCharCnt * g_sImeUIG.nCandCharWi < g_sImeUIG.nCandCharWi*2){ lpCandList->dwPageStart++; break; } } if(lpCandList->dwSelection > lpCandList->dwPageStart +i-1 ) lpCandList->dwSelection = lpCandList->dwPageStart; } lpCandList->dwStyle = 0; // reset lpCandList->dwStyle InvalidateRect(lpUIPriv->hCandWnd, NULL, TRUE); ShowCand(hUIWnd, SW_SHOWNOACTIVATE); ImmUnlockIMCC(lpIMC->hCandInfo); ImmUnlockIMC(hIMC); return; }
void DrawCandText(HDC hDC, LPCUIPRIV lpUIPriv) { LPCANDIDATELIST lpCandList = lpUIPriv->lpCandList; DWORD dwStart, dwEnd, dwSelect; int i; RECT rcCandLine; LPCWSTR szCandStr; LPCWSTR szRScroll=_T(">>"), szLScroll=_T("<<"); dwStart = lpCandList->dwPageStart; dwEnd = dwStart + 32; //MAX_PAGE =32//lpCandList->dwPageSize; dwEnd = dwEnd > lpCandList->dwCount ? lpCandList->dwCount : dwEnd; dwSelect = lpCandList->dwSelection; SetBkColor(hDC, g_sImeUIG.crWindow); SetTextColor(hDC, g_sImeUIG.crWindowText); rcCandLine.top = 0; rcCandLine.bottom = g_sImeUIG.nCandLineHi; rcCandLine.left = 0; rcCandLine.right = g_sImeUIG.rcWorkArea.right; g_sImeUIG.nCandDx[0] = lpUIPriv->rcCandText.left; // Reserved space for left arrow if(lpCandList->dwPageStart !=0) ExtTextOut(hDC, 0, 0, ETO_OPAQUE, &rcCandLine, szLScroll, 2, NULL); // Draw left scroll symbol and fill background else ExtTextOut(hDC, 0, 0, ETO_OPAQUE, &rcCandLine, NULL, 0, NULL); // Fill background color of candtext area. for (i = 0; dwStart < dwEnd; dwStart++, i++) { szCandStr = GETLPCANDSTR(lpCandList, dwStart);// *(LPCTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[dwStart]); int rlen = wcslen(szCandStr); g_sImeUIG.nCandDx[i+1] = g_sImeUIG.nCandDx[i] + (rlen + 1) * g_sImeUIG.nCandCharWi; if(g_sImeUIG.nCandDx[i+1] > g_sImeUIG.rcWorkArea.right - g_sImeUIG.nCandCharWi*2) break; if (dwSelect == dwStart) { rcCandLine.left = g_sImeUIG.nCandDx[i]; rcCandLine.right = g_sImeUIG.nCandDx[i] + rlen * g_sImeUIG.nCandCharWi; SetBkColor(hDC, g_sImeUIG.crHighlight); SetTextColor(hDC, g_sImeUIG.crHighlightText); } else { rcCandLine.left = g_sImeUIG.nCandDx[i]; rcCandLine.right = g_sImeUIG.nCandDx[i] + rlen * g_sImeUIG.nCandCharWi; } ExtTextOut(hDC, g_sImeUIG.nCandDx[i], 0, ETO_OPAQUE, &rcCandLine, szCandStr, rlen, NULL); if (dwSelect == dwStart) { SetBkColor(hDC, g_sImeUIG.crWindow); SetTextColor(hDC, g_sImeUIG.crWindowText); } } lpCandList->dwPageSize = i; if(lpCandList->dwPageStart + lpCandList->dwPageSize != lpCandList->dwCount) { rcCandLine.left = g_sImeUIG.rcWorkArea.right - g_sImeUIG.nCandCharWi*2; rcCandLine.right = g_sImeUIG.rcWorkArea.right; ExtTextOut(hDC, rcCandLine.left, 0, ETO_OPAQUE, &rcCandLine, szRScroll, 2, NULL); // Fill background color of candtext area. } return; }