📄 seg7dlg.cpp
字号:
// SEG7Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "SEG7.h"
#include "SEG7Dlg.h"
#include "inirw.h"
#include "SETDLG.h"
#include "ABOUTDLG.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CString AppPath; //全局变量用以保存应用程序路径
CUSTOM_INIRW inifile; //声明INI文件的操作类
BOOL segstatus[8]= ////8段数码管的设置状态
{
false,false,false,false,false,false,false,false
};
char segname[8][2]= //可变的段名字列表
{
"a","b","c","d","e","f","g","h"
};
const char pinnametab[8]= //不可变的管脚索引名字列表
{
'a','b','c','d','e','f','g','h'
};
const unsigned char pinpowertab[8]= //各个管脚的权
{
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
};
const unsigned char radixtab[3]=
{
16, 2, 10
};
const int seglocation[8][4]= //8段数码管的绘制坐标
{
//x1, y1, x2, y2
{ 40, 30, 160, 50},
{150, 40, 170, 150},
{150, 150, 170, 260},
{ 40, 250, 160, 270},
{ 30, 150, 50, 260},
{ 30, 40, 50, 150},
{ 40, 140, 160, 160},
{180, 260, 200, 280},
}; //8段数码管的位置参数
const int namelocation[8][2]=
{ // x, y
{ 95, 30},
{155, 85},
{155, 197},
{ 96, 250},
{ 35, 197},
{ 35, 85},
{ 95, 140},
{185, 260},
};
const char *binformattab[8]= //二进制补足数据表格
{
"0000000",
"000000",
"00000",
"0000",
"000",
"00",
"0",
"",
};
const char *decformattab[3]=
{
" ",
" ",
"",
};
const char *hexformattab[2]=
{
"0",
"",
};
const char numdatatab[10]= //数字0-9的掩码
{
0x3F,
0x06,
0x5B,
0x4F,
0x66,
0x6D,
0x7D,
0x07,
0x7F,
0x6F,
};
const char *numnote[10]=
{
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
};
const chdatatab[18]=
{
0x77, //'A
0x7C, //'b
0x39, //'C
0x58, //'c
0x5E, //'d
0x79, //'E
0x71, //'F
0x76, //'H
0x74, //'h
0x38, //'L
0x37, //'N
0x54, //'n
0x5C, //'o
0x73, //'P
0x50, //'r
0x78, //'t
0x3E, //'U
0x40, // '-
};
const char *chnote[18]=
{
"A",
"b",
"C",
"c",
"d",
"E",
"F",
"H",
"h",
"L",
"N",
"n",
"o",
"P",
"r",
"t",
"U",
"-",
};
const int CHK_ICON_X=185;
const int CHK_ICON_Y=30; //绘制检测结果图标的位置坐标
unsigned char CSEG7Dlg::CreateLedData(void)
{
unsigned char tmp=0;
UpdateData(true);
if(segstatus[0] != 0)tmp |= pinpowertab[a_index];
if(segstatus[1] != 0)tmp |= pinpowertab[b_index];
if(segstatus[2] != 0)tmp |= pinpowertab[c_index];
if(segstatus[3] != 0)tmp |= pinpowertab[d_index];
if(segstatus[4] != 0)tmp |= pinpowertab[e_index];
if(segstatus[5] != 0)tmp |= pinpowertab[f_index];
if(segstatus[6] != 0)tmp |= pinpowertab[g_index];
if(segstatus[7] != 0)tmp |= pinpowertab[h_index]; //创建数据
if(ledak_index == 1 )
{
tmp = ~tmp; //共阳极
}
return tmp;
}
void CSEG7Dlg::FormatData(CString& buf, unsigned int Radix)
{
if(check_uppercase)
{
buf.MakeUpper();
}
switch(Radix)
{
case HEX:
buf = lag_hex_leader_ch + hexformattab[buf.GetLength()-1] + buf + lag_hex_end_ch + lag_separator_ch ;
break;
case BIN:
buf = lag_bin_leader_ch+ binformattab[buf.GetLength()-1] + buf + lag_bin_end_ch + lag_separator_ch ;
break;
case DEC:
buf = decformattab[buf.GetLength()-1] + lag_dec_leader_ch + buf + lag_dec_end_ch + lag_separator_ch ;
break;
} //switch
}
/////////////////////////////////////////////////////////////////////////////
void CUSTOM_INIRW::InitFile() //重载初始化INI文件的内容
{
CString filebuf; //初始化文件,并写入内容
filebuf="[SETUP]\r\n";
filebuf+="LanguageTotal=4\r\n";
filebuf+="LastLanguage=0\r\n";
filebuf+="LastAK=0\r\n";
filebuf+="LastPinValue=255\r\n";
filebuf+="LastPinA=0\r\n";
filebuf+="LastPinB=1\r\n";
filebuf+="LastPinC=2\r\n";
filebuf+="LastPinD=3\r\n";
filebuf+="LastPinE=4\r\n";
filebuf+="LastPinF=5\r\n";
filebuf+="LastPinG=6\r\n";
filebuf+="LastPinH=7\r\n\r\n";
filebuf+="[Language0]\r\n";
filebuf+="Title=C 语言\r\n";
filebuf+="StartCharacter=\r\n";
filebuf+="SeparatorCharacter=,\r\n";
filebuf+="DefaultRadix=2\r\n"; //十进制
filebuf+="HexLeaderCharacter=0x\r\n";
filebuf+="HexEndCharacter=\r\n";
filebuf+="BinLeaderCharacter=0B\r\n";
filebuf+="BinEndCharacter=\r\n";
filebuf+="DecLeaderCharacter=\r\n";
filebuf+="DecEndCharacter=\r\n";
filebuf+="NoteLeaderCharacter=/*\r\n";
filebuf+="NoteEndCharacter=*/\r\n\r\n";
filebuf+="[Language1]\r\n";
filebuf+="Title=PIC ASM\r\n";
filebuf+="StartCharacter=RETLW\r\n";
filebuf+="SeparatorCharacter=\r\n";
filebuf+="DefaultRadix=0\r\n"; //十六进制
filebuf+="HexLeaderCharacter=0x\r\n";
filebuf+="HexEndCharacter=\r\n";
filebuf+="BinLeaderCharacter=B'\r\n";
filebuf+="BinEndCharacter='\r\n";
filebuf+="DecLeaderCharacter=D'\r\n";
filebuf+="DecEndCharacter='\r\n";
filebuf+="NoteLeaderCharacter=;\r\n";
filebuf+="NoteEndCharacter=\r\n\r\n";
filebuf+="[Language2]\r\n";
filebuf+="Title=51 ASM\r\n";
filebuf+="StartCharacter=DB\r\n";
filebuf+="SeparatorCharacter=\r\n";
filebuf+="DefaultRadix=0\r\n"; //十六进制
filebuf+="HexLeaderCharacter=0x\r\n";
filebuf+="HexEndCharacter=\r\n";
filebuf+="BinLeaderCharacter=0B\r\n";
filebuf+="BinEndCharacter=\r\n";
filebuf+="DecLeaderCharacter=D'\r\n";
filebuf+="DecEndCharacter='\r\n";
filebuf+="NoteLeaderCharacter=;\r\n";
filebuf+="NoteEndCharacter=\r\n\r\n";
filebuf+="[Language3]\r\n";
filebuf+="Title=EMC ASM\r\n";
filebuf+="StartCharacter=RETL\r\n";
filebuf+="DefaultRadix=0\r\n"; //十六进制
filebuf+="SeparatorCharacter=\r\n";
filebuf+="HexLeaderCharacter=0x\r\n";
filebuf+="HexEndCharacter=\r\n";
filebuf+="BinLeaderCharacter=B'\r\n";
filebuf+="BinEndCharacter='\r\n";
filebuf+="DecLeaderCharacter=\r\n";
filebuf+="DecEndCharacter=\r\n";
filebuf+="NoteLeaderCharacter=;\r\n";
filebuf+="NoteEndCharacter=\r\n";
try
{
CFile file(GetIniFileName(),CFile::modeWrite);
file.Write(filebuf,filebuf.GetLength()); //内容写入文件
file.Close(); //关闭文件
}
catch(...)
{
AfxMessageBox(_T("创建文件失败"));
exit(0);
}
}
/////////////////////////////////////////////////////////////////////////////
BOOL CSEG7Dlg::ReadConfig(const char* ConfigFile) //读取配置文件,并初始化配置数据
{
//读取管脚配置
a_index=inifile.ReadKeyValue("SETUP","LastPinA"); //
b_index=inifile.ReadKeyValue("SETUP","LastPinB"); //
c_index=inifile.ReadKeyValue("SETUP","LastPinC"); //
d_index=inifile.ReadKeyValue("SETUP","LastPinD"); //
e_index=inifile.ReadKeyValue("SETUP","LastPinE"); //
f_index=inifile.ReadKeyValue("SETUP","LastPinF"); //
g_index=inifile.ReadKeyValue("SETUP","LastPinG"); //
h_index=inifile.ReadKeyValue("SETUP","LastPinH"); //
segname[0][0]=pinnametab[a_index];
segname[1][0]=pinnametab[b_index];
segname[2][0]=pinnametab[c_index];
segname[3][0]=pinnametab[d_index];
segname[4][0]=pinnametab[e_index];
segname[5][0]=pinnametab[f_index];
segname[6][0]=pinnametab[g_index];
segname[7][0]=pinnametab[h_index];
//LED类型配置(共阴极,共阳组)
ledak_index=inifile.ReadKeyValue("SETUP","LastAK");
if(ledak_index>1)
{
AfxMessageBox(_T("读取配置文件错误,请删除配置文件(LED.INI)!"));
exit(0);
}
//语言配置数据
long i;
i=inifile.ReadKeyValue("SETUP","LanguageTotal"); //读取语言数据
CString language("Language");
CString title;
char buf[10];
for(long j=0;j<i;j++) //读取语言选项
{
inifile.ReadKeyValue(language+ _itoa(j,buf,10), "Title", title);
if(title.GetLength()==0)
{
AfxMessageBox(_T("读取配置文件错误,请删除配置文件(LED.INI)!"));
exit(0);
}
combo_language.AddString(title);
}
language_index=inifile.ReadKeyValue("SETUP", "LastLanguage"); //读取当前语言选项索引
_itoa(language_index,language.GetBufferSetLength(5) ,10);
language="Language"+language; //获取当前语言项的段名
inifile.ReadKeyValue(language, "StartCharacter",lag_start_ch); //语言起始字符
inifile.ReadKeyValue(language, "SeparatorCharacter",lag_separator_ch); //数据分隔符
inifile.ReadKeyValue(language, "HexLeaderCharacter",lag_hex_leader_ch); //十六进制数据头
inifile.ReadKeyValue(language, "HexEndCharacter",lag_hex_end_ch); //十六进制数据尾
inifile.ReadKeyValue(language, "BinLeaderCharacter",lag_bin_leader_ch); //二进制数据头
inifile.ReadKeyValue(language, "BinEndCharacter",lag_bin_end_ch); //二进制数据尾
inifile.ReadKeyValue(language, "DecLeaderCharacter",lag_dec_leader_ch); //十进制数据头
inifile.ReadKeyValue(language, "DecEndCharacter",lag_dec_end_ch); //十进制数据尾
inifile.ReadKeyValue(language, "NoteLeaderCharacter",lag_note_leader_ch); //注释头
inifile.ReadKeyValue(language, "NoteEndCharacter",lag_note_end_ch); //注释尾
opt_radix=inifile.ReadKeyValue(language, "DefaultRadix"); //语言默认基数
if(opt_radix>2)
{
AfxMessageBox(_T("读取配置文件错误,请删除配置文件(LED.INI)!"));
exit(0);
}
UpdateData(false);//更新数据到控件
return true;
}
////////////////////////////////////////////////////////////////////////////
BOOL CSEG7Dlg::CheckPinErr(void) //检测管脚是否有错误,有错返回TRUE,否则FALSE
{
UINT i,j;
UINT CHK[8];
UpdateData(true); //读取变量
CHK[0]=a_index; //初始化缓冲变量
CHK[1]=b_index;
CHK[2]=c_index;
CHK[3]=d_index;
CHK[4]=e_index;
CHK[5]=f_index;
CHK[6]=g_index;
CHK[7]=h_index;
CClientDC dc(this); // 注意此处不能选用CPaintDC(专为OnPaint使用)否则可能绘制不上去
dc.FillSolidRect (CHK_ICON_X, CHK_ICON_Y, 32, 32, GetSysColor(COLOR_3DFACE));//清除老图标
for(j=0;j<=6;j++)
{
for(i=j+1;i<=7;i++)
{
if(CHK[i]==CHK[j])
{
dc.DrawIcon(CHK_ICON_X,CHK_ICON_Y,AfxGetApp()->LoadIcon(IDI_CHECKERROR));
//dc.SetTextColor (RGB(255,0,0));
//dc.TextOut(53,280,_T("管脚配置错误"),12);
//lab_pinset=_T("管脚配置错误");
//PinErrFlag=true;
Button_Auto.EnableWindow(false);
Button_Mal.EnableWindow (false);
UpdateData(false);
return true;
}
}
}
dc.DrawIcon(CHK_ICON_X,CHK_ICON_Y,AfxGetApp()->LoadIcon(IDI_CHECKRIGHT));
//dc.SetTextColor (RGB(0,0,255));
//dc.TextOut(53,280,_T("管脚配置正确"),12);
//lab_pinset=_T("管脚配置正确");
//PinErrFlag=false
Button_Mal.EnableWindow (true);
Button_Auto.EnableWindow(true);
UpdateData(false);
return false;
}
//////////////////////////////////////////////////////////////////////////////
void CSEG7Dlg::ReDrawSeg(long i)
{
//CBrush SolidBrush(RGB(255,0,0)); //创建实心的填充画刷
//CBrush NullBrush(RGB(255,255,255));
//CPen pen(PS_SOLID,1,RGB(0,0,255)); //创建蓝色实心画笔,线宽为1
CClientDC dc(this); // 注意此处不能选用CPaintDC(专为OnPaint使用)否则可能绘制不上去
dc.SelectObject(&pen_blue); //设置画笔
dc.SetBkMode(TRANSPARENT); //透明文字背景
if(segstatus[i]) //不用再循环,因为此时i就代表了所点击的段
{
dc.SelectObject(&brush_red); //设置画刷
dc.SetTextColor(RGB(255,255,255)); //设置白色字体
}
else
{
dc.SelectObject(&brush_white); //设置画刷
dc.SetTextColor(RGB(255,0,0)); //设置红色字体
}
dc.Ellipse(*((CRect*)seglocation[i])); //画对应的圆
dc.TextOut(namelocation[i][0],namelocation[i][1],segname[i],1);
}
/////////////////////////////////////////////////////////////////////////////
// CSEG7Dlg dialog
CSEG7Dlg::CSEG7Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CSEG7Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSEG7Dlg)
a_index = 0; //各个COMBO的索引值
b_index = 1;
c_index = 2;
d_index = 3;
e_index = 4;
f_index = 5;
g_index = 6;
h_index = 7;
language_index = 0;
ledak_index = 0;
note_string = _T("Note:"); //注释框
output_string = _T(""); //输出框为空
opt_radix = 0; //选中16进制
check_selectall = 2; //灰色,因为设置了数字0-9为选中状态
check_uppercase = FALSE;
//}}AFX_DATA_INIT
check_char[0] = TRUE; //选中数字0-9
check_char[1] = FALSE;
check_char[2] = FALSE;
check_char[3] = FALSE;
check_char[6] = FALSE;
check_char[7] = FALSE;
check_char[8] = FALSE;
check_char[10] = FALSE;
check_char[11] = FALSE;
check_char[14] = FALSE;
check_char[17] = FALSE;
check_char[18] = FALSE;
check_char[4] = FALSE;
check_char[5] = FALSE;
check_char[9]= FALSE;
check_char[12] = FALSE;
check_char[13] = FALSE;
check_char[15] = FALSE;
check_char[16] = FALSE;
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSEG7Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSEG7Dlg)
DDX_Control(pDX, IDC_EDIT_OUTPUT, edit_output);
DDX_Control(pDX, IDC_EDIT_NOTE, edit_note);
DDX_Control(pDX, IDC_BTN_SET, Button_Set);
DDX_Control(pDX, IDC_BTN_AUTO, Button_Auto);
DDX_Control(pDX, IDC_BTN_CLEAR, Button_Clear);
DDX_Control(pDX, IDC_BTN_COPY, Button_Copy);
DDX_Control(pDX, IDC_BTN_MAL, Button_Mal);
DDX_Control(pDX, IDC_BTN_RESET_PIN, Button_ResetPin);
DDX_Control(pDX, IDC_BTN_SAVE, Button_Save);
DDX_Control(pDX, IDC_BTN_SAVE_PIN, Button_SavePin);
DDX_Control(pDX, IDC_COMBO10, combo_language);
DDX_Control(pDX, IDC_COMBO9, combo_ledak);
DDX_Control(pDX, IDC_COMBO8, combo_h);
DDX_Control(pDX, IDC_COMBO7, combo_g);
DDX_Control(pDX, IDC_COMBO6, combo_f);
DDX_Control(pDX, IDC_COMBO5, combo_e);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -