В листинге 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); //Получение контекста ввода


⇐ Предыдущая| |Следующая ⇒