自繪的textbox中可以直接輸入英文 可以跟蹤倒 WM_CHAR里有資料;輸入法輸入漢字除錯可以跟蹤倒 WM_IME_CHAR ,但跟蹤不到WM_CHAR訊息,無法顯示中文,請高手指點如何修改下面的代碼 能顯示中文
case WM_IME_CHAR:
m_NameBox.MsgProc( hWnd, msg, wParam, lParam );
LRESULT m_NameBox::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
case WM_KEYDOWN:
switch( wParam )
{
case VK_BACK:
return OnBackSpace();
}
break;
case WM_CHAR:
if (m_pInputString)
{
char *pTemp = (char *)&wParam;
if (m_bSkip)
{
if (m_nTotalBytes < m_nMaxLen)
{
if (m_nCurrentBytes < m_nTotalBytes)
{
for (short i=m_nTotalBytes-1; i>=m_nCurrentBytes; i--)
{
m_pszStr[i+1] = m_pInputString[i];
}
}
m_pInputString[m_nCurrentBytes] = m_cFChar;
m_nCurrentBytes++;
m_nTotalBytes++;
m_pInputString[m_nCurrentBytes]=pTemp[0];
m_nCurrentBytes++;
m_nTotalBytes++;
DrawText();
}
m_bSkip = FALSE;
}
else
{
if (pTemp[0] < 1)
{
m_cFChar=pTemp[0];
m_bSkip = TRUE;
}
else if (isprint(pTemp[0]))
{
if (m_nTotalBytes < m_nMaxLen)
{
if (m_nCurrentBytes < m_nTotalBytes)
{
for ( short i=m_nTotalBytes-1; i>=m_nCurrentBytes; i--)
{
m_pInputString[i+1] = m_pInputString[i];
}
}
m_pInputString[m_nCurrentBytes]=pTemp[0];
m_nCurrentBytes++;
m_nTotalBytes++;
}
DrawText();
}
}
break;
}
break;
default:
break;
}
return 0;
}
uj5u.com熱心網友回復:
代碼 為 多位元組字符集編碼uj5u.com熱心網友回復:
WM_IME_CHAR: 所有經由輸入法產生的字符都會產生WM_IME_CHAR訊息。DefWindowProc會將WM_IME_CHAR轉換為WM_CHAR訊息
WM_CHAR: 未經輸入法而直接送人程式中的字符會回應WM_CHAR訊息。
uj5u.com熱心網友回復:
好像輸入法輸入時沒有轉換為WM_CHAR訊息,直接跳過了,是不是要加代碼自己處理轉換?uj5u.com熱心網友回復:
case WM_IME_CHAR資訊直接呼叫m_NameBox.MsgProc( hWnd, msg, wParam, lParam ) 這行,然后 m_NameBox.MsgProc( hWnd, msg, wParam, lParam )整個處理代碼都已貼出,輸入法未回應WM_CHAR訊息,是不是 在 case WM_IME_CHAR資訊處理中,還需加一行 DefWindowProc 代碼?還是怎么解決,,菜鳥求高手幫忙uj5u.com熱心網友回復:
改為UNICODE 不是很省事?uj5u.com熱心網友回復:
LRESULT CTViewView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch(message)
{
case(WM_CHAR):
{
TRACE(_T("WM_CHAR %c\n"), wParam);
break;
}
case(WM_IME_CHAR):
{
PostMessage(WM_CHAR, HIBYTE(wParam), lParam);
PostMessage(WM_CHAR, LOBYTE(wParam), lParam);
return 0;
}
}
return CEditView::WindowProc(message, wParam, lParam);
}
uj5u.com熱心網友回復:
這是在兩個cpp里面的case WM_IME_CHAR:
m_NameBox.MsgProc( hWnd, msg, wParam, lParam );
break;
[code=c][LRESULT m_NameBox::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
case WM_KEYDOWN:
switch( wParam )
{
case VK_BACK:
return OnBackSpace();
}
break;
case WM_CHAR:
if (m_pInputString)
{
char *pTemp = (char *)&wParam;
if (m_bSkip)
{
if (m_nTotalBytes < m_nMaxLen)
{
if (m_nCurrentBytes < m_nTotalBytes)
{
for (short i=m_nTotalBytes-1; i>=m_nCurrentBytes; i--)
{
m_pszStr[i+1] = m_pInputString[i];
}
}
m_pInputString[m_nCurrentBytes] = m_cFChar;
m_nCurrentBytes++;
m_nTotalBytes++;
m_pInputString[m_nCurrentBytes]=pTemp[0];
m_nCurrentBytes++;
m_nTotalBytes++;
DrawText();
}
m_bSkip = FALSE;
}
else
{
if (pTemp[0] < 1)
{
m_cFChar=pTemp[0];
m_bSkip = TRUE;
}
else if (isprint(pTemp[0]))
{
if (m_nTotalBytes < m_nMaxLen)
{
if (m_nCurrentBytes < m_nTotalBytes)
{
for ( short i=m_nTotalBytes-1; i>=m_nCurrentBytes; i--)
{
m_pInputString[i+1] = m_pInputString[i];
}
}
m_pInputString[m_nCurrentBytes]=pTemp[0];
m_nCurrentBytes++;
m_nTotalBytes++;
}
DrawText();
}
}
break;
}
break;
default:
break;
}
return 0;
}/code]
uj5u.com熱心網友回復:
LRESULT m_NameBox::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
case WM_KEYDOWN:
switch( wParam )
{
case VK_BACK:
return OnBackSpace();
}
break;
case WM_CHAR:
if (m_pInputString)
{
char *pTemp = (char *)&wParam;
if (m_bSkip)
{
if (m_nTotalBytes < m_nMaxLen)
{
if (m_nCurrentBytes < m_nTotalBytes)
{
for (short i=m_nTotalBytes-1; i>=m_nCurrentBytes; i--)
{
m_pszStr[i+1] = m_pInputString[i];
}
}
m_pInputString[m_nCurrentBytes] = m_cFChar;
m_nCurrentBytes++;
m_nTotalBytes++;
m_pInputString[m_nCurrentBytes]=pTemp[0];
m_nCurrentBytes++;
m_nTotalBytes++;
DrawText();
}
m_bSkip = FALSE;
}
else
{
if (pTemp[0] < 1)
{
m_cFChar=pTemp[0];
m_bSkip = TRUE;
}
else if (isprint(pTemp[0]))
{
if (m_nTotalBytes < m_nMaxLen)
{
if (m_nCurrentBytes < m_nTotalBytes)
{
for ( short i=m_nTotalBytes-1; i>=m_nCurrentBytes; i--)
{
m_pInputString[i+1] = m_pInputString[i];
}
}
m_pInputString[m_nCurrentBytes]=pTemp[0];
m_nCurrentBytes++;
m_nTotalBytes++;
}
DrawText();
}
}
break;
}
break;
default:
break;
}
return 0;
}
uj5u.com熱心網友回復:
參考:微軟例子case WM_CHAR:
HandleChar(hWnd,wParam,lParam);
break;
//
LRESULT HandleChar(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
RECT rc;
HDC hIC;
SIZE sz0,sz1;
HFONT hOldFont;
LPMYSTR lp;
// is the previous received char is a DBCS lead byte char ?
static BOOL fIsPrevLeadByte = FALSE;
GetClientRect(hWnd,&rc);
hIC = CreateIC("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;
}
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
可以幫我改下那兩段代碼嘛void CCreateCharacterPage::MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
int ret = 0;
if(m_MsgPopUp.CheckMsgExist() == TRUE)
{
if((ret = m_MsgPopUp.MsgProc(hWnd, msg, wParam, lParam))==1)
{
g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc, NULL, GetCurrentThreadId());//
m_NameBox.SetEnable(TRUE);
if (g_pDSound)
g_pDSound->Play(g_SheetSound[SHEET_SND_CLICK]);
}
else if(ret ==-1)
return;
return;
}
switch ( msg )
{
case WM_LBUTTONDOWN:
m_NameBox.MsgProc( hWnd, msg, wParam, lParam );
if( m_pSVPage )
m_pSVPage->MsgProc( hWnd, msg, wParam, lParam );
break;
case WM_KEYDOWN:
case WM_CHAR:
case WM_IME_STARTCOMPOSITION:
case WM_IME_COMPOSITION:
case WM_IME_ENDCOMPOSITION:
case WM_IME_CHAR: //輸入法輸入可以跟蹤到這里
if( GetKeyState(VK_CONTROL) & 0x8000 )
return;
if (wParam == VK_HANJA) //
return;
m_NameBox.MsgProc( hWnd, msg, wParam, lParam );//這里可以跟蹤到。這個直接呼叫了另外一個代碼
break;
}
}
呼叫下面這個代碼
LRESULT CHanIme::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
m_hWnd = hWnd;
if (iGLang == 1)
{
return OnJapanMsg(hWnd, uMsg, wParam, lParam);
}
else if(iGLang == 3 || iGLang == 4)
{
return OnTaiwanMsg(hWnd, uMsg, wParam, lParam); //中文系統 進入后續處理代碼
} else {
switch ( uMsg)
{
case WM_IME_COMPOSITION:
if(strlen(m_pszStr)<(m_nMaxLen*2)-2 || m_bIsComp==FALSE) {
OnIMEComposition(wParam, lParam);
DrawText();
}
break;
case WM_IME_ENDCOMPOSITION:
break;
case WM_CHAR:
if(!m_bLetterFlag){
OnChar(wParam);
DrawText();
}
break;
case WM_KEYDOWN:
if(!m_bLetterFlag){
OnKeyDown(wParam);
DrawText();
}
break;
}
}
return 0;
}
跟蹤到此函式
LRESULT CHanIme::OnTaiwanMsg( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
case WM_KEYDOWN:
switch( wParam )
{
case VK_BACK:
return OnTaiwanBackSpace();
}
break;
case WM_CHAR: //英文輸入可以跟蹤到,中文輸入 無法跟蹤到,無法顯示中文輸入了
//if( wParam == VK_BACK )
//{ return OnTaiwanBackSpace(); }
if (m_pInputString)
{
char *pTemp = (char *)&wParam;
if (m_bSkip)
{
if (m_nTotalBytes < m_nMaxLen)
{
if (m_nCurrentBytes < m_nTotalBytes)
{
for (short i=m_nTotalBytes-1; i>=m_nCurrentBytes; i--)
{
m_pszStr[i+1] = m_pInputString[i];
}
}
m_pInputString[m_nCurrentBytes] = m_cFChar;
m_nCurrentBytes++;
m_nTotalBytes++;
m_pInputString[m_nCurrentBytes]=pTemp[0];
m_nCurrentBytes++;
m_nTotalBytes++;
DrawText();
}
m_bSkip = FALSE;
}
else
{
if (pTemp[0] < 1)
{
m_cFChar=pTemp[0];
m_bSkip = TRUE;
}
else if (isprint(pTemp[0]))
{
if (m_nTotalBytes < m_nMaxLen)
{
if (m_nCurrentBytes < m_nTotalBytes)
{
for ( short i=m_nTotalBytes-1; i>=m_nCurrentBytes; i--)
{
m_pInputString[i+1] = m_pInputString[i];
}
}
m_pInputString[m_nCurrentBytes]=pTemp[0];
m_nCurrentBytes++;
m_nTotalBytes++;
}
DrawText(); //顯示到自繪的文本框
}
}
break;
}
break;
default:
break;
}
return 0;
}
BOOL CHanIme::OnTaiwanBackSpace()
{
if (m_pInputString)
{
if (m_nCurrentBytes > 0)
{
short i, j;
for (j=0; j < m_nCurrentBytes; j++)
{
if (m_pInputString[j] < 0)
{
if ( j+2 == m_nCurrentBytes)
break;
else
j++;
}
}
if (j+2 == m_nCurrentBytes)
{
m_nCurrentBytes -= 2;
for (i=m_nCurrentBytes; i <m_nTotalBytes; i++)
{
m_pInputString[i] = m_pInputString[i+2];
}
m_nTotalBytes -= 2;
m_pInputString[m_nTotalBytes] = m_pInputString[m_nTotalBytes+1] = '\0';
}
else
{
m_nCurrentBytes--;
for (i=m_nCurrentBytes; i < m_nTotalBytes; i++)
{
m_pInputString[i] = m_pInputString[i+1];
}
m_nTotalBytes--;
m_pInputString[m_nTotalBytes]= '\0';
}
DrawText();
}
}
return 1;
}
求高人指點
uj5u.com熱心網友回復:
"微軟輸入法編程例子.zip"https://download.csdn.net/download/schlafenhamster/4693198
"本檔案包含3個 輸入法編程程式: 1。IME half aware 半知覺IME 2。IME full aware 全知覺IME 3。IME application VC6 通過"
uj5u.com熱心網友回復:
原來方向搞錯了。程式獲取不到WM_IME_CHAR 訊息怎么辦,uj5u.com熱心網友回復:
試試case WM_IME_NOTIFY:
uj5u.com熱心網友回復:
請高手解決loginpage.cpp代碼中
void CLoginPage::MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
int ret;
int x, y;
switch ( msg )
{
case WM_RBUTTONUP:
x = LOWORD (lParam);
y = HIWORD (lParam);
break;
case WM_LBUTTONDOWN:
{
x = LOWORD (lParam);
y = HIWORD (lParam);
if( m_bIsLoadingEnd && !m_bIsAniEnd )
{
m_bIsAniEnd = TRUE;
return;
}
}
case WM_MOUSEMOVE:
m_LoginBtn.MsgProc( hWnd, msg, wParam, lParam);
break;
case WM_LBUTTONUP:
m_LoginBtn.MsgProc( hWnd, msg, wParam, lParam );
break;
case WM_KEYDOWN:
if(wParam ==VK_TAB || wParam ==VK_RETURN ) //TAB
{
if(m_IdBox.GetEnable() == TRUE)
{
m_IdBox.SetEnable(FALSE);
}
}
case WM_CHAR:
case WM_IME_STARTCOMPOSITION:
case WM_IME_COMPOSITION:
case WM_IME_ENDCOMPOSITION:
case WM_IME_CHAR: //這里 可以 接受到資訊
case WM_IME_NOTIFY:
m_IdBox.MsgProc( hWnd, msg, wParam, lParam ); //這是新開的一個文本框 編輯 輸入文字的 他跳轉的代碼在下面的textbox.cpp中
break;
}
}
呼叫的 textbox.cpp 代碼
LRESULT CTextBox::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )//在這個函式中獲取不到 WM_IME_CHAR訊息了
{
switch ( uMsg)
{
case WM_LBUTTONDOWN:
if ( (IsInside(LOWORD(lParam), HIWORD(lParam))) /*&& (!m_bDisable)*/ )
{
m_bEnabled = TRUE;
return S_OK;
}
else
{
m_bEnabled = FALSE;
}
break;
default:
break;
}
if (m_bEnabled)
return CHanIme::MsgProc(hWnd, uMsg, wParam, lParam);//呼叫英文輸入處理
else
return E_FAIL;
}
haime.cpp
LRESULT CHanIme::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
m_hWnd = hWnd;
switch ( uMsg)
{
case WM_IME_CHAR: //這里 接收不到資訊
case WM_IME_COMPOSITION:
if(strlen(m_pszStr)<(m_nMaxLen*2)-2 || m_bIsComp==FALSE)
{
OnIMEComposition(wParam, lParam);
DrawText();
}
break;
case WM_IME_ENDCOMPOSITION:
break;
case WM_CHAR:
if(!m_bLetterFlag)
{
OnChar(wParam);
DrawText();
}
break;
case WM_KEYDOWN:
if(!m_bLetterFlag)
{
OnKeyDown(wParam);
DrawText();
}
break;
}
return 0;
}
該如何修改代碼 可以中文輸入,資訊了
uj5u.com熱心網友回復:
不如把你的工程壓縮 ,上傳到一個(免分的 ,不是 這里)地方 !uj5u.com熱心網友回復:
在哪里?你可以幫我改嗎?uj5u.com熱心網友回復:
Using Keyboard Inputuj5u.com熱心網友回復:
要把 上傳 整個 。cpp 檔案轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/59501.html
標籤:基礎類
