⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lakey.cpp

📁 Lakey这是一个免费的CW练习/收/发软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	srand((unsigned)time(NULL ));

	for (int i = 0; i < MAX_KOCH_SAMPLE; ++i)
	{
		if (0 < (i + 1) % (g_pGlobalSetting->m_nKochWordLen + 1))
		{
			g_vKochSample[i] = g_pGlobalSetting->m_vKochChar[rand() % nSampleRange];
		}
		else
		{
			g_vKochSample[i] = ' ';
		}
	}
}

#define TIMER_ELAPSETIME	101

// “抄报栏”框的消息处理程序。
LRESULT CALLBACK CopyPad(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	static BOOL bFinished = FALSE;
	static DWORD nTickCountStart = 0;

	switch (message)
	{
		case WM_INITDIALOG:
		{
			bFinished = FALSE;
			InitKochSample();

			MessageBox(hDlg, "点击[确定]或按[回车]键开始...", "准备", MB_OK);
			g_pMainWnd->PushText(g_vKochSample, MAX_KOCH_SAMPLE, 0);
			
			SetTimer(hDlg, TIMER_ELAPSETIME, 220, NULL);
			nTickCountStart = GetTickCount();

			SendMessage(GetDlgItem(hDlg, IDC_COPYTEXT), EM_SETEVENTMASK, 0, ENM_CHANGE);

			return TRUE;
		}
		case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
				case IDC_ACCEPT:
				{
					if (!bFinished)
					{
						KillTimer(hDlg, TIMER_ELAPSETIME);
						g_pMainWnd->ClearQueue();
/*
						char vBuff[MAX_KOCH_SAMPLE * 2 + 256];
						memset(vBuff, 0, sizeof(vBuff));
						GetDlgItemText(hDlg, IDC_COPYTEXT, g_vCopyText, MAX_KOCH_SAMPLE);
						g_vCopyText[MAX_KOCH_SAMPLE] = NULL;
						strcpy(vBuff, g_vCopyText);
						strcat(vBuff, "\r\n----------------------------------------------------------------------------------\r\n");
						strncat(vBuff, g_vKochSample, strlen(g_vCopyText));
						SetDlgItemText(hDlg, IDC_COPYTEXT, vBuff);
*/
						SetDlgItemText(hDlg, IDC_ACCEPT, "关闭");

						bFinished = TRUE;
/*
						CHARFORMAT fmt;
						memset(&fmt, 0, sizeof(fmt));
						fmt.cbSize = sizeof(fmt);
						fmt.dwMask = CFM_COLOR;
						fmt.crTextColor = (toupper(g_vCopyText[nCopied - 1]) == g_vKochSample[nCopied - 1] ? RGB(0, 0, 0) : RGB(255, 0, 0));

						SendMessage((HWND)lParam, EM_SETCHARFORMAT, SCF_SELECTION, ((LPARAM)&fmt));
*/
						break;
					}
				}
				case IDCANCEL:
				{
					KillTimer(hDlg, TIMER_ELAPSETIME);
					g_pMainWnd->ClearQueue();
					EndDialog(hDlg, LOWORD(wParam));
					return TRUE;
				}
				case IDC_COPYTEXT:
				{
					if (EN_CHANGE == HIWORD(wParam))
					{
						g_vCopyText[MAX_KOCH_SAMPLE] = NULL;
						GetDlgItemText(hDlg, IDC_COPYTEXT, g_vCopyText, MAX_KOCH_SAMPLE);
						char vBuff[20];
						int nCopied = (int)strlen(g_vCopyText);
						sprintf(vBuff, "%d", nCopied);
						SetDlgItemText(hDlg, IDC_COPIED, vBuff);
						int nCorrect = 0;

						for (int i = 0; i < nCopied; ++i)
						{
							if (toupper(g_vCopyText[i]) == g_vKochSample[i])
								++nCorrect;
						}
						sprintf(vBuff, "%d", nCopied - nCorrect);
						SetDlgItemText(hDlg, IDC_INCORRECT, vBuff);
						
						if (0 < nCopied)
							sprintf(vBuff, "%2.1f%%", 100.0f * nCorrect / nCopied);
						else
							sprintf(vBuff, "%%");

						SetDlgItemText(hDlg, IDC_CORRECTPERC, vBuff);

						HWND hCopyText = (HWND)lParam;
						CHARRANGE oRange;
						oRange.cpMin = nCopied - 1;
						oRange.cpMax = nCopied;
						SendMessage(hCopyText, EM_EXSETSEL, 0, ((LPARAM)&oRange));

						CHARFORMAT fmt;
						memset(&fmt, 0, sizeof(fmt));
						fmt.cbSize = sizeof(fmt);
						fmt.dwMask = CFM_COLOR;
						fmt.crTextColor = (toupper(g_vCopyText[nCopied - 1]) == g_vKochSample[nCopied - 1] ? RGB(0, 0, 0) : RGB(255, 0, 0));
						SendMessage(hCopyText, EM_SETCHARFORMAT, SCF_SELECTION, ((LPARAM)&fmt));

						oRange.cpMin = oRange.cpMax;
						SendMessage(hCopyText, EM_EXSETSEL, 0, ((LPARAM)&oRange));

						return 0;
					}
					break;
				}
			}
			break;
		}
/*		case WM_NOTIFY:
		{
			if (IDC_COPYTEXT == wParam)
			{
				LPNMHDR pNMHDR = (LPNMHDR)lParam;
				switch(pNMHDR->code)
				{
					case EN_SELCHANGE:
					{
						g_vCopyText[MAX_KOCH_SAMPLE] = NULL;
						GetDlgItemText(hDlg, IDC_COPYTEXT, g_vCopyText, MAX_KOCH_SAMPLE);

						char vBuff[20];
						int nCopied = (int)strlen(g_vCopyText);
						sprintf(vBuff, "%d", nCopied);
						SetDlgItemText(hDlg, IDC_COPIED, vBuff);
						int nCorrect = 0;

						for (int i = 0; i < nCopied; ++i)
						{
							if (toupper(g_vCopyText[i]) == g_vKochSample[i])
								++nCorrect;
						}
						sprintf(vBuff, "%d", nCopied - nCorrect);
						SetDlgItemText(hDlg, IDC_INCORRECT, vBuff);
						
						if (0 < nCopied)
							sprintf(vBuff, "%2.1f%%", 100.0f * nCorrect / nCopied);
						else
							sprintf(vBuff, "%%");

						SetDlgItemText(hDlg, IDC_CORRECTPERC, vBuff);

						CHARFORMAT fmt;
						memset(&fmt, 0, sizeof(fmt));
						fmt.cbSize = sizeof(fmt);
						fmt.dwMask = CFM_COLOR;
						fmt.crTextColor = (toupper(g_vCopyText[nCopied - 1]) == g_vKochSample[nCopied - 1] ? RGB(0, 0, 0) : RGB(255, 0, 0));

						SendMessage((HWND)lParam, EM_SETCHARFORMAT, SCF_SELECTION, ((LPARAM)&fmt));
						break;
					}
				}
			}
			break;
		}
		*/
		case WM_TIMER:
		{
			if (TIMER_ELAPSETIME == wParam)
			{
				DWORD nTickCount = (GetTickCount() - nTickCountStart) / 1000;
				DWORD nSec = nTickCount % 60;
				DWORD nMin = (nTickCount /= 60) % 60;
				DWORD nHour = nTickCount / 60;
				char vBuff[20];
				sprintf(vBuff, "%2.2d:%2.2d:%2.2d", nHour, nMin, nSec);
				SetDlgItemText(hDlg, IDC_ELAPSETIME, vBuff);
				return TRUE;
			}
			break;
		}
	}
	return FALSE;
}

LRESULT CALLBACK TestDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_INITDIALOG:
		return TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
		{
			EndDialog(hDlg, LOWORD(wParam));
			return TRUE;
		}
		break;
	}
	return FALSE;
}

const char* ConvertKochPathname(char* pDest, const char* pSrc, int nBuffLen)
{
	int nLen = strlen(pSrc);
	int i;
	for (i = 0; i < nBuffLen - 20 && i < nLen; ++i)
	{
		pDest[i] = (isalpha(pSrc[i]) ? pSrc[i] : '_');
	}

	strcpy(pDest + i, ".wav");
	return pDest;
}

void PromptToWave(HWND hWnd)
{
	char vDestPathname[260];
	ConvertKochPathname(vDestPathname, g_vPromptBuff, 256);

	TextToAskWave(vDestPathname, sizeof(vDestPathname), g_vPromptBuff, strlen(g_vPromptBuff), hWnd);
}

void KochToWave(HWND hWnd)
{
	InitKochSample();

	char vDestPathname[260];
	ConvertKochPathname(vDestPathname, g_pGlobalSetting->m_vKochChar, 256);

	TextToAskWave(vDestPathname, sizeof(vDestPathname), g_vKochSample, MAX_KOCH_SAMPLE, hWnd);
}

void TextToAskWave(char* pWavePathBuff, int nWavePathBuffSize, const char* pBuff, int nCount, HWND hWnd)
{
	OPENFILENAME ofn;       // common dialog box structure
	HANDLE hf;              // file handle

	// Initialize OPENFILENAME
	ZeroMemory(&ofn, sizeof(OPENFILENAME));
	ofn.lStructSize = sizeof(OPENFILENAME);
	ofn.hwndOwner = hWnd;
	ofn.lpstrFile = pWavePathBuff;
	ofn.nMaxFile = nWavePathBuffSize;
	ofn.lpstrFilter = "All\0*.*\0Wave\0*.wav\0";
	ofn.nFilterIndex = 1;
	ofn.lpstrFileTitle = NULL;
	ofn.nMaxFileTitle = 0;
	ofn.lpstrInitialDir = NULL;
	ofn.Flags = OFN_PATHMUSTEXIST;

	// Display the Open dialog box. 
	if (GetOpenFileName(&ofn))
	{
		TextToWave(ofn.lpstrFile, pBuff, nCount, 0);
	}
}

void TextToWave(const char* pPathname, const char* pTxt, int nTxtLen, int nWordLen)
{
	CWaveFile oWaveFile(pPathname, 1, 8000, 16, g_pGlobalSetting->m_nLongHit / 999.0);
	oWaveFile.SetFreq(g_pGlobalSetting->m_rBeepFreq);
	oWaveFile.SetVolumn(g_pGlobalSetting->m_rBeepVol);

	for (int i = 0; i < nTxtLen; ++i)
	{
		char ch = pTxt[i];
		MORSECODE* pMorse = &(g_pGlobalSetting->m_vMorseCode[MORSECODECOUNT - 1]);
		for (int j = 0; j < MORSECODECOUNT; ++j)
		{
			MORSECODE* p = &(g_pGlobalSetting->m_vMorseCode[j]);
			if (ch == p->nAscCode || ch + ('A' - 'a') == p->nAscCode)
			{
				pMorse = p;
				break;
			}
		}

		if ('_' != pMorse->nAscCode)
		{
			int nWindow = pMorse->nMask + 1;
			while(nWindow >>= 1)
			{
				int nHitCount =
					nWindow & pMorse->nMorseCode ? 
						g_pGlobalSetting->m_nShortHit : g_pGlobalSetting->m_nLongHit;

				oWaveFile.Append(nHitCount / 1000.0);
				oWaveFile.AppendBlank(g_pGlobalSetting->m_nHitDelay / 1000.0);
			}

			oWaveFile.AppendBlank(g_pGlobalSetting->m_nLetterDelay / 1000.0);
		}
		else
		{
			oWaveFile.AppendBlank(g_pGlobalSetting->m_nWordDelay / 1000.0);
		}

		if (0 < nWordLen && 0 == (i + 1) % nWordLen)
			oWaveFile.AppendBlank(g_pGlobalSetting->m_nWordDelay / 1000.0);
	}
}

LRESULT CALLBACK PromptProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_INITDIALOG:
		{
			SetDlgItemText(hDlg, IDC_PROMPTTEXT, g_vPromptText);
			SetDlgItemText(hDlg, IDC_INPUTSTR, g_vPromptBuff);
			return TRUE;
		}
		case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
				case IDOK:
				{
					GetDlgItemText(hDlg, IDC_INPUTSTR, g_vPromptBuff, sizeof(g_vPromptBuff));
					EndDialog(hDlg, 1);
					return TRUE;
				}
				case IDCANCEL:
				{
					EndDialog(hDlg, 0);
					return TRUE;
				}
			}
			break;
		}
	}
	return FALSE;
}

void Test(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//	mytest();
/*
	HANDLE hCom; 
	DWORD dwError;
	char* pPortName = 
//		"LPT1";
		"COM6";

	hCom = 
		CreateFile(pPortName,					// 文件名 
			GENERIC_READ | GENERIC_WRITE,		// 允许读和写 
			0,									// 独占方式 
			NULL, 
			OPEN_EXISTING,						//打开而不是创建 
			FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,	// 重叠方式 
			NULL 
		);

	if (hCom == INVALID_HANDLE_VALUE) 
	{
		dwError = GetLastError(); 
		MessageBox(hWnd, "有错误", "ERROR", MB_OK); 
	}

	if (hCom) 
		CloseHandle(hCom); 
		*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -