Mores.h #pragma once #include <windows.h> #include <tchar.h> #include <Commctrl.h> #include <process.h> #include <Richedit.h> #include "resource.h" #pragma comment(lib, "comctl32.lib") #pragma comment(linker,"/manifestdependency:/"type='win32' name='Microsoft.Windows.Common-Controls' "/ "version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'/"") #define WM_CHECKSTATE WM_USER+100 #define WM_THREADEXIT WM_USER+200 #define P_DURATION 100 // 点的持续时间 #define L_DURATION P_DURATION*3 // 划的持续时间 #define INTERV_DURATION P_DURATION*2 // 字元间隔的持续时间 #define SPEC_DURATION P_DURATION*5 // 单词间隔(空格)的持续时间 #define SYMBCOUNT 17 //标点符号数目 #define SYMBITMCOUNT 8 //每个标点符号的摩斯码数目 #define NUMCOUNT 10 //数字个数 #define NUMITMCOUNT 6 //每个数字的摩斯码个数 #define ALPHCOUNT 26 //字母.. #define ALPHITMCOUNT 5 //每个字母的.. //#define RCVBUFLEN 1024 //接收输入框字符串的缓存大小 #define CVTBUFLEN SYMBITMCOUNT //字元对应的摩斯码的缓存大小 typedef struct _vector { TCHAR charAsii; TCHAR szMos[SYMBITMCOUNT]; }VECTOR; typedef VECTOR* PVECTOR; const TCHAR szAlphes[ALPHCOUNT][ALPHITMCOUNT] = {{_T(".-")}, {_T("-...")}, {_T("-.-.")}, {_T("-..")}, {_T(".")}, {_T("..-.")}, {_T("--.")}, {_T("....")}, {_T("..")}, {_T(".---")}, {_T("-.-")}, {_T(".-..")}, {_T("--")}, {_T("-.")}, {_T("---")}, {_T(".--.")}, {_T("--.-")}, {_T(".-.")}, {_T("...")}, {_T("-")}, {_T("..-")}, {_T("...-")}, {_T(".--")}, {_T("-..-")}, {_T("-.--")}, {_T("--..")}, }; const TCHAR szNumbers[NUMCOUNT][NUMITMCOUNT] = {{_T("-----")}, {_T(".----")}, {_T("..---")}, {_T("...--")}, {_T("....-")}, {_T(".....")}, {_T("-....")}, {_T("--...")}, {_T("---..")}, {_T("----.")}}; const VECTOR symbols[SYMBCOUNT] = { {_T('!'),{_T("-.-.--")}}, // ! {_T('"'),{_T(".-..-.")}}, // " {_T('$'),{_T("...-..-")}}, // $ {_T('&'),{_T(". ...")}}, // & {_T('/''),{_T(".----.")}}, // ' {_T('('),{_T("-.--.")}}, // ( {_T(')'),{_T("-.--.-")}}, // ) {_T(','),{_T("--..--")}}, // {_T('-'),{_T("-....-")}}, // - {_T('.'),{_T(".-.-.-")}}, // . {_T('/'),{_T("-..-.")}}, // / {_T(':'),{_T("---...")}}, // : {_T(';'),{_T("-.-.-.")}}, // ; {_T('='),{_T("-...-")}}, // = {_T('?'),{_T("..--..")}}, // ? {_T('@'),{_T(".--.-.")}}, // @ {_T('_'),{_T("..--.-")}}, // _ }; const TCHAR szErr[] = _T("在文本框内输入需要转换的内容(西欧字符)或在摩斯码框内输入摩斯码,点击按钮。"); Mores.cpp #include "Mores.h" / TCHAR g_szCvtBuf[CVTBUFLEN]; BOOL g_bSound,g_bRunning, g_bTxtToMos; HANDLE g_hEvent; BOOL CharToMos(TCHAR srcChar, LPTSTR dstBuf, DWORD bufSize, PDWORD pRstCount) { if(!dstBuf) return FALSE; if( srcChar - '0' >=0 && srcChar <= '9') { if(bufSize < NUMITMCOUNT) return FALSE; wcscpy_s(dstBuf, bufSize, szNumbers[srcChar - '0']); if(pRstCount) *pRstCount = wcslen(szNumbers[srcChar - '0']); return TRUE; } int lowChar = tolower(srcChar); if(lowChar >= 'a' && lowChar <= 'z' ) { if(bufSize < ALPHITMCOUNT) return FALSE; wcscpy_s(dstBuf, bufSize, szAlphes[lowChar - 'a']); if(pRstCount) *pRstCount = ALPHITMCOUNT; return TRUE; } for(int i=0; i<SYMBCOUNT; i++) { if(srcChar == symbols[i].charAsii) { if(bufSize < SYMBITMCOUNT) return FALSE; wcscpy_s(dstBuf, bufSize, symbols[i].szMos); if(pRstCount) *pRstCount = SYMBITMCOUNT; return TRUE; } } return FALSE; } TCHAR MosToChar(LPTSTR lpMos) { if(!lpMos) return FALSE; for(int i=NUMCOUNT-1; i>=0; i--) { if( wmemcmp(szNumbers[i],lpMos, max(lstrlen(szNumbers[i]) , lstrlen(lpMos))) == 0) return i+'0'; } for(int i=ALPHCOUNT-1; i>=0; i--) { if(wmemcmp(szAlphes[i], lpMos, max(lstrlen(szAlphes[i]) , lstrlen(lpMos))) == 0) return i + 'a'; } for(int i=SYMBCOUNT-1; i>=0; i--) { if(wmemcmp(symbols[i].szMos, lpMos, max(lstrlen(symbols[i].szMos) , lstrlen(lpMos))) ==0) return symbols[i].charAsii; } return NULL; } BOOL IsMoresChar(TCHAR ch) { for(int i=SYMBCOUNT-1; i>=0; i--) { if(symbols[i].charAsii == ch) return TRUE; } return (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')?TRUE:FALSE; } void MosToTxtProc(void* hDlg) { HWND hInEdit, hOutEdit; LPTSTR lpRcvBuf; DWORD allCount, idx=0; int startIdx, count; LPTSTR lpCvtBuf; TCHAR szChar[2] = _T(""); hOutEdit = GetDlgItem((HWND)hDlg,IDC_EDIT1); hInEdit = GetDlgItem((HWND)hDlg,IDC_EDIT2); allCount = GetWindowTextLength(hInEdit); lpRcvBuf = (LPTSTR)malloc((allCount+1)*sizeof(TCHAR)); GetWindowText(hInEdit,lpRcvBuf,(allCount+1)*sizeof(TCHAR)); while(g_bRunning && idx < allCount) { startIdx = -1; count = 0; for(; idx<allCount; idx++) { if( (lpRcvBuf[idx] == '.' || lpRcvBuf[idx] == '*' || lpRcvBuf[idx] == '-') && startIdx == -1) startIdx = idx; if(lpRcvBuf[idx] == '/' && startIdx != -1) { count = idx-startIdx; break; } if(idx == allCount-1 && startIdx != -1) { count = idx-startIdx + 1; break; } if(lpRcvBuf[idx] == ' ' && lpRcvBuf[idx+1] == ' ' && (idx < allCount-1) && startIdx > -1) { count = idx - startIdx; break; } } if(count > 0) { lpCvtBuf = (LPTSTR)malloc((count+1)*sizeof(TCHAR)); memset(lpCvtBuf,0,(count+1)*sizeof(TCHAR)); wmemcpy(lpCvtBuf, &lpRcvBuf[startIdx],count); for(int i=0; i<lstrlen(lpCvtBuf); i++) if(lpCvtBuf[i] == '*') lpCvtBuf[i] = '.'; SendMessage(hOutEdit,EM_SETSEL,-1,-1); if( (szChar[0] = MosToChar(lpCvtBuf)) != NULL ) { szChar[1] = 0; SendMessage(hOutEdit,EM_REPLACESEL,FALSE,(LPARAM)szChar); } else SendMessage(hOutEdit,EM_REPLACESEL,FALSE,(LPARAM)lpCvtBuf); free(lpCvtBuf); } idx++; } g_bRunning =FALSE; free(lpRcvBuf); PostMessage((HWND)hDlg, WM_THREADEXIT, 0, 0); return; } void TxtToMosProc(void* hDlg) { HWND hInEdit, hOutEdit; LPTSTR lpRcvBuf; DWORD allCount, idx=0; hOutEdit = GetDlgItem((HWND)hDlg,IDC_EDIT2); hInEdit = GetDlgItem((HWND)hDlg,IDC_EDIT1); allCount = GetWindowTextLength(hInEdit); lpRcvBuf = (LPTSTR)malloc((allCount+1)*sizeof(TCHAR)); GetWindowText(hInEdit,lpRcvBuf,wcslen(lpRcvBuf)); while(g_bRunning && idx < allCount) { if(g_bSound) { while(wcslen(g_szCvtBuf) > 0 && g_bSound && g_bRunning) Sleep(10); WaitForSingleObject(g_hEvent, INFINITE); ResetEvent(g_hEvent); } while(idx < allCount) { if(!IsMoresChar(lpRcvBuf[idx])) { g_szCvtBuf[0] = lpRcvBuf[idx]; g_szCvtBuf[1] = NULL; SendMessage(hOutEdit,EM_SETSEL,-1,-1); SendMessage(hOutEdit,EM_REPLACESEL,FALSE,(LPARAM)g_szCvtBuf); idx++; continue; } else { CharToMos(lpRcvBuf[idx], g_szCvtBuf, CVTBUFLEN, NULL); break; } } if(idx <allCount) { SendMessage(hOutEdit,EM_SETSEL,-1,-1); SendMessage(hOutEdit,EM_REPLACESEL,FALSE,(LPARAM)g_szCvtBuf); SendMessage(hOutEdit,EM_REPLACESEL,FALSE,(LPARAM)_T("/")); idx++; } if(g_bSound) SetEvent(g_hEvent); } // free(lpRcvBuf); if(g_bSound) Sleep(SPEC_DURATION); g_bRunning = FALSE; PostMessage((HWND)hDlg, WM_THREADEXIT, 0, 0); return; } void SoundProc(void* hDlg) { int count, duration = 0; while(g_bSound && g_bRunning) { count = wcslen(g_szCvtBuf); while(count <= 0 && g_bRunning &&g_bSound) { Sleep(1); count = wcslen(g_szCvtBuf); } WaitForSingleObject(g_hEvent,INFINITE); ResetEvent(g_hEvent); for(int i=0; i<count; i++) { if( g_szCvtBuf[i] == '.') duration = P_DURATION; else if(g_szCvtBuf[i] == '-') duration = L_DURATION; else if(g_szCvtBuf[i] == ' ') { Sleep(INTERV_DURATION); continue; } else break; Beep(1000, duration); Sleep(P_DURATION); } memset(g_szCvtBuf,0,CVTBUFLEN); SetEvent(g_hEvent); Sleep(SPEC_DURATION); } PostMessage((HWND)hDlg, WM_THREADEXIT, 0, 0); return; } BOOL CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { RECT rect ,tblRect; int tblW ,tblH; static HWND hInEdit,hOutEdit; static int trdCount; static BOOL bShowTable = FALSE; CHARFORMAT cfm; EDITBALLOONTIP ebt; HANDLE hShowRstTrd, hSoundTrd; static HWND hwndTable = NULL; HFONT hFont; // PTCHAR pRcvBuf = NULL; switch(uMsg) { case WM_COMMAND: { switch(LOWORD(wParam)) { case IDC_BUTTON1: if(g_bRunning) return TRUE; if(GetWindowTextLength(hInEdit) <= 0) { ebt.cbStruct = sizeof(EDITBALLOONTIP); ebt.pszText = szErr; ebt.pszTitle = _T("Error"); ebt.ttiIcon = TTI_ERROR; Edit_ShowBalloonTip(hInEdit,&ebt); return TRUE; } g_bRunning = TRUE; SendMessage(hDlg,WM_CHECKSTATE, 0, 0); if(g_bTxtToMos) hShowRstTrd = (HANDLE)_beginthread(TxtToMosProc,0,hDlg); else hShowRstTrd = (HANDLE)_beginthread(MosToTxtProc,0,hDlg); trdCount++; CloseHandle(hShowRstTrd); hShowRstTrd = NULL; if(g_bSound && g_bTxtToMos) { hSoundTrd = (HANDLE)_beginthread(SoundProc,0,hDlg); trdCount++; CloseHandle(hSoundTrd); } return TRUE; case IDC_BUTTON2: g_bRunning = FALSE; return TRUE; case IDC_CHECK1: g_bSound = ~g_bSound; if(g_bRunning && g_bSound && g_bTxtToMos) { hSoundTrd =(HANDLE)_beginthread(SoundProc,0,NULL); CloseHandle(hSoundTrd); } return TRUE; case IDC_CHECK2: bShowTable = ~bShowTable; if(hwndTable == NULL) hwndTable = CreateDialogParam((HINSTANCE)GetModuleHandle(0), MAKEINTRESOURCE(IDD_FORMVIEW), hDlg, NULL, NULL); GetWindowRect(hwndTable,&tblRect); tblH = tblRect.bottom - tblRect.top; tblW = tblRect.right - tblRect.left; if(bShowTable) { GetWindowRect(hDlg,&rect); int tmp; if(rect.top - tblH/2 < 0) tmp = 0; else tmp = rect.top - tblH/2; MoveWindow(hDlg,rect.left, tmp, rect.right-rect.left, rect.bottom-rect.top+tblH,TRUE); GetWindowRect(hDlg,&rect); MoveWindow(hwndTable, 11, 240,tblW,tblH,TRUE); ShowWindow(hwndTable,SW_SHOW); } else { GetWindowRect(hDlg,&rect); MoveWindow(hDlg,rect.left, rect.top+tblH/2, rect.right-rect.left,rect.bottom-rect.top-tblH,TRUE); DestroyWindow(hwndTable); hwndTable = NULL; } return TRUE; case IDC_EDIT1: g_bTxtToMos = TRUE; hInEdit = (HWND)lParam; hOutEdit = GetDlgItem(hDlg, IDC_EDIT2); if(!g_bRunning) EnableWindow(GetDlgItem(hDlg, IDC_CHECK1),TRUE); return TRUE; case IDC_EDIT2: g_bTxtToMos = FALSE; hOutEdit = GetDlgItem(hDlg, IDC_EDIT1); hInEdit = (HWND)lParam; // CheckDlgButton(hDlg,IDC_CHECK1,BST_UNCHECKED); // g_bSound = FALSE; if(!g_bRunning) EnableWindow(GetDlgItem(hDlg, IDC_CHECK1),FALSE); return TRUE; default: return FALSE; } } return FALSE; case WM_CHECKSTATE: if(g_bRunning) { SetEvent(g_hEvent); SendMessage(hOutEdit, WM_SETTEXT,0,(LPARAM)_T("")); memset(g_szCvtBuf, 0, CVTBUFLEN); EnableWindow(GetDlgItem(hDlg,IDC_BUTTON1),FALSE); EnableWindow(GetDlgItem(hDlg,IDC_BUTTON2),TRUE); EnableWindow(hInEdit,FALSE); EnableWindow(hOutEdit,FALSE); return TRUE; } Beep(3000,100); EnableWindow(GetDlgItem(hDlg,IDC_BUTTON1),TRUE); EnableWindow(GetDlgItem(hDlg,IDC_BUTTON2),FALSE); EnableWindow(hInEdit,TRUE); EnableWindow(hOutEdit,TRUE); // SendMessage(hDlg, WM_SETFOCUS, (WPARAM)(GetDlgItem(hDlg, g_bTxtToMos?IDC_EDIT1:IDC_EDIT2)),0); SetFocus(GetDlgItem(hDlg, g_bTxtToMos?IDC_EDIT2:IDC_EDIT1)); return TRUE; case WM_THREADEXIT: if( --trdCount == 0) SendMessage(hDlg, WM_CHECKSTATE,0,0); return TRUE; case WM_INITDIALOG: hInEdit = GetDlgItem(hDlg,IDC_EDIT1); hOutEdit = GetDlgItem(hDlg, IDC_EDIT2); g_bSound = g_bRunning = FALSE; g_bTxtToMos = TRUE; bShowTable = FALSE; g_hEvent = CreateEvent(NULL,TRUE,TRUE,NULL); trdCount = 0; EnableWindow(GetDlgItem(hDlg,IDC_BUTTON2),FALSE); /* cfm.cbSize = sizeof(cfm); cfm.dwMask = CFM_SIZE |CFM_COLOR |CFM_BOLD ; cfm.dwEffects = CFE_BOLD |CFE_UNDERLINE ; cfm.yHeight = 300; cfm.crTextColor = RGB(23,432,34); cfm.bCharSet = GB2312_CHARSET; cfm.bPitchAndFamily = FF_ROMAN; strcpy((char*)cfm.szFaceName,"Courier New"); strcpy_s((char*)cfm.szFaceName, sizeof(cfm.szFaceName),"Courier New"); SendMessage(hOutEdit,EM_SETCHARFORMAT,(WPARAM)SCF_ALL,(LPARAM)&cfm); */ hFont = CreateFont(20,10, 0, 0, 150, FALSE,FALSE,FALSE,GB2312_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,_T("Courier New")); SendMessage(hOutEdit,WM_SETFONT,(WPARAM)hFont,(LPARAM)TRUE); return TRUE; case WM_CLOSE: if(hwndTable) DestroyWindow(hwndTable); if(g_hEvent) CloseHandle(g_hEvent); EndDialog(hDlg,NULL); return TRUE; } return FALSE; } int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, int nShowCmd) { DialogBoxParam(hInst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc,NULL); ExitProcess(0); }