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

📄 tcbytowddlg.cpp

📁 这是我在开发TI的DSP5501时所制作的工具。主要是针对两个8-Bit合成16-Bit的操作。可以转换51的字库格式
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////
// TcByToWdDlg.cpp : implementation file
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TcByToWd.h"
#include "TcByToWdDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////

CSysCfgAuto SysCfg;									// 自动配置对象

// 明文(字符串):"天诚盛业NewRen设备内核测试工程"=一般加密
static const BYTE TCSY_MAIN_TITLE[] =
{
	0x69, 0x49, 0x16, 0x6A, 0x6F, 0x07, 0x77, 0x10, 0xE7, 0xDC,
	0xF1, 0xCA, 0xF2, 0xC1, 0x6F, 0x0B, 0x64, 0x5C, 0x18, 0x5D,
	0x73, 0x63, 0x72, 0x73, 0x18, 0x7F, 0x72, 0x4C, 0x72, 0x73,
	0x1C, 0x01, 0x1B, 0x7A, 0xA5
};

/////////////////////////////////////////////////////////////////////////////
// CTcByToWdDlg dialog

// 构造函数
CTcByToWdDlg::CTcByToWdDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTcByToWdDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTcByToWdDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

// 析构函数
CTcByToWdDlg::~CTcByToWdDlg()
{
}

// 数据交换
void CTcByToWdDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTcByToWdDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

// 消息映射
BEGIN_MESSAGE_MAP(CTcByToWdDlg, CDialog)
	//{{AFX_MSG_MAP(CTcByToWdDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_LBUTTONDOWN()
	ON_WM_CTLCOLOR()
	ON_WM_HELPINFO()
	ON_WM_SIZE()
	ON_BN_CLICKED(IDC_BUTT_COMB, OnButtComb)
	ON_BN_CLICKED(IDC_BUTT_USBUC, OnButtUsbuc)
	ON_BN_CLICKED(IDC_BUTT_USBSTR, OnButtUsbstr)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTcByToWdDlg message handlers

// 设置系统主标题栏,加密的,有置标志
void CTcByToWdDlg::SetMainTitle(void)
{
	char chTitle[sizeof(TCSY_MAIN_TITLE)];
	CryptXOR(chTitle, TCSY_MAIN_TITLE, sizeof(TCSY_MAIN_TITLE));
	CString sTitle;
	sTitle.Format("%s - [%s] %s", chTitle, SYS_UPD_DATE,
		SysCfg.m_bAlwaysOnTop ? "*" : "");
	SetWindowText(sTitle); // 主窗口标题
}

// 设置主窗体始终位于其它窗体的最上方
void CTcByToWdDlg::SetMainWndTopMost(void)
{
	SetWindowPos(SysCfg.m_bAlwaysOnTop ? &CWnd::wndTopMost :
		&CWnd::wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
	SetMainTitle(); // 更新窗口标题中的置顶标记
	CMenu *pSysMenu = GetSystemMenu(FALSE);
	if(pSysMenu == NULL) return; // Always Top 置顶
	UINT nFlags =  SysCfg.m_bAlwaysOnTop ? MF_CHECKED : MF_UNCHECKED;
	pSysMenu->CheckMenuItem(IDM_ALWAYTOP, MF_BYCOMMAND | nFlags);
}

// 系统菜单命令响应
void CTcByToWdDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		ShowAboutDialog();
	}
	else if ((nID & 0xFFF0) == IDM_ALWAYTOP)
	{
		SysCfg.m_bAlwaysOnTop = !SysCfg.m_bAlwaysOnTop;
		SetMainWndTopMost(); // 主窗体置顶
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.
void CTcByToWdDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting
		
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
		
		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		
		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTcByToWdDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

// 用户按下“确认”按钮
void CTcByToWdDlg::OnOK() 
{
//	CDialog::OnOK();
}

// 点击左键,可以移动窗体
void CTcByToWdDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CDialog::OnLButtonDown(nFlags, point);
	SetCursor(LoadCursor(NULL, IDC_SIZEALL));
	PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
}

// 改变对话框的背景色(淡蓝色)
HBRUSH CTcByToWdDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	static CBrush bckBrush(RGB(0xA5, 0xCB, 0xF7));
	if(nCtlColor == CTLCOLOR_DLG)
		return ((HBRUSH)bckBrush.GetSafeHandle());
	else return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}

// 取消对话框的F1键的默认响应,查找帮助文件
BOOL CTcByToWdDlg::OnHelpInfo(HELPINFO* pHelpInfo) 
{
	// TODO: Add your message handler code here and/or call default
	return (TRUE);
//	return CDialog::OnHelpInfo(pHelpInfo);
}

/////////////////////////////////////////////////////////////////////////////

// 设置指定列表框ComboBox的当前所选择值
void CTcByToWdDlg::SetCombo(int nID, int nSlct)
{
	CComboBox *pBox = (CComboBox *)GetDlgItem(nID);
	if(pBox) pBox->SetCurSel(nSlct);
}

// 获取指定列表框的当前选择是某列(0起始)
int CTcByToWdDlg::GetCombo(int nID)
{
	CComboBox *pBox = (CComboBox *)GetDlgItem(nID);
	if(!pBox) return (0); return (pBox->GetCurSel());
}

// 设置单选按钮的值(Check Box)
void CTcByToWdDlg::SetCheck(int nID, int nChk)
{
	CButton *pButt = (CButton *)GetDlgItem(nID);
	if(pButt) pButt->SetCheck(nChk);
}

// 获取单选按钮的值(Check Box)
int CTcByToWdDlg::GetCheck(int nID)
{
	CButton *pButt = (CButton *)GetDlgItem(nID);
	if(!pButt) return (0); return (pButt->GetCheck());
}

// 通用信息输出:子窗口ID,信息字符串,仿sprintf方式
void CTcByToWdDlg::MsgOut(int nID, LPCTSTR chInfor, ...)
{
	CString sInfor = "";
	if(chInfor && chInfor[0])
	{
		va_list argptr;
		va_start(argptr, chInfor);
		sInfor.FormatV(chInfor, argptr);
		va_end(argptr);
	}
	SetDlgItemText(nID, sInfor);
}

// 显示关于对话框有帮助信息,已初始化的EDIT显示和隐藏
void CTcByToWdDlg::ShowAboutDialog(void)
{
	CAboutDlg dlgAbout;
	dlgAbout.m_sHelps = 
		"	 本工具帮助信息公告栏(Ctrl+H,Ctrl+/)\r\n\r\n"
		"----- 常用的快捷键及功能简述 -------------------------\r\n\r\n"
		"前言:为方便于TI-DSP的TMS320VC5501的开发而设计。\r\n\r\n"
		"Ctrl+A:全选编辑框内的所有字符数据。\r\n\r\n"
		
		"-----\"0xFF,0xFF组合\"-----\r\n"
		"一般用于字库的51单片机格式,转换为DSP的WORD格式\r\n"
		"源文本格式:0x12,0x34,0x56,0x78,0x9A,0xBC...\r\n"
		"新文本格式:0x1234,0x5678,0x9ABC...\r\n\r\n"
		
		"-----\"UNICODE字符串\"-----\r\n"
		"这是USB的字符串描述符,在DSP下的格式生成\r\n"
		"USB下的UNICODE字符串描述符的格式:\r\n"
		"   第0字节:以字节为单位的描述符的长度N。\r\n"
		"   第1字节:字符串描述符的固定标识,值为:0x03\r\n"
		"   第2-N字节:UNICODE编码的字符串,共N-2个字节。\r\n"
		"USB下的数据传输先传低字节,再传高字节。\r\n\r\n"
		
		"-----\"WORD字符串\"-----\r\n"
		"普通的字符串格式,采用WORD格式存贮,为了省空间:)\r\n"
		"按Little Endian方式,先到字符在Low 8-Bit字节上\r\n";
	dlgAbout.DoModal();
}

/////////////////////////////////////////////////////////////////////////////

// 用户按下“取消”按钮
void CTcByToWdDlg::OnCancel() 
{
	ReadWndRect(SysCfg.m_rcMainDlg, this);
	CDialog::OnCancel();
}

// 初始化对话框
BOOL CTcByToWdDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	
	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);
	
	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
		UINT nFlags = SysCfg.m_bAlwaysOnTop ? MF_CHECKED : MF_UNCHECKED;
		pSysMenu->AppendMenu(MF_STRING | nFlags, IDM_ALWAYTOP, "Always On &Top (置顶)");
	}
	
	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	SetMainWndTopMost(); // 设置主标题及窗口置顶
	WritWndRect(SysCfg.m_rcMainDlg, this); // 主窗口位置
	
	// 设置EDIT窗口所能容纳的最多字节数量
	CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT_TEXT);
	if(pEdit) pEdit->SetLimitText(0x7FFFFFFF);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

/////////////////////////////////////////////////////////////////////////////

// 窗口大小已经改变,EDIT随之响应
void CTcByToWdDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	CWnd *pWnd = GetDlgItem(IDC_EDIT_TEXT);
	if(!pWnd || !IsWindow(pWnd->m_hWnd)) return;
	
	CRect rc; pWnd->GetWindowRect(&rc);
	ScreenToClient(&rc);
	
	pWnd->SetWindowPos(NULL, 0, 0, cx - rc.left - 5,
		cy - rc.top - 7, SWP_NOZORDER | SWP_NOMOVE);
}

// 预处理分发消息(主要是按键事件)
BOOL CTcByToWdDlg::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->message == WM_KEYDOWN)
	{
		BOOL bCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
		BOOL bShft = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
		WORD wKey = (WORD)pMsg->wParam;
		
		switch(wKey)
		{
		case 'H': case 0xBF: /* 显示帮助信息 */
			if(!bCtrl) break;
			ShowAboutDialog(); return (TRUE);
			break;
		
		case VK_ESCAPE: /* ESC键的处理 */
			return (TRUE);
			break;
		
		case 'A': /* EDIT内全选 */
			if(bCtrl)
			{
				CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT_TEXT);
				pEdit->SetSel(0, -1); return (TRUE);
			}
			break;
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}

/////////////////////////////////////////////////////////////////////////////

// 实现窗口内的EDIT中的十六进制文本:字节组合成字
void CTcByToWdDlg::OnButtComb() 
{
	char *src, *p, *dst, *q;
	CString text;
	if(!GetDlgItemText(IDC_EDIT_TEXT, text))
		return;
	int nLen = text.GetLength(), i = 0;
	
	// 扩大源字符串区,以存放转换后数据
	src = text.GetBuffer(2 * nLen + 1024);
	if(!src) return; p = src;
	dst = p + nLen + 1; q = dst;
	
	// 符合标准有效的就组合,否则直接拷贝,专用
	while(i < nLen)
	{
		if( p[0] == '0' && p[1] == 'x' &&
			p[4] == ',' &&
			p[5] == '0' && p[6] == 'x' &&
			isxdigit(p[2]) && isxdigit(p[3]) &&
			isxdigit(p[7]) && isxdigit(p[8]) &&
			!isxdigit(p[9]) )
		{
			memcpy(q, p, 4);
			q[4] = p[7]; q[5] = p[8];
			p += 9; i += 9; q += 6;
		}
		else
		{
			*q++ = *p++; i++;
		}
	}
	*q = '\0'; /* end of string */
	
	// 关闭临时指针,并让CString计算字符串的新长度
	lstrcpy(src, dst);
	text.ReleaseBuffer(-1);
	SetDlgItemText(IDC_EDIT_TEXT, text);
}

// 将编辑框中的字符串,转换化为USB下的UNICODE字符串
void CTcByToWdDlg::OnButtUsbuc() 
{
	CString text, nwtxt, tmp;
	if(!GetDlgItemText(IDC_EDIT_TEXT, text) ||
		text.GetLength() > 126) return;
	
	nwtxt = "#pragma DATA_SECTION(???, \".tcconst\")\r\n"
		"static const WORD ???[] =			// ?\r\n{\r\n"
		"\t0x03";
	
	tmp.Format("%02X, // bDescriptorType, bLength\r\n\t"
		"// \"%s\"\r\n\t", text.GetLength() * 2 + 2, text);
	nwtxt += tmp;
	
	for(int i=0; i<text.GetLength(); i++)
	{
		tmp.Format("0x00%02X", text[i]);
		if(i != text.GetLength() - 1)
		{
			tmp += ',';
			if(((i + 1) % 8) != 0) tmp += ' ';
			else tmp += "\r\n\t";
		}
		nwtxt += tmp;
	}
	nwtxt += "\r\n};\r\n";
	
	SetDlgItemText(IDC_EDIT_TEXT, nwtxt);
}

// 将编辑框中的字符串,转换为DSP5501下的WORD表示
void CTcByToWdDlg::OnButtUsbstr() 
{
	CString text, nwtxt, tmp; // 奇数字节在低8位
	if(!GetDlgItemText(IDC_EDIT_TEXT, text)) return;
	nwtxt = "/* \"" + text + "\" */\r\n\r\n\t";
	
	int nLen = text.GetLength(), i, k;
	if(nLen & 1) {text += '\0'; nLen++;}
	nLen /= 2;
	
	WORD wDat;
	for(i=0, k=0; i<nLen; i++)
	{
		wDat = text[k++];
		wDat |= ((text[k++] << 8) & 0xFF00);
		tmp.Format("0x%04X", wDat);
		
		if(i < nLen - 1)
		{
			tmp += ",";
			if(((i + 1) % 8) != 0) tmp += ' ';
			else tmp += "\r\n\t";
		}
		else tmp += "\r\n";
		
		nwtxt += tmp;
	}
	
	SetDlgItemText(IDC_EDIT_TEXT, nwtxt);
}

/////////////////////////////////////////////////////////////////////////////
// The end of this file.

⌨️ 快捷键说明

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