/*����������������������������������������������������������������������������*/ PSZ MpFormat(MPARAM mpValue, MP_FORMAT mpFormat, PSZ pszWhere) { /************************************************************************** * Local data **************************************************************************/ CHAR szC1[32], szC2[32], szC3[32], szC4[32]; /************************************************************************** * Locate control data for this MP format specification **************************************************************************/ PMPF_CONTROL pMPF = MpFind(mpFormat); /************************************************************************** * Process based on MP format specified **************************************************************************/ switch(pMPF->mpMethod) { /************************************************************************** * Format as one 32 bit value **************************************************************************/ case As_32: sprintf(pszWhere, pMPF->pszFormat, mpValue); break; /************************************************************************** * Format as two 16 bit values **************************************************************************/ case As_16_16: MpFormat(mpValue, MP_32H, pszWhere); strcat(pszWhere, ": "); sprintf( pszWhere + strlen(pszWhere), pMPF->pszFormat, SHORT2FROMMP(mpValue), SHORT1FROMMP(mpValue) ); break; /************************************************************************** * Format as 16 bit and two 8 bit values **************************************************************************/ case As_16_8_8: MpFormat(mpValue, MP_32H, pszWhere); strcat(pszWhere, ": "); sprintf( pszWhere + strlen(pszWhere), pMPF->pszFormat, SHORT2FROMMP(mpValue), CHAR2FROMMP(mpValue), CHAR1FROMMP(mpValue) ); break; /************************************************************************** * Format as 16 bit and two character values **************************************************************************/ case As_16_C_C: MpFormat(mpValue, MP_32H, pszWhere); strcat(pszWhere, ": "); sprintf( pszWhere + strlen(pszWhere), pMPF->pszFormat, SHORT2FROMMP(mpValue), MpAsCharacter( CHAR2FROMMP(mpValue), szC1 ), MpAsCharacter( CHAR1FROMMP(mpValue), szC2 ) ); break; /************************************************************************** * Format as two 8 bit and 16 bit values **************************************************************************/ case As_8_8_16: MpFormat(mpValue, MP_32H, pszWhere); strcat(pszWhere, ": "); sprintf( pszWhere + strlen(pszWhere), pMPF->pszFormat, CHAR4FROMMP(mpValue), CHAR3FROMMP(mpValue), SHORT1FROMMP(mpValue) ); break; /************************************************************************** * Format as two character and 16 bit values **************************************************************************/ case As_C_C_16: MpFormat(mpValue, MP_32H, pszWhere); strcat(pszWhere, ": "); sprintf( pszWhere + strlen(pszWhere), pMPF->pszFormat, MpAsCharacter( CHAR4FROMMP(mpValue), szC1 ), MpAsCharacter( CHAR3FROMMP(mpValue), szC2 ), SHORT1FROMMP(mpValue) ); break; /************************************************************************** * Format as four 8 bit values **************************************************************************/ case As_8_8_8_8: MpFormat(mpValue, MP_32H, pszWhere); strcat(pszWhere, ": "); sprintf( pszWhere + strlen(pszWhere), pMPF->pszFormat, CHAR4FROMMP(mpValue), CHAR3FROMMP(mpValue), CHAR2FROMMP(mpValue), CHAR1FROMMP(mpValue) ); break; /************************************************************************** * Format as four character values **************************************************************************/ case As_C_C_C_C: MpFormat(mpValue, MP_32H, pszWhere); strcat(pszWhere, ": "); sprintf( pszWhere + strlen(pszWhere), pMPF->pszFormat, MpAsCharacter( CHAR4FROMMP(mpValue), szC1 ), MpAsCharacter( CHAR3FROMMP(mpValue), szC2 ), MpAsCharacter( CHAR2FROMMP(mpValue), szC3 ), MpAsCharacter( CHAR1FROMMP(mpValue), szC4 ) ); break; } /************************************************************************** * Return where formatted MP text went **************************************************************************/ return(pszWhere); }
MRESULT hia_wmChar(HWND hwnd,MPARAM mp1,MPARAM mp2) { USHORT fsFlags = SHORT1FROMMP(mp1); UCHAR ucVkey = CHAR3FROMMP(mp2); UCHAR ucChar = CHAR1FROMMP(mp2); UCHAR ucScancode = CHAR4FROMMP(mp1); HIA *hia = WinQueryWindowPtr(hwnd,WINWORD_INSTANCE); USHORT ckey; // printf("HIA:: WM_CHAR\n"); if (fsFlags & KC_KEYUP) return 0L; if( hia->isHanjaKey != NULL ) { if( hia->isHanjaKey( fsFlags, ucScancode, ucVkey, ucChar )) { if( hia->inbuf->newpos != HIABUF_NONE ) { HANCHAR hch = SHORT1FROMMR( WinSendMsg( hwnd, HIAM_QUERYWORKINGHCH, 0, 0 )); HANCHAR hj; hj = hjselDlg( HWND_DESKTOP, hia->responseTo->hwnd, NULLHANDLE, hch ); if( hj != HCH_SINGLE_SPACE ) hch = hj; WinSendMsg( hwnd, HIAM_CANCELBUF, 0, 0 ); HIA_NotifyToConnected(hia,HIAN_COMPO_COMPLETE,MPFROMSHORT(hch)); HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROMSHORT(hch)); //WinSendMsg( hwnd, HIAM_COMPLETEHCH, 0, 0 ); //HIA_NotifyToConnected( hia, HIAN_HGHJCONVERT, MPFROMLONG( TRUE )); } else HIA_NotifyToConnected( hia, HIAN_HGHJCONVERT, 0); return MRFROMLONG( TRUE ); } } if( hia->isSpecialCharKey != NULL ) { if( hia->isSpecialCharKey( fsFlags, ucScancode, ucVkey, ucChar )) { SCSELINFO scselInfo = { -1, -1, -1 }; WinSendMsg( hwnd, HIAM_COMPLETEHCH, 0, 0 ); scselDlg( HWND_DESKTOP, hia->responseTo->hwnd, NULLHANDLE, &scselInfo ); if( scselInfo.hch != HCH_SINGLE_SPACE ) { HIA_NotifyToConnected(hia,HIAN_COMPO_COMPLETE,MPFROMSHORT(scselInfo.hch)); HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROMSHORT(scselInfo.hch)); } return MRFROMLONG( TRUE ); } } if (fsFlags & KC_VIRTUALKEY) { switch (ucVkey) { case VK_SPACE: WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L); if (FKC_SHIFTONLY(fsFlags)) WinSendMsg(hwnd,HIAM_CHANGEHANMODE,0L,0L); else if (FKC_CTRLONLY(fsFlags)) WinSendMsg(hwnd,HIAM_CHANGEKBDTYPE,0L,0L); else if (FKC_NONE(fsFlags)) HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROM2SHORT(' ',0)); return MRFROMLONG(TRUE); // consumed break; case VK_TAB: WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L); if (FKC_NONE(fsFlags)) { HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROM2SHORT('\t',0)); return MPFROMLONG(TRUE); // consumed } else { return MPFROMLONG(FALSE); } break; case VK_HOME: case VK_END: case VK_LEFT: case VK_UP: case VK_DOWN: case VK_PAGEUP: case VK_PAGEDOWN: case VK_PAGEDOWN + 0x90: case VK_DELETE: if ((fsFlags & KC_CHAR) && (FKC_NONE(fsFlags))) break; // considering keypad if (hia->inbuf->newpos != HIABUF_NONE) WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L); return MPFROMLONG(FALSE); break; case VK_ENTER: case VK_NEWLINE: if (hia->inbuf->newpos != HIABUF_NONE) WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L); return MPFROMLONG(FALSE); // not consumed break; case VK_RIGHT: if ((fsFlags & KC_CHAR) && (FKC_NONE(fsFlags))) break; // considering keypad if (hia->inbuf->newpos != HIABUF_NONE) { WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L); return MRFROMLONG(TRUE); } else { return MRFROMLONG(FALSE); // NOT consumed } break; case VK_BACKSPACE: if (hia->inbuf->newpos != HIABUF_NONE) { WinSendMsg(hwnd,HIAM_CANCELKEY,0L,0L); return MRFROMLONG(TRUE); } else { return MRFROMLONG(FALSE); } break; case VK_INSERT: if ((fsFlags & KC_CHAR) && (FKC_NONE(fsFlags))) break; // considering keypad if (hia->inbuf->newpos != HIABUF_NONE) WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L); if (FKC_NONE(fsFlags)) { WinSendMsg(hwnd,HIAM_CHANGEINSERTMODE,0L,0L); return MRFROMLONG(TRUE); } else { return MRFROMLONG(FALSE); } break; case VK_ESC : WinSendMsg(hwnd,HIAM_CANCELBUF,0L,0L); return FALSE; case VK_SHIFT : case VK_CTRL : case VK_ALT : return FALSE; } // switch WinSendMsg( hwnd, HIAM_COMPLETEHCH, 0, 0 ); return FALSE; } // Virtualkey if(( fsFlags & ( KC_CTRL | KC_ALT )) || (ucChar < 32) || (ucChar > 127)) { WinSendMsg( hwnd, HIAM_COMPLETEHCH, 0, 0 ); return FALSE; } if (hia->hanmode == HCH_ENG) { HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROM2SHORT(ucChar,0)); return MRFROMLONG(TRUE); } if ((hia_iskeypadkey(ucScancode))&&(fsFlags & KC_CHAR)) { WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L); HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROM2SHORT(ucChar,0)); return MRFROMLONG(TRUE); } ucChar = hia_transkey( fsFlags, ucScancode, ucChar ); if (WinGetKeyState(HWND_DESKTOP,VK_CAPSLOCK)) { if (fsFlags & KC_SHIFT) { ucChar = toupper(ucChar); } else { ucChar = tolower(ucChar); } } ckey = hia_convertkey(hia->kbdtype,ucChar); { HANCHAR completedHch; HANCHAR workingHch; if (ckey & 0x80) // if hangul key { ULONG oldbufState = hia->inbuf->newpos; if (hia->kbdtype == HAN_KBD_2) completedHch = HIAAutomata2(hia,ckey); else completedHch = HIAAutomata3(hia,ckey); workingHch = SHORT1FROMMR(WinSendMsg(hwnd,HIAM_QUERYWORKINGHCH,0L,0L)); if (completedHch) // if hch completed { HIA_NotifyToConnected(hia,HIAN_COMPO_COMPLETE,MPFROM2SHORT(completedHch,workingHch)); HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROM2SHORT(completedHch,workingHch)); if (workingHch) // begin composition of new hch HIA_NotifyToConnected(hia,HIAN_COMPO_BEGIN,MPFROM2SHORT(completedHch,workingHch)); } else { // if hch not completed if (workingHch) // if exist composing hch if (oldbufState) HIA_NotifyToConnected(hia,HIAN_COMPO_STEP, MPFROM2SHORT(0,workingHch)); else HIA_NotifyToConnected(hia,HIAN_COMPO_BEGIN, MPFROM2SHORT(0,workingHch)); } return MRFROMLONG(TRUE); // consumed } else { // !@#$%^&*() ,etc WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L); HIA_NotifyToConnected(hia,HIAN_INSERTHCH, MPFROM2SHORT(ckey,0)); return MRFROMLONG(TRUE); // consumed } } return MRFROMLONG(FALSE); // not consumed }
/**************************************************************************\ * * * ROUTINE: EntryFieldSubProc * * * * COMMENT: "Alarm..." dialog * * This procedure filter messages for the entry field and make it a time * * entry field. It doesn't allow for illigal characters according to the * * current selection. It doesn't allow modification of the time separator. * * It works only for hours and minutes. The entry field has to be limited * * to 5 characters. * * * * * * RETURNS: MRESULT, 0 or return value from WinDefDlgProc * * * \**************************************************************************/ MRESULT EXPENTRY EntryFieldSubProc(HWND hwnd, ULONG usMsg, MPARAM mp1, MPARAM mp2) { USHORT usSelect, fsKeyFlags, usLast; UCHAR usChr1; UCHAR uchHourMinutes[6]; BOOL bValid; if ((usMsg > WM_MOUSEFIRST) && (usMsg < WM_MOUSELAST)) { MRESULT mresult = pfnwpEntryField(hwnd, usMsg, mp1, mp2); MRESULT mresultSel = pfnwpEntryField(hwnd, EM_QUERYSEL, (PLONG)NULL, (PLONG)NULL); usSelect = LOUSHORT(mresultSel); usLast = HIUSHORT(mresultSel); if ((usSelect == 2)) pfnwpEntryField(hwnd, EM_SETSEL, MPFROM2SHORT(3, 3), NULL); if ((usSelect == 5)) pfnwpEntryField(hwnd, EM_SETSEL, MPFROM2SHORT(4, 4), NULL); return mresult; } switch (usMsg) { case WM_SETFOCUS: pfnwpEntryField(hwnd, usMsg, mp1, mp2); if (SHORT1FROMMP(mp2)) pfnwpEntryField(hwnd, EM_SETINSERTMODE, MPFROMSHORT(FALSE), (MPARAM)NULL); return MPVOID; case WM_CHAR: fsKeyFlags = SHORT1FROMMP(mp1); /* key flags */ if (!(fsKeyFlags & KC_KEYUP)) { usSelect = (USHORT)WinSendMsg(hwnd, EM_QUERYSEL, MPVOID, MPVOID); if (fsKeyFlags & KC_VIRTUALKEY) { switch(SHORT2FROMMP(mp2)) { case VK_UP: case VK_DOWN: break; case VK_LEFT: if (usSelect == 3) pfnwpEntryField(hwnd, usMsg, mp1, mp2); return pfnwpEntryField(hwnd, usMsg, mp1, mp2); break; case VK_RIGHT: if (usSelect == 4) { return MPVOID; } if (usSelect == 1) pfnwpEntryField(hwnd, usMsg, mp1, mp2); return pfnwpEntryField(hwnd, usMsg, mp1, mp2); break; case VK_DELETE: case VK_BACKSPACE: case VK_INSERT: return MPVOID; case VK_SPACE: switch (usSelect) { case 0: /* Hours most significant digit */ if (bTwelveHourFormat) { return pfnwpEntryField(hwnd, usMsg, mp1, mp2); } default: return MPVOID; } default: return pfnwpEntryField(hwnd, usMsg, mp1, mp2); break; } } else { if (fsKeyFlags & KC_CHAR) { bValid = FALSE; WinQueryWindowText(hwnd, sizeof(uchHourMinutes), uchHourMinutes); usChr1 = (UCHAR)CHAR1FROMMP(mp2); switch (usSelect) { case 0: /* Hours most significant digit */ if (bTwelveHourFormat) { if ((usChr1 > '1') || (usChr1 < '0')) { return MPVOID; } else { pfnwpEntryField(hwnd, usMsg, mp1, mp2); bValid = TRUE; } } else { if ((usChr1 > '2') || (usChr1 < '0')) { return MPVOID; } else { pfnwpEntryField(hwnd, usMsg, mp1, mp2); bValid = TRUE; } } if (bValid) { uchHourMinutes[0] = usChr1; uchHourMinutes[1] = '0'; WinSetWindowText(hwnd, uchHourMinutes); pfnwpEntryField(hwnd, EM_SETSEL, MPFROM2SHORT(1,1),(PLONG)NULL); } return MPVOID; break; case 1: if (bTwelveHourFormat) { if ((uchHourMinutes[0] == '0') || (uchHourMinutes[0] == ' ')) { if ((usChr1 > '9') || (usChr1 < '0')) { return MPVOID; } else { pfnwpEntryField(hwnd, usMsg, mp1, mp2); bValid = TRUE; } } else { /* probably 1 */ if ((usChr1 > '2') || (usChr1 < '0')) { return MPVOID; } else { pfnwpEntryField(hwnd, usMsg, mp1, mp2); bValid = TRUE; } } } else { if (uchHourMinutes[0] < '2') { if ((usChr1 > '9') || (usChr1 < '0')) { return MPVOID; } else { pfnwpEntryField(hwnd, usMsg, mp1, mp2); bValid = TRUE; } } else { if ((usChr1 > '4') || (usChr1 < '0')) { return MPVOID; } else { pfnwpEntryField(hwnd, usMsg, mp1, mp2); bValid = TRUE; } } } /* Fill the entry field as if a time separator is in also */ if (bValid) { mp2 = (MPARAM)(((ULONG)mp2 & 0xffffff00) | szTimeSep[0]); return pfnwpEntryField(hwnd, usMsg, mp1, mp2); } break; case 3: /* minutes left digit, 0-5 */ if ((usChr1 > '5') || (usChr1 < '0')) { return MPVOID; } else return pfnwpEntryField(hwnd, usMsg, mp1, mp2); break; case 4: /*minutes right digit, 0-9*/ if ((usChr1 > '9') || (usChr1 < '0')) { return MPVOID; } else { pfnwpEntryField(hwnd, usMsg, mp1, mp2); return pfnwpEntryField(hwnd, EM_SETSEL, MPFROM2SHORT(4,4), MPVOID); } break; } } } } default: return pfnwpEntryField(hwnd, usMsg, mp1, mp2); } }