karopi:
是的,大部份都介紹Delphi的程式,但我因業務需要我硬是翻Delphi為
Builder C 的程式,以下的程式完全以C 完成,我相信比較符合你的需求,
並請注意紅字部分它可以對映出鍵盤英數字的第一碼,請參考!
以下為完整程式。我似乎應該放置創作發表區才是才怪!這也是翻> key=""
s="" > 1) {
// s=s.SubString(1,2);
// key =KeyBoard_In(s); // 此為對應鍵盤英數字
key =s.SubString(1,2); // 此為注音首字
}
}
else
key =(char) str_[k]; // 非中文字
}
return (key);
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::ChineseComp(AnsiString Chinese_Str)
{
int iHandleCount;
int nHKL_LIST = 20;
HKL pList[20];
AnsiString sFound="";
char szImeName[254];
StrPCopy(szImeName,'\0');
iHandleCount = GetKeyboardLayoutList(nHKL_LIST, pList);
for (int i=0;i 0) {
sFound = QueryCompStr(pList[i], Chinese_Str);
if ( StrPas(szImeName).Pos("注音") >0 ) {
i =iHandleCount;
}
}
}
// Label1->Caption=sFound;
return sFound; // 傳回注音
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::QueryCompStr( HKL hKB,AnsiString sChinese )
{
DWORD dwGCL;
LPCANDIDATELIST szBuffer;
int iMaxKey, iStart;
AnsiString Result="";
iMaxKey = ImmEscape(hKB, 0, IME_ESC_MAX_KEY, NULL);
if (iMaxKey <= 0)
return Result;
// 看看這個輸入法是否支援 Reverse Conversion 功能
// 同時, 偵測需要多大的空間容納取得的資訊
// comment: 下次修改時可以改成動態配置記憶體的方式
dwGCL = ImmGetConversionList(
hKB,
0,
sChinese.c_str(),
NULL,
0,
GCL_REVERSECONVERSION);
if (dwGCL <= 0 ) // 該輸入法不支援 Reverse Conversion 功能
return Result;
szBuffer=(LPCANDIDATELIST)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwGCL);
// 取得組字字根資訊, dwGCL 的值必須以上次呼叫 ImmGetConversionList
// 傳回值代入
dwGCL = ImmGetConversionList(
hKB,
0,
sChinese.c_str(),
szBuffer,
dwGCL,
GCL_REVERSECONVERSION);
Label4->Caption=dwGCL;
if (dwGCL > 0 ) {
iStart = szBuffer->dwCount;
Label3->Caption=iStart;
for (int i=0;i < iStart ;i )
Result =(char*)szBuffer szBuffer->dwOffset[i];
}
HeapFree(GetProcessHeap(), 0, szBuffer);
return Result;
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::KeyBoard_In(AnsiString Str)
{
AnsiString key=""; // Return 值
char str[2];
StrPCopy(str,Str);
if (str[0] == -93) {
switch (str[1]) {
case 116: // ㄅ
key="1";
break;
case 117: // ㄆ
key="Q";
break;
case 118: // ㄇ
key="A";
break;
case 119: // ㄈ
key="Z";
break;
case 120: // ㄉ
key="2";
break;
case 121: // ㄊ
key="W";
break;
case 122: // ㄋ
key="S";
break;
case 123: // ㄌ
key="X";
break;
case 124: // ㄍ
key="E";
break;
case 125: // ㄎ
key="D";
break;
case 126: // ㄏ
key="C";
break;
case -95: // ㄐ
key="R";
break;
case -94: // ㄑ
key="F";
break;
case -93: // ㄒ
key="V";
break;
case -92: // ㄓ
key="5";
break;
case -91: // ㄔ
key="T";
break;
case -90: // ㄕ
key="G";
break;
case -89: // ㄖ
key="B";
break;
case -88: // ㄗ
key="Y";
break;
case -87: // ㄘ
key="H";
break;
case -86: // ㄙ
key="N";
break;
case -72: // ㄧ
key="U";
break;
case -71: // ㄨ
key="J";
break;
case -70: // ㄩ
key="M";
break;
case -85: // ㄚ
key="8";
break;
case -84: // ㄛ
key="I";
break;
case -83: // ㄜ
key="K";
break;
case -82: // ㄝ
key=",";
break;
case -81: // ㄞ
key="9";
break;
case -80: // ㄟ
key="O";
break;
case -79: // ㄠ
key="L";
break;
case -78: // ㄟ
key=".";
break;
case -77: // ㄠ
key="0";
break;
case -76: // ㄡ
key="P";
break;
case -75: // ㄢ
key=";";
break;
case -74: // ㄣ
key="/";
break;
case -73: // ㄦ
key="-";
break;
default:
key="";
break;
}
}
return (key);
}
Andy Chang 發表人 - andychang1690 於 2004/09/08 04:15:19