В листинге 9.3 приведен текст оконной процедуры I ME Ed i t(). Внутренняя текстовая строка элемента Edit в данном примере не используется. Она продублирована строкой wchar_t szComStr[25]. Поэтому данная процедура перехватывает и самостоятельно обрабатывает также сообщения WM_SETTEXT, WM_CHAR, WM GETTEXT.
Ввод иероглифов Листинг 9.3
#define UNICODE #define JJNICODE #include <windows.h> static wchar_t szComStr[25] static int nComSize
BOOL CALLBACK IMEEdit(HWND hWnd.UINT m.LPARAM w.WPARAM 1)
{//Здесь hWnd - это дескриптор окна элемента Edit, а не диалога в целом
int tL - 0;int i - 0;
wcharj tS[] - L" ":
if(L0W0RD(m)! - WMJETTEXT &&
LOWORD(m)! - WMJETTEXT &&L0W0RD(m)! - WM_CHAR) i- CallWindowProcCDef.hWnd.m.w.l); //Вызов стандартной обработки if(L0W0RD(m)-« WMJETFOCUS)
forCint k - 0; k<wcslen(m szComStr); k++) m szComStr[k]-0; if(L0W0RD(m)«- WM_PAINT) {
//Нельзя вызывать BeginPaint(hWnd.&ps) Дефектная область уже уничтожена //стандартной обработкой HDC hdc - GetDC(hWnd)
TextOut(hdc.0.0.tS.wcslen(tS)): //Стерли предыдущий текст
TextOut(hdc.O.O.szComStr.wcslen(szComStr)); //Вывели новый текст
ReleaseDC(hWnd.hdc);
return 0;
}
if(LOWORDCm)-WMJETTEXT) {
// SetDlgltemText порождает сообщения WMJETTEXT. WMJAINT
wchar_t *pS - (wchar_t //Адрес передаваемой приложением строки
int nComSize - wcslen(pS): //Размер передаваемой приложением строки
if(m_nComSize>24) mjiComSize - 24;
wcscpy(szComStr.pS):
Inva1i dateRect(hWnd.NULL.TRUE);
return 1;
}
i f (LOWORD (m)-WMJETTEXT) {
//Функция GetDlgltemText порождает сообщение WMJETTEXT int IS - wcslen(szComStr);
wchar_t *pS - (wchar_t *)1; //Адрес получателя строки if(w<lS) IS - w;
memcpy(pS.szComStr.2*lS); //Если в окне строка длиннее приемника, //то копируем ее часть pS[lS] - 0; return i;
}
//Сообщение от окна ввода UNICODE
if(LOWORD(m)-WM_IME_COMPOSITION) //Если кнопка нажимается {
if(l & GCSJESULTSTR) //строка UNICODE готова {tL - wcslen(szComStr);
HIMC hIMC - ImmGetContext(hWnd); //Получение контекста ввода