⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 candui.cpp

📁 输入法源代码自由拼音输入法源代码(T9)
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    DWORD            dwStart, dwEnd;
    TCHAR            szStrBuf[2 * MAXSTRLEN * sizeof(WCHAR) / sizeof(TCHAR) + 1];
    HBITMAP          hCandIconBmp;
    HBITMAP          hOldBmp, hCandHBmp, hCandUBmp, hCandDBmp, hCandEBmp;
    HDC              hMemDC;

    hIMC = (HIMC)GetWindowLong(GetWindow(hCandWnd, GW_OWNER), IMMGWLP_IMC);
    if (!hIMC)     return;

    lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
    if (!lpIMC)    return;
    
    if (!lpIMC->hCandInfo)    goto UpCandW2UnlockIMC;
    
    lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
    if (!lpCandInfo)          goto UpCandW2UnlockIMC;
   
    if (!lpIMC->hPrivate)     goto UpCandW2UnlockCandInfo;

    lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
    if (!lpImcP)              goto UpCandW2UnlockCandInfo;
    
    lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]);

    dwStart = lpCandList->dwSelection;
    dwEnd = dwStart + lpCandList->dwPageSize;

    if (dwEnd > lpCandList->dwCount)  dwEnd = lpCandList->dwCount;
	
    {
        RECT rcWnd;
        GetClientRect(hCandWnd, &rcWnd);
        DrawConcaveRect(hDC,
              sImeG.rcCandText.left - 1,
              rcWnd.top,
              sImeG.rcCandText.right + 1,
              rcWnd.bottom - 1);
    }

    SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
    SetBkColor(hDC, RGB(0xC0, 0xC0, 0xC0));

    {
        int  nX = 0 , i;
        BOOL HighLight	;
	 
        ExtTextOut(hDC, 
			    sImeG.rcCandText.left, 
			    sImeG.rcCandText.top + 1,
                ETO_OPAQUE,
			    &sImeG.rcCandText, 
			    NULL, 0, NULL);
		
        for (i = 0; dwStart < dwEnd; dwStart++, i++) 
        {
            int iLen;
            int j;
            TCHAR AnsiStr[MAXCODE+1];
            SIZE StrSize;
            //display numbers
            AnsiStr[0] = szDigit[i + CAND_START];
            AnsiStr[1] = TEXT(':');
            AnsiStr[2] = 0;
            ExtTextOut(hDC, 
            sImeG.rcCandText.left + nX,
                  sImeG.rcCandText.top + 1,
                  ETO_CLIPPED,
                  &sImeG.rcCandText,
                  AnsiStr,
                  lstrlen(AnsiStr), NULL);
			
            if(!GetTextExtentPoint(hDC, 
                  (LPCTSTR)AnsiStr,
				  lstrlen(AnsiStr),
				  &StrSize))
                  memset(&StrSize,
				  0, sizeof(SIZE));
              nX += StrSize.cx;

            // display chinese word and code
            iLen = lstrlen((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[dwStart]));
            CopyMemory(szStrBuf,
                  ((LPBYTE)lpCandList + lpCandList->dwOffset[dwStart]),
                  iLen*sizeof(TCHAR));

            j = 0;
            while(j<iLen &&szStrBuf[j] > 0x100){ 
                  AnsiStr[j] =szStrBuf[j];
                  j++;
            }

	        AnsiStr[j]    = 0;
		 
	        if(sImeG. iCandSelID == i && sImeG.bGetFocus){
	           HighLight = TRUE;
       	       SetTextColor(hDC, RGB(0x00, 0x00, 0xFF));
			}
	   
            ExtTextOut(hDC, 
				 sImeG.rcCandText.left + nX,
				 sImeG.rcCandText.top + 1,
				 ETO_CLIPPED,
				 &sImeG.rcCandText,
				 AnsiStr,
				 lstrlen(AnsiStr), NULL);

            if(HighLight && sImeG.bGetFocus) {
				 SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
                 HighLight = FALSE;		
            }
			
            if(!GetTextExtentPoint(hDC, (LPCTSTR)AnsiStr, lstrlen(AnsiStr), &StrSize))
                memset(&StrSize, 0, sizeof(SIZE));
                nX += StrSize.cx;
        }
    }

    // load all bitmap
    hCandHBmp = LoadBitmap(hInst, TEXT("CandH"));
    hCandUBmp = LoadBitmap(hInst, TEXT("CandU"));
    hCandDBmp = LoadBitmap(hInst, TEXT("CandD"));
    hCandEBmp = LoadBitmap(hInst, TEXT("CandE"));
    hCandIconBmp = LoadBitmap(hInst, TEXT("CandSel"));
    hMemDC = CreateCompatibleDC(hDC);
    hOldBmp = (HBITMAP)SelectObject(hMemDC, hCandIconBmp);

    BitBlt(hDC, sImeG.rcCandIcon.left, 
		sImeG.rcCandIcon.top,
        sImeG.rcCandIcon.right - sImeG.rcCandIcon.left,
        STATUS_DIM_Y,
        hMemDC, 0, 0, SRCCOPY);

    SelectObject(hMemDC, hCandHBmp);
    BitBlt(hDC, sImeG.rcCandBTH.left, 
		sImeG.rcCandBTH.top,
        sImeG.rcCandBTH.right - sImeG.rcCandBTH.left,
        STATUS_DIM_Y,
        hMemDC, 0, 0, SRCCOPY);

    SelectObject(hMemDC, hCandUBmp);
    BitBlt(hDC, sImeG.rcCandBTU.left, 
		sImeG.rcCandBTU.top,
        sImeG.rcCandBTU.right - sImeG.rcCandBTU.left,
        STATUS_DIM_Y,
        hMemDC, 0, 0, SRCCOPY);

    SelectObject(hMemDC, hCandDBmp);
    BitBlt(hDC, sImeG.rcCandBTD.left, 
		sImeG.rcCandBTD.top,
        sImeG.rcCandBTD.right - sImeG.rcCandBTD.left,
        STATUS_DIM_Y,
        hMemDC, 0, 0, SRCCOPY);

    SelectObject(hMemDC, hCandEBmp);

    BitBlt(hDC, sImeG.rcCandBTE.left,
		sImeG.rcCandBTE.top,
        sImeG.rcCandBTE.right - sImeG.rcCandBTE.left,
        STATUS_DIM_Y,
        hMemDC, 0, 0, SRCCOPY);

    SelectObject(hMemDC, hOldBmp);
    DeleteDC(hMemDC);
    DeleteObject(hCandIconBmp);
    DeleteObject(hCandEBmp);
    DeleteObject(hCandDBmp);
    DeleteObject(hCandUBmp);
    DeleteObject(hCandHBmp);
    if (sImeG.fDiffSysCharSet){
         DeleteObject(SelectObject(hDC, hOldFont));
    }

   ImmUnlockIMCC(lpIMC->hPrivate);
UpCandW2UnlockCandInfo:
   ImmUnlockIMCC(lpIMC->hCandInfo);
UpCandW2UnlockIMC:
   ImmUnlockIMC(hIMC);
   return;
}

/**********************************************************************/
/* CandWndProc()                                                      */
/**********************************************************************/
LRESULT CALLBACK CandWndProc(
    HWND   hCandWnd,
    UINT   uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
//	__asm int 3;
    switch (uMsg) {
    case WM_DESTROY:
        DestroyCandWindow(hCandWnd);
        break;
    case WM_SETCURSOR:
		{
   	       POINT ptCursor;
           if (GetWindowLong(hCandWnd, UI_MOVE_OFFSET) !=
                    WINDOW_NOT_DRAG) {
                    SetCursor(LoadCursor(NULL, IDC_SIZEALL));
                    break;
            }
            SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
            GetCursorPos(&ptCursor);
            ScreenToClient(hCandWnd, &ptCursor);

            if (PtInRect(&sImeG.rcCandText, ptCursor)) {
                  SetCursor(LoadCursor(hInst, szHandCursor));
            } else if (PtInRect(&sImeG.rcCandBTH, ptCursor)) {
                 SetCursor(LoadCursor(hInst, szHandCursor));
            } else if (PtInRect(&sImeG.rcCandBTU, ptCursor)) {
                 SetCursor(LoadCursor(hInst, szHandCursor));
            } else if (PtInRect(&sImeG.rcCandBTD, ptCursor)) {
                SetCursor(LoadCursor(hInst, szHandCursor));
            } else if (PtInRect(&sImeG.rcCandBTE, ptCursor)) {
                SetCursor(LoadCursor(hInst, szHandCursor));
            } else {
                SetCursor(LoadCursor(NULL, IDC_SIZEALL));
            }
		}
		break;
    case WM_LBUTTONDOWN:
		{

            POINT ptCursor;
            if (GetWindowLong(hCandWnd, UI_MOVE_OFFSET) !=
                     WINDOW_NOT_DRAG) {
                     SetCursor(LoadCursor(NULL, IDC_SIZEALL));
               break;   
            }
	    	   
            SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
            ptCursor.x = LOWORD(lParam); 
            ptCursor.y = HIWORD(lParam);    
	
            if (PtInRect(&sImeG.rcCandText, ptCursor)){
               SetCursor(LoadCursor(hInst, szHandCursor));
               MouseSelectCandStr(hCandWnd, &ptCursor);
               break; 	   
           } else if (PtInRect(&sImeG.rcCandBTH, ptCursor)) {
               SetCursor(LoadCursor(hInst, szHandCursor));
               CandPageDownUP(hCandWnd, uCandHome);
               break;
           } else if (PtInRect(&sImeG.rcCandBTU, ptCursor)) {
               SetCursor(LoadCursor(hInst, szHandCursor));
               CandPageDownUP(hCandWnd, uCandUp);
               break;	   
           } else if (PtInRect(&sImeG.rcCandBTD, ptCursor)) {
               SetCursor(LoadCursor(hInst, szHandCursor));
               CandPageDownUP(hCandWnd, uCandDown);
               break;		   
           } else if (PtInRect(&sImeG.rcCandBTE, ptCursor)) {
               SetCursor(LoadCursor(hInst, szHandCursor));
               CandPageDownUP(hCandWnd, uCandEnd);
               break;		   
           } else {
               SetCursor(LoadCursor(NULL, IDC_SIZEALL));
           }
		}
		break;
    case WM_LBUTTONUP:
		{
           HDC             hDC;
           HBITMAP         hCandHBmp, hCandUBmp, hCandDBmp, hCandEBmp;
           HBITMAP         hOldBmp;
           HDC             hMemDC;

           if (GetWindowLong(hCandWnd, UI_MOVE_OFFSET) !=
                 WINDOW_NOT_DRAG) {
                 SetCursor(LoadCursor(NULL, IDC_SIZEALL));
                 break;   
           }

           hDC = GetDC(hCandWnd);
           hCandHBmp = LoadBitmap(hInst, TEXT("CandH"));
           hCandUBmp = LoadBitmap(hInst, TEXT("CandU"));
           hCandDBmp = LoadBitmap(hInst, TEXT("CandD"));
           hCandEBmp = LoadBitmap(hInst, TEXT("CandE"));
           hMemDC = CreateCompatibleDC(hDC);

           hOldBmp =(HBITMAP)SelectObject(hMemDC, hCandHBmp);
           BitBlt(hDC, sImeG.rcCandBTH.left, 
                 sImeG.rcCandBTH.top,
                 sImeG.rcCandBTH.right - sImeG.rcCandBTH.left,
                 STATUS_DIM_Y,
                 hMemDC, 0, 0, SRCCOPY);

           SelectObject(hMemDC, hCandUBmp);
           BitBlt(hDC, sImeG.rcCandBTU.left, 
                 sImeG.rcCandBTU.top,
                 sImeG.rcCandBTU.right - sImeG.rcCandBTU.left,
                 STATUS_DIM_Y,
                 hMemDC, 0, 0, SRCCOPY);

           SelectObject(hMemDC, hCandDBmp);
           BitBlt(hDC, sImeG.rcCandBTD.left, 
                 sImeG.rcCandBTD.top,
                 sImeG.rcCandBTD.right - sImeG.rcCandBTD.left,
                 STATUS_DIM_Y,
                 hMemDC, 0, 0, SRCCOPY);

           SelectObject(hMemDC, hCandEBmp);
           BitBlt(hDC, sImeG.rcCandBTE.left, 
                 sImeG.rcCandBTE.top,
                 sImeG.rcCandBTE.right - sImeG.rcCandBTE.left,
                 STATUS_DIM_Y,
                 hMemDC, 0, 0, SRCCOPY);

           SelectObject(hMemDC, hOldBmp);
           DeleteObject(hCandEBmp);
           DeleteObject(hCandDBmp);
           DeleteObject(hCandUBmp);
           DeleteObject(hCandEBmp);
           DeleteDC(hMemDC);
           ReleaseDC(hCandWnd, hDC);
		}
		break;
    case WM_IME_NOTIFY:
        if (wParam == IMN_SETCANDIDATEPOS){
           return SetCandPosition(hCandWnd);
		}
        break;
    case WM_PAINT:
		{
           HDC         hDC;
           PAINTSTRUCT ps;

           hDC = BeginPaint(hCandWnd, &ps);
           PaintCandWindow(hCandWnd, hDC);
           EndPaint(hCandWnd, &ps);
        }
        break;
    case WM_MOUSEACTIVATE:
        return (MA_NOACTIVATE);
		
    default:
        return DefWindowProc(hCandWnd, uMsg, wParam, lParam);
    }
    return (0L);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -