📄 dianzhendlg.cpp
字号:
// dianzhenDlg.cpp : implementation file
//
#include "stdafx.h"
#include "dianzhen.h"
#include "dianzhenDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDianzhenDlg dialog
CDianzhenDlg::CDianzhenDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDianzhenDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDianzhenDlg)
m_input = 0;
m_code = _T("");
m_inputKind = 2;
m_numPage = 0;
m_codeType = 0;
m_scanType = 0;
m_dotType = 1;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_xpos = X_PAGE_START;
m_ypos = Y_PAGE_START;
m_dotColor = RGB(255,0,0);
m_ndotColor = RGB(243,243,243);
m_dotBrush.CreateSolidBrush(m_dotColor);
m_notDotBrush.CreateSolidBrush(m_ndotColor);
m_fileName = "gb18030.fon";
//将点阵字库读入内存
m_pFile = fopen(m_fileName,"rb");
if(!m_pFile){
CFile(m_fileName,CFile::modeNoTruncate | CFile::modeCreate);
m_pFile = fopen(m_fileName,"rb");
}
fseek(m_pFile,0,SEEK_END);
m_maxIndex = ftell(m_pFile)/DZ_NUM;
m_maxPage = m_maxIndex/PAGENUM;
}
void CDianzhenDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDianzhenDlg)
DDX_Control(pDX, IDC_SLID_ENLARGE, m_numEnlarge);
DDX_Control(pDX, IDC_EDIT_HEX_H, m_dzHexH);
DDX_Control(pDX, IDC_EDIT_HEX_V, m_dzHexV);
DDX_Text(pDX, IDC_EDIT_NUM, m_input);
DDX_Text(pDX, IDC_EDIT_CODE, m_code);
DDX_Radio(pDX, IDC_RADIO1, m_inputKind);
DDX_Text(pDX, IDC_EDIT_PAGE, m_numPage);
DDX_Radio(pDX, IDC_GB, m_codeType);
DDX_Radio(pDX, IDC_COLSCAN, m_scanType);
DDX_Radio(pDX, IDC_DOT_CIRCLE, m_dotType);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDianzhenDlg, CDialog)
//{{AFX_MSG_MAP(CDianzhenDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_FIRST, OnBtnFirst)
ON_BN_CLICKED(IDC_BTN_LAST, OnBtnLast)
ON_BN_CLICKED(IDC_BTN_PREVIOUS, OnBtnPrevious)
ON_BN_CLICKED(IDC_BTN_NEXT, OnBtnNext)
ON_BN_CLICKED(IDC_BTN_SELECT2, OnBtnSelect2)
ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
ON_WM_CREATE()
ON_BN_CLICKED(IDC_BTN_DCOLOR, OnBtnDcolor)
ON_BN_CLICKED(IDC_BTN_NDCOLOR, OnBtnNdcolor)
ON_BN_CLICKED(IDC_BTN_FILE, OnBtnFile)
ON_BN_CLICKED(IDC_BTN_FP, OnBtnFp)
ON_BN_CLICKED(IDC_BTN_LP, OnBtnLp)
ON_BN_CLICKED(IDC_BTN_PP, OnBtnPp)
ON_BN_CLICKED(IDC_BTN_NP, OnBtnNp)
ON_BN_CLICKED(IDC_BTN_PAGE, OnBtnPage)
ON_WM_DESTROY()
ON_WM_CTLCOLOR()
ON_WM_LBUTTONDOWN()
ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLID_ENLARGE, OnCustomdrawSlidEnlarge)
ON_WM_RBUTTONDOWN()
ON_BN_CLICKED(IDC_BTN_FSCREEN, OnBtnFscreen)
ON_BN_CLICKED(IDC_COLSCAN, OnColscan)
ON_BN_CLICKED(IDC_ROWSCAN, OnRowscan)
ON_BN_CLICKED(IDC_DOT_CIRCLE, OnDotCircle)
ON_BN_CLICKED(IDC_DOT_SQUARE, OnDotSquare)
ON_BN_CLICKED(IDC_GB, OnGb)
ON_BN_CLICKED(IDC_BIG, OnBig)
ON_BN_CLICKED(IDC_UNICODE, OnUnicode)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDianzhenDlg message handlers
BOOL CDianzhenDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// 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);
}
}
// 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
m_numEnlarge.SetRange(MIN_FONT,MAX_FONT);
m_numEnlarge.SetTicFreq(1);
m_numEnlarge.SetPos(7);
m_dotSize = m_numEnlarge.GetPos();
CRect rect;
GetDlgItem(IDC_DZSHOW)->GetWindowRect(&rect);
ScreenToClient(&rect);
//初始化点阵显示起始位置
X_START = rect.top + (rect.Width()/2-12*m_dotSize);
Y_START = rect.left + (rect.Height()/2-12*m_dotSize);
((CDianzhenApp *)AfxGetApp())->m_hwndDlg = m_hWnd;
return TRUE; // return TRUE unless you set the focus to a control
}
void CDianzhenDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
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 CDianzhenDlg::OnPaint()
{
if (IsIconic())
{
// device context for painting
CPaintDC dc(this);
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();
}
/******添加部分*******/
SetDlgItemText(IDC_EDIT_FILENAME,m_fileName);
PrintPage(m_numPage);
SelByIndex(m_ndotColor,m_dotColor);
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CDianzhenDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//定位首字符
void CDianzhenDlg::OnBtnFirst()
{
m_input = 0;
//取消原有的选择
if(m_numPage == 0)
{
SmallFontDislpay(m_xpos, m_ypos, m_buf,GetDC(),1,m_dotColor,m_ndotColor,m_scanType);
}
else
{
m_numPage = 0;
PrintPage(m_numPage);
}
UpdateData(false);
SelByIndex(m_ndotColor,m_dotColor);
}
void CDianzhenDlg::OnBtnLast()
{
m_input = m_maxIndex;
//取消原有的选择
if(m_numPage == m_maxPage)
{
SmallFontDislpay(m_xpos, m_ypos, m_buf,GetDC(),1,m_dotColor,m_ndotColor,m_scanType);
}
else
{
m_numPage = m_maxPage;
PrintPage(m_numPage);
}
UpdateData(false);
SelByIndex(m_ndotColor,m_dotColor);
}
//向前向左箭头
void CDianzhenDlg::OnBtnPrevious()
{
m_input--;
if(m_input<0)
{
MessageBox("已经是最前一个字了!");
m_input = 0;
return;
}
if(m_input/PAGENUM == m_numPage)
{
SmallFontDislpay(m_xpos, m_ypos, m_buf,GetDC(),1,m_dotColor,m_ndotColor,m_scanType);
}
else
{
m_numPage--;
PrintPage(m_numPage);
}
UpdateData(false);
SelByIndex(m_ndotColor,m_dotColor);
}
//处理向右箭头
void CDianzhenDlg::OnBtnNext()
{
if(++m_input>m_maxIndex){
MessageBox("已经是最后一个字了!");
m_input = m_maxIndex;
return;
}
if(m_input/PAGENUM == m_numPage)
{
SmallFontDislpay(m_xpos, m_ypos, m_buf,GetDC(),1,m_dotColor,m_ndotColor,m_scanType);
}
else
{
m_numPage++;
PrintPage(m_numPage);
}
UpdateData(false);
SelByIndex(m_ndotColor,m_dotColor);
}
//处理向上箭头
void CDianzhenDlg::DoBtnUp()
{
m_input -= ROWNUM;
if((m_input)<0)
{
MessageBox("到第一行了!");
m_input += ROWNUM;
return;
}
if(m_input/PAGENUM == m_numPage)
{
SmallFontDislpay(m_xpos, m_ypos, m_buf,GetDC(),1,m_dotColor,m_ndotColor,m_scanType);
}
else
{
m_numPage--;
PrintPage(m_numPage);
}
UpdateData(false);
SelByIndex(m_ndotColor,m_dotColor);
}
//处理向下箭头
void CDianzhenDlg::DoBtnDown()
{
m_input += ROWNUM;
if(m_input>m_maxIndex){
MessageBox("到最后一行了!");
m_input -= ROWNUM;
return;
}
if(m_input/PAGENUM == m_numPage)
{
SmallFontDislpay(m_xpos, m_ypos, m_buf,GetDC(),1,m_dotColor,m_ndotColor,m_scanType);
}
else
{
m_numPage++;
PrintPage(m_numPage);
}
UpdateData(false);
SelByIndex(m_ndotColor,m_dotColor);
}
void CDianzhenDlg::OnBtnSelect2()
{
GetDlgItemText(IDC_EDIT_CODE,m_code);//获取编辑框中的文本
if(m_code == "")
{
MessageBox("文本框不能为空!");
GetDlgItem(IDC_EDIT_CODE)->SetFocus();
return;
}
if(m_inputKind == 0)//处理字符的GB18030编码输入
{
int len = m_code.GetLength();
if((len!=4) && (len!=8))
{
SendDlgItemMessage(IDC_EDIT_CODE,EM_SETSEL,0,-1);
MessageBox("错误,请输4位或8位字符编码!");
return;
}
int bFirst,bSecond,bThird,bFourth;
if(len == 4)
{
//计算双字节区的偏移量
bFirst = getIntByChar(m_code.GetAt(0))*16 + getIntByChar(m_code.GetAt(1));
bSecond = getIntByChar(m_code.GetAt(2))*16 + getIntByChar(m_code.GetAt(3));
//判断首字节合法性
if(bFirst<0x81 || bFirst>0xfe)
{
MessageBox("双字节首字节输入有误!");
SendDlgItemMessage(IDC_EDIT_CODE,EM_SETSEL,0,2);
return;
}
//判断二字节合法性
if(!(bSecond>=0x40 && bSecond<=0x7e) && !(bSecond>=0x80 && bSecond<=0xfe))
{
MessageBox("双字节末字节输入有误!");
SendDlgItemMessage(IDC_EDIT_CODE,EM_SETSEL,2,4);
return;
}
//计算双字节字符在字库中的索引
m_input = (bFirst-0x81)*192+(bSecond-0x40);
}
else
{
//计算四字节区的偏移量
bFirst = getIntByChar(m_code.GetAt(0))*16 + getIntByChar(m_code.GetAt(1));
bSecond = getIntByChar(m_code.GetAt(2))*16 + getIntByChar(m_code.GetAt(3));
bThird = getIntByChar(m_code.GetAt(4))*16 + getIntByChar(m_code.GetAt(5));
bFourth = getIntByChar(m_code.GetAt(6))*16 + getIntByChar(m_code.GetAt(7));
//判断首字节合法性
if(bFirst<0x81 || bFirst>0xfe)
{
MessageBox("四字节首字节输入有误!");
SendDlgItemMessage(IDC_EDIT_CODE,EM_SETSEL,0,2);
return;
}
//判断二字节合法性
if(bSecond<0x30 || bSecond>0x39)
{
MessageBox("四字节二字节输入有误!");
SendDlgItemMessage(IDC_EDIT_CODE,EM_SETSEL,2,4);
return;
}
//判断三字节合法性
if(bThird<0x81 || bThird>0xfe)
{
MessageBox("四字节三字节输入有误!");
SendDlgItemMessage(IDC_EDIT_CODE,EM_SETSEL,4,6);
return;
}
//判断四字节合法性
if(bFourth<0x30 || bFourth>0x39)
{
MessageBox("四字节末字节输入有误!");
SendDlgItemMessage(IDC_EDIT_CODE,EM_SETSEL,6,8);
return;
}
/*****************有字区域位置确定*********************/
if(((bFirst==0x81) && (bSecond==0x39) && (bThird>=0xee))
|| ((bFirst==0x82) && (bSecond<=0x34))
|| ((bFirst==0x82) && (bSecond==0x35) && (bThird<=0x87)))
{
m_input = FourBytePro(bFirst,bSecond,bThird,bFourth);
}
else
{
MessageBox("无字区域,请重新输入编码");
SendDlgItemMessage(IDC_EDIT_CODE,EM_SETSEL,0,-1);
return;
}
}
}
else if(m_inputKind == 1)//处理中文字符输入
{
byte bFirst = (byte)m_code.GetAt(0);
if(bFirst < 0x81)
{
MessageBox("请输入中文字符!");
SendDlgItemMessage(IDC_EDIT_CODE,EM_SETSEL,0,-1);
return;
}
byte bSecond = (byte)m_code.GetAt(1);
m_input = (bFirst-0x81)*192+(bSecond-0x40);
}
else//处理字符在字库中的索引顺序输入
{
m_input = atoi(m_code);
if(m_input>m_maxIndex || m_input<0)
{
char str[20];
sprintf(str,"索引越界(0,%d)!",m_maxIndex);
SendDlgItemMessage(IDC_EDIT_CODE,EM_SETSEL,0,-1);
MessageBox(str);
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -