📄 tcbytowddlg.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 + -