void MakePaintString(HWND hWnd, LPMYSTR lpStr, DWORD dwStrLen, LPDWORD lpCls, DWORD dwClsLen, LPMYSTR lpPaintStr, DWORD dwPaintStrSize) { LPMYSTR lpPaintStart = lpPaintStr; lpPaintStr += Mylstrlen(lpPaintStr); if (dwStrLen) { if (dwClsLen) { lpCls[127] = 0; while (*(lpCls+1) && *lpCls < dwStrLen) { DWORD dwTextLen = *(lpCls+1) - *lpCls; LPMYSTR lpT = lpStr + *lpCls; memcpy(lpPaintStr,lpT,dwTextLen * sizeof(MYCHAR)); lpPaintStr += dwTextLen; *lpPaintStr = MYTEXT(','); lpPaintStr++; lpCls++; } *lpPaintStr = MYTEXT('\0'); } else { StringCchCopy((LPTSTR)lpPaintStr,dwPaintStrSize, (LPTSTR)lpStr); StringCchCat((LPTSTR)lpPaintStr,dwPaintStrSize, (LPTSTR)MYTEXT(",")); } } }
LRESULT HandleComposition(HWND hWnd, WPARAM wParam, LPARAM lParam) { HIMC hIMC = NULL; BOOL fRedraw = FALSE; hIMC = ImmGetContext(hWnd); if (lParam & GCS_COMPSTR) { dwCompStrLen = MyImmGetCompositionString(hIMC,GCS_COMPSTR,szCompStr,sizeof(szCompStr)); dwCompStrLen /= sizeof(MYCHAR); szCompStr[dwCompStrLen] = MYTEXT('\0'); fRedraw = TRUE; } else { dwCompStrLen = 0; szCompStr[0] = MYTEXT('\0'); } if (lParam & GCS_COMPATTR) { dwCompAttrLen = MyImmGetCompositionString(hIMC,GCS_COMPATTR,bCompAttr,sizeof(bCompAttr)); fRedraw = TRUE; } else { dwCompAttrLen = 0; bCompAttr[0] = 0; } if (lParam & GCS_COMPCLAUSE) { dwCompClsLen = MyImmGetCompositionString(hIMC,GCS_COMPCLAUSE,dwCompCls,sizeof(dwCompCls)); fRedraw = TRUE; } else { dwCompClsLen = 0; dwCompCls[0] = 0; dwCompCls[1] = 0; } if (lParam & GCS_COMPREADSTR) { dwCompReadStrLen = MyImmGetCompositionString(hIMC,GCS_COMPREADSTR,szCompReadStr,sizeof(szCompReadStr)); dwCompReadStrLen /= sizeof(MYCHAR); szCompReadStr[dwCompReadStrLen] = MYTEXT('\0'); fRedraw = TRUE; } else { dwCompReadStrLen = 0; szCompReadStr[0] = MYTEXT('\0'); } if (lParam & GCS_COMPREADATTR) { dwCompReadAttrLen = MyImmGetCompositionString(hIMC,GCS_COMPREADATTR,bCompReadAttr,sizeof(bCompReadAttr)); fRedraw = TRUE; } else { dwCompReadAttrLen = 0; bCompReadAttr[0] = 0; } if (lParam & GCS_COMPREADCLAUSE) { dwCompReadClsLen = MyImmGetCompositionString(hIMC,GCS_COMPREADCLAUSE,dwCompReadCls,sizeof(dwCompReadCls)); fRedraw = TRUE; } else { dwCompReadClsLen = 0; dwCompReadCls[0] = 0; dwCompReadCls[1] = 0; } if (lParam & GCS_RESULTSTR) { RECT rc = {0}; HDC hIC = NULL; SIZE sz0, sz1; HFONT hOldFont = NULL; if (lParam & GCS_RESULTCLAUSE) { dwResultClsLen = MyImmGetCompositionString(hIMC,GCS_RESULTCLAUSE,dwResultCls,sizeof(dwResultCls)); } else { dwResultClsLen = 0; dwResultCls[0] = 0; dwResultCls[1] = 0; } dwResultStrLen = MyImmGetCompositionString(hIMC,GCS_RESULTSTR,szResultStr,sizeof(szResultStr)); dwResultStrLen /= sizeof(MYCHAR); szResultStr[dwResultStrLen] = MYTEXT('\0'); // szPaintResult may overflow.. GetClientRect(hWnd,&rc); hIC = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL); hOldFont = SelectObject(hIC,hFont); #ifdef USEWAPI GetTextExtentPointW(hIC,szPaintResult,Mylstrlen(szPaintResult),&sz0); GetTextExtentPointW(hIC,szResultStr,Mylstrlen(szResultStr),&sz1); #else GetTextExtentPoint(hIC,szPaintResult,Mylstrlen(szPaintResult),&sz0); GetTextExtentPoint(hIC,szResultStr,Mylstrlen(szResultStr),&sz1); #endif if (sz0.cx + sz1.cx >= rc.right) { szPaintResult[0] = MYTEXT('\0'); szPaintResultRead[0] = MYTEXT('\0'); } SelectObject(hIC,hOldFont); DeleteDC(hIC); MakePaintString(hWnd,szResultStr,dwResultStrLen,dwResultCls,dwResultClsLen,szPaintResult, ARRAYSIZE(szPaintResult)); fRedraw = TRUE; } else { dwResultStrLen = 0; szResultStr[0] = MYTEXT('\0'); dwResultClsLen = 0; dwResultCls[0] = 0; dwResultCls[1] = 0; } if (lParam & GCS_RESULTREADSTR) { if (lParam & GCS_RESULTREADCLAUSE) { dwResultReadClsLen = MyImmGetCompositionString(hIMC,GCS_RESULTREADCLAUSE,dwResultReadCls,sizeof(dwResultReadCls)); fRedraw = TRUE; } else { dwResultReadClsLen = 0; dwResultReadCls[0] = 0; dwResultReadCls[1] = 0; } dwResultReadStrLen = MyImmGetCompositionString(hIMC,GCS_RESULTREADSTR,szResultReadStr,sizeof(szResultReadStr)); dwResultReadStrLen /= sizeof(MYCHAR); szResultReadStr[dwResultReadStrLen] = MYTEXT('\0'); MakePaintString(hWnd,szResultReadStr,dwResultReadStrLen,dwResultReadCls,dwResultReadClsLen,szPaintResultRead, ARRAYSIZE(szPaintResultRead)); fRedraw = TRUE; } else { dwResultReadStrLen = 0; szResultReadStr[0] = MYTEXT('\0'); dwResultReadClsLen = 0; dwResultReadCls[0] = 0; dwResultReadCls[1] = 0; } if (fRedraw) { InvalidateRect(hWnd,NULL,TRUE); UpdateWindow(hWnd); } return 1; }
LRESULT HandleChar(HWND hWnd, WPARAM wParam, LPARAM lParam) { RECT rc = {0}; HDC hIC = NULL; SIZE sz0, sz1; HFONT hOldFont = NULL; LPMYSTR lp = NULL; // is the previous received char is a DBCS lead byte char ? static BOOL fIsPrevLeadByte = FALSE; GetClientRect(hWnd,&rc); hIC = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL); hOldFont = SelectObject(hIC,hFont); #ifdef USEWAPI GetTextExtentPointW(hIC,szPaintResult,Mylstrlen(szPaintResult),&sz0); GetTextExtentPointW(hIC,szResultStr,Mylstrlen(szResultStr),&sz1); #else GetTextExtentPoint(hIC,szPaintResult,Mylstrlen(szPaintResult),&sz0); GetTextExtentPoint(hIC,szResultStr,Mylstrlen(szResultStr),&sz1); #endif if (sz0.cx + sz1.cx >= rc.right) { szPaintResult[0] = MYTEXT('\0'); szPaintResultRead[0] = MYTEXT('\0'); } SelectObject(hIC,hOldFont); DeleteDC(hIC); lp = szPaintResult + Mylstrlen(szPaintResult); #ifndef USEWAPI if (fIsPrevLeadByte) { // remove , and append second byte for showing DBCS char if (*(lp - 1) == ',') { lp--; } } #endif // append second byte *lp++ = (MYCHAR)(BYTE)wParam; *lp++ = MYTEXT(','); *lp++ = MYTEXT('\0'); lp = szPaintResultRead + Mylstrlen(szPaintResultRead); #ifndef USEWAPI if (fIsPrevLeadByte) { // remove , and append second byte for showing DBCS char if (*(lp - 1) == ',') { lp--; } fIsPrevLeadByte = FALSE; } else { fIsPrevLeadByte = IsDBCSLeadByte((BYTE)wParam); } #endif *lp++ = (BYTE)wParam; *lp++ = MYTEXT(','); *lp++ = MYTEXT('\0'); InvalidateRect(hWnd,NULL,TRUE); UpdateWindow(hWnd); return 1; }
LRESULT HandlePaint(HWND hWnd, WPARAM wParam, LPARAM lParam) { HDC hDC = NULL; PAINTSTRUCT ps = {0}; UINT i; int x = ORG_X; int y = ORG_Y; SIZE sz; HFONT hOldFont = NULL; HFONT hDefFont = GetStockObject(DEFAULT_GUI_FONT); int height,defheight; const char szResult[] = "Result String"; const char szComp[] = "Composition String"; RECT rc = {0}; GetClientRect(hWnd,&rc); hDC = BeginPaint(hWnd, &ps); if (hFont) { hOldFont = SelectObject(hDC,hDefFont); } // Get the height of the default gui font. GetTextExtentPoint(hDC,"A",1,&sz); defheight = sz.cy + 1; // Get the height of the font. SelectObject(hDC,hFont); GetTextExtentPoint(hDC,"A",1,&sz); height = sz.cy + 1; SelectObject(hDC,hDefFont); SetTextColor(hDC,RGB(0,0,0)); SetBkMode(hDC,TRANSPARENT); TextOut(hDC,ORG_X,y,szResult,lstrlen(szResult)); y += defheight; if (Mylstrlen(szPaintResult)) { x = ORG_X; SelectObject(hDC,hFont); SetTextColor(hDC,RGB(255,0,0)); SetBkMode(hDC,TRANSPARENT); #ifdef USEWAPI TextOutW(hDC,x,y,szPaintResult,Mylstrlen(szPaintResult)); #else TextOut(hDC,x,y,szPaintResult,Mylstrlen(szPaintResult)); #endif } y += height; if (Mylstrlen(szPaintResultRead)) { x = ORG_X; SelectObject(hDC,hFont); SetTextColor(hDC,RGB(255,0,0)); SetBkMode(hDC,TRANSPARENT); #ifdef USEWAPI TextOutW(hDC,x,y,szPaintResultRead,Mylstrlen(szPaintResultRead)); #else TextOut(hDC,x,y,szPaintResultRead,Mylstrlen(szPaintResultRead)); #endif } #if 0 if (dwResultReadStrLen) { x = ORG_X; SelectObject(hDC,hFont); SetTextColor(hDC,RGB(0,0,0)); SetBkMode(hDC,TRANSPARENT); if (dwResultReadClsLen) { dwResultReadCls[127] = 0; i = 1; SetTextColor(hDC,RGB(255,0,0)); while (dwResultReadCls[i] && dwResultReadCls[i-1] < dwResultReadStrLen) { DWORD dwTextLen = dwResultReadCls[i] - dwResultReadCls[i-1]; LPSTR lpStart = szResultReadStr + dwResultReadCls[i-1]; TextOut(hDC,x,y,lpStart,dwTextLen); GetTextExtentPoint(hDC,lpStart,dwTextLen,&sz); x += sz.cx; TextOut(hDC,x,y,",",1); GetTextExtentPoint(hDC,",",1,&sz); x += (sz.cx + 2); i++; } } else { SetTextColor(hDC,RGB(255,0,0)); SetBkMode(hDC,TRANSPARENT); TextOut(hDC,x,y,szResultReadStr,dwResultReadStrLen); } } #endif y += height; SelectObject(hDC,hDefFont); SetTextColor(hDC,RGB(0,0,0)); SetBkMode(hDC,TRANSPARENT); TextOut(hDC,ORG_X,y,szComp,lstrlen(szComp)); y += defheight; if (dwCompStrLen) { x = ORG_X; SelectObject(hDC,hFont); SetTextColor(hDC,RGB(0,0,0)); if (dwCompClsLen && dwCompAttrLen) { dwCompCls[127] = 0; i = 1; while (dwCompCls[i] && dwCompCls[i-1] < dwCompStrLen) { DWORD dwTextLen = dwCompCls[i] - dwCompCls[i-1]; LPMYSTR lpStart = szCompStr + dwCompCls[i-1]; SetAttrColor(hDC, bCompAttr[dwCompCls[i-1]]); #ifdef USEWAPI TextOutW(hDC,x,y,lpStart,dwTextLen); GetTextExtentPointW(hDC,lpStart,dwTextLen,&sz); #else TextOut(hDC,x,y,lpStart,dwTextLen); GetTextExtentPoint(hDC,lpStart,dwTextLen,&sz); #endif x += sz.cx; SetTextColor(hDC,RGB(0,0,0)); SetBkMode(hDC,TRANSPARENT); #ifdef USEWAPI TextOutW(hDC,x,y,MYTEXT(","),1); GetTextExtentPointW(hDC,MYTEXT(","),1,&sz); #else TextOut(hDC,x,y,",",1); GetTextExtentPoint(hDC,",",1,&sz); #endif x += (sz.cx + 2); i++; } } else { SetBkMode(hDC,TRANSPARENT); #ifdef USEWAPI TextOutW(hDC,x,y,szCompStr,dwCompStrLen); #else TextOut(hDC,x,y,szCompStr,dwCompStrLen); #endif } } y += height; if (dwCompReadStrLen) { x = ORG_X; SelectObject(hDC,hFont); SetTextColor(hDC,RGB(0,0,0)); SetBkMode(hDC,TRANSPARENT); if (dwCompReadClsLen && dwCompReadAttrLen) { dwCompReadCls[127] = 0; i = 1; while (dwCompReadCls[i] && dwCompReadCls[i-1] < dwCompReadStrLen) { DWORD dwTextLen = dwCompReadCls[i] - dwCompReadCls[i-1]; LPMYSTR lpStart = szCompReadStr + dwCompReadCls[i-1]; SetAttrColor(hDC, bCompReadAttr[dwCompReadCls[i-1]]); #ifdef USEWAPI TextOutW(hDC,x,y,lpStart,dwTextLen); GetTextExtentPointW(hDC,lpStart,dwTextLen,&sz); #else TextOut(hDC,x,y,lpStart,dwTextLen); GetTextExtentPoint(hDC,lpStart,dwTextLen,&sz); #endif x += sz.cx; SetTextColor(hDC,RGB(0,0,0)); SetBkMode(hDC,TRANSPARENT); #ifdef USEWAPI TextOutW(hDC,x,y,MYTEXT(","),1); GetTextExtentPointW(hDC,MYTEXT(","),1,&sz); #else TextOut(hDC,x,y,",",1); GetTextExtentPoint(hDC,",",1,&sz); #endif x += (sz.cx + 2); i++; } } else { SetBkMode(hDC,TRANSPARENT); #ifdef USEWAPI TextOutW(hDC,x,y,szCompReadStr,dwCompReadStrLen); #else TextOut(hDC,x,y,szCompReadStr,dwCompReadStrLen); #endif } } y += height; ptImeUIPos.y = y; SelectObject(hDC,hOldFont); EndPaint(hWnd,&ps); return 1; }