📄 childview.cpp
字号:
// TODO: 在此添加消息处理程序代码和/或调用默认值
CdlgCharEdit dlg(this);
CRect cRect;
static int i,j;
// 绘图区域!
cRect.left = this->m_MapX;
cRect.right = this->m_MapX + p_Grid_W * m_col;
cRect.top = this->m_MapY ;
cRect.bottom = this->m_MapY + p_Grid_H * m_row;
// 计算行列范围.
if(cRect.PtInRect(point))
{
i = (point.x - cRect.left) / p_Grid_W ;
j = (point.y - cRect.top) / p_Grid_H ;
dlg.SetFontArray(arr_tbl[id_fnt][i + j * 16]);
}
// 修改
int iRet = dlg.DoModal();
//TRACE("dlg return:%d\n",iRet);
if(iRet == IDC_OK)
{
TRACE("Get Dialog Font Arr!");
// 释放字体
if(arr_tbl[id_fnt][i + j * 16])
free(arr_tbl[id_fnt][i + j * 16]);
// 清空指针
arr_tbl[id_fnt][i + j * 16] = NULL;
// 取得阵列数据
arr_tbl[id_fnt][i + j * 16] = dlg.GetFontArray();
this->Invalidate(FALSE);
}
CWnd::OnLButtonDblClk(nFlags, point);
}
//================================================================================
//= 填充字符数据:字符大小要选择确定
//================================================================================
void CChildView::OnEditFill()
{
// 创建对话框
CdlgCharFill dlg(this);
// 取得字符数据位置
dlg.m_pArr = &(arr_tbl[id_fnt][0]);
// 选择属性
int id = dlg.DoModal();
// 确定
if(id == IDC_OK )
{
// 如果已经修改数据但是以前没有就要添加,否则,不与保存.
if(sFnt[id_fnt].GetCount() == 0)
sFnt[id_fnt].Add(_T("Font_Arry"));
this->Invalidate(FALSE);
}
}
//================================================================================
// 属性
//================================================================================
void CChildView::OnEditProperty()
{
CdlgCharEdit dlg(this);
CRect cRect;
static int i,j;
// 初始化
i = 1; j = 1;
// 返回数据
int iRet = dlg.DoModal();
TRACE("dlg return:%d\n",iRet);
if(iRet == IDC_OK)
{
TRACE("Get Dialog Font Arr!");
// 释放字体
if(arr_tbl[id_fnt][i + j * 16])
free(arr_tbl[id_fnt][i + j * 16]);
// 清空指针
arr_tbl[id_fnt][i + j * 16] = NULL;
// 取得阵列数据
arr_tbl[id_fnt][i + j * 16] = dlg.GetFontArray();
// 刷新
this->Invalidate(FALSE);
}
}
//================================================================================
// 另存为
//================================================================================
void CChildView::OnFileSaveas()
{
CFileDialog dlg(FALSE,_T("c"),_T("font.c"),
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("Font C File (*.c)|*.c|Any File (*.*)|*.*|"),this);
// 打开保存对话框
int iRet = dlg.DoModal();
// 文件为空就无效,返回
if(dlg.GetFileName()==_T("") || iRet == 0)
{
return;
}
m_SavePathName = dlg.GetPathName();
// 保存文件
DoSaveToFile(m_SavePathName);
// 修改标题
this->GetParentFrame()->SetWindowText
(CString(_T("TFont V 1.00 (R) - Font File [")) + m_SavePathName + CString(_T("]")));
}
//================================================================================
//= 文件保存处理
//================================================================================
void CChildView::OnFileSave()
{
if (m_SavePathName != _T(""))
{
// 保存文件
DoSaveToFile(m_SavePathName);
}
else
{
// TODO: 在此添加命令处理程序代码.
CFileDialog dlg(FALSE,_T("c"),_T("font.c"),
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("Font C File (*.c)|*.c|Any File (*.*)|*.*|"),this);
// 打开保存对话框
int iRet = dlg.DoModal();
TRACE("CFileDialog Return = %x",iRet);
// 文件为空就无效,返回.
if(dlg.GetFileName()==_T("") || iRet != 1)
return;
m_SavePathName = dlg.GetPathName();
// 保存文件
DoSaveToFile(m_SavePathName);
// 修改标题
this->GetParentFrame()->SetWindowText
(CString(_T("TFont V 1.00 (R) - Font File [")) + m_SavePathName + CString(_T("]")));
}
}
//=================================================================================================
// 绘制字体1
//=================================================================================================
void CChildView::OnFont1()
{
SetFontTable(0);
}
//=================================================================================================
// 绘制字体2
//=================================================================================================
void CChildView::OnFont2()
{
SetFontTable(1);
}
//=================================================================================================
// 绘制字体2
//=================================================================================================
void CChildView::OnFont3()
{
SetFontTable(2);
}
//=================================================================================================
// 绘制字体 4
//=================================================================================================
void CChildView::OnFont4()
{
SetFontTable(3);
}
//=================================================================================================
// 拷贝数据到剪贴板
//=================================================================================================
void CChildView::OnEditCopy()
{
UINT idDataFormat = 0;
UINT w = 0;
UINT h = 0;
UINT iSize = 0;
//TRACE("复制!\n");
// 判断数据是否有效?
if(!m_CurArray)
{
TRACE("当前数据地址无效\n");
return;
}
// 是否有数据?
if(!(*m_CurArray))
{
TRACE("复制无效数据!\n");
return;
}
// 打开剪贴板
if(!this->OpenClipboard())
{
TRACE("剪贴板打开失败!\n");
return;
}
// 清空剪贴板数据
EmptyClipboard();
// 注册剪贴板数据.
idDataFormat = RegisterClipboardFormat(_T("CF_TFONT_CHAR"));
TRACE(_T("CF_TFONT_CHAR = %X \n"),idDataFormat);
w = (*m_CurArray)[0];
h = (*m_CurArray)[1];
iSize = (w * h + 7) / 8 + 3;
// 分配可以移动内存!
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE,iSize);
// 分配数据是否有效?
if(!hMem)
{
TRACE(_T("全局内存分配失败!\n"));
return ;
}
// 分配数据
LPVOID pAlloc = GlobalLock(hMem);
// 数据拷贝.
memcpy(pAlloc,(*m_CurArray),iSize);
// 解开锁定
GlobalUnlock(hMem);
// 设置剪贴板数据
SetClipboardData(idDataFormat,hMem);
// 关闭剪贴板
CloseClipboard();
}
//=================================================================================================
// 剪切
//=================================================================================================
void CChildView::OnEditCut()
{
UINT idDataFormat = 0;
UINT w = 0;
UINT h = 0;
UINT iSize = 0;
//TRACE("复制!\n");
// 判断数据是否有效?
if(!m_CurArray)
{
TRACE("当前数据地址无效\n");
return;
}
// 是否有数据?
if(!(*m_CurArray))
{
TRACE("复制无效数据!\n");
return;
}
// 打开剪贴板
if(!this->OpenClipboard())
{
TRACE("剪贴板打开失败!\n");
return;
}
// 清空剪贴板数据
EmptyClipboard();
// 注册剪贴板数据.
idDataFormat = RegisterClipboardFormat(_T("CF_TFONT_CHAR"));
TRACE(_T("CF_TFONT_CHAR = %X \n"),idDataFormat);
w = (*m_CurArray)[0];
h = (*m_CurArray)[1];
iSize = (w * h + 7) / 8 + 3;
// 分配可以移动内存!
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE,iSize);
// 分配数据是否有效?
if(hMem == NULL)
{
TRACE("全局内存分配失败!\n");
return ;
}
// 分配数据
LPVOID pAlloc = GlobalLock(hMem);
// 数据拷贝.
memcpy(pAlloc,(*m_CurArray),iSize);
// 解开锁定
GlobalUnlock(hMem);
// 设置剪贴板数据
SetClipboardData(idDataFormat,hMem);
// 关闭剪贴板
CloseClipboard();
// 释放掉数据,清空数据对象.
free(*m_CurArray);
// 释放数据
*m_CurArray = NULL;
this->Invalidate(0);
}
//=================================================================================================
// 删除字符
//=================================================================================================
void CChildView::OnEditDelete()
{
// 释放掉数据,清空数据对象.
if(!m_CurArray)
return;
if(!*m_CurArray)
return;
free(*m_CurArray);
*m_CurArray = NULL;
this->Invalidate(0);
}
//=================================================================================================
// 粘贴字符
//=================================================================================================
void CChildView::OnEditPaste()
{
UINT idDataFormat = 0;
UINT w = 0;
UINT h = 0;
//TRACE("粘贴!\n");
if(!m_CurArray)
{
return ;
}
// 打开剪贴板
if(!this->OpenClipboard())
{
TRACE("剪贴板打开失败!\n");
return;
}
// 注册剪贴板数据.
idDataFormat = RegisterClipboardFormat(_T("CF_TFONT_CHAR"));
TRACE(_T("CF_TFONT_CHAR = %x\n"),idDataFormat);
// 内存句柄
HGLOBAL hMem = GetClipboardData(idDataFormat);
// 是否有效?
if(hMem == NULL)
{
TRACE(_T("剪贴板无数据!\n"));
return ;
}
// 锁定分配数据
LPVOID pAlloc = GlobalLock(hMem);
// 数据大小
UINT iSize = GlobalSize(hMem);
// 判断数据是否有效.
if(*m_CurArray)
{
free(*m_CurArray);
*m_CurArray = NULL;
}
// 重新分配数据
*m_CurArray = (BYTE*)malloc(iSize);
// 数据拷贝.
memcpy((*m_CurArray),pAlloc,iSize);
// 解开锁定
GlobalUnlock(hMem);
// 关闭剪贴板
CloseClipboard();
// 刷新
this->Invalidate(0);
}
//=================================================================================================
// 插入字符
//=================================================================================================
void CChildView::OnEditInsert()
{
// TODO: 在此添加命令处理程序代码
}
//=================================================================================================
// 鼠标右键菜单
//=================================================================================================
void CChildView::OnRButtonDown(UINT nFlags, CPoint point)
{
CMenu oMenu;
CMenu *pSubMenu;
POINT p;
oMenu.LoadMenu(IDR_MENU_POP);
pSubMenu = oMenu.GetSubMenu(0);
p.x = point.x ;
p.y = point.y ;
this->ClientToScreen(&p);
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,p.x ,p.y ,this);
CWnd::OnRButtonDown(nFlags, point);
}
//=================================================================================================
// 选择数据.
//=================================================================================================
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect cRect;
static int Col,Row;
static int OldCol,OldRow;
CDC *dc = this->GetDC();
// 是否有效!
if(dc != NULL)
{
// 绘图区域!
cRect.left = this->m_MapX ;
cRect.right = this->m_MapX + p_Grid_W * m_col;
cRect.top = this->m_MapY ;
cRect.bottom = this->m_MapY + p_Grid_H * m_row;
// 上次位置
OldCol = Col;
OldRow = Row;
// 判断范围
if(cRect.PtInRect(point))
{
Col = (point.x - cRect.left) / p_Grid_W ;
Row = (point.y - cRect.top) / p_Grid_H ;
dc->Draw3dRect(cRect.left + OldCol * p_Grid_W ,cRect.top + OldRow * p_Grid_H ,p_Grid_W,p_Grid_H,pvBackColor,pvBackColor);
dc->Draw3dRect(cRect.left + Col * p_Grid_W ,cRect.top + Row * p_Grid_H ,p_Grid_W,p_Grid_H,0xff00ff,0x0000ff);
// 记录区域
m_CurRect.left = cRect.left;
m_CurRect.top = cRect.top;
m_CurRect.right = cRect.right;
m_CurRect.bottom = cRect.bottom;
}
// 记录当前的位置
m_CurArray = &(arr_tbl[id_fnt][Row * 16 + Col]);
}
CWnd::OnLButtonDown(nFlags, point);
}
//=================================================================================================
//= 数据设置
//=================================================================================================
void CChildView::OnViewSetup()
{
CdlgSetup dlg;
dlg.DoModal();
this->m_data.LoadFromProfile();
// 立即更新大小
if(this->m_data.m_iSizeW >= 8 && this->m_data.m_iSizeW <= 100)
p_Grid_W = this->m_data.m_iSizeW;
if(this->m_data.m_iSizeH >= 8 && this->m_data.m_iSizeH <= 100)
p_Grid_H = this->m_data.m_iSizeH;
// 修改大小
RECT r;
this->GetClientRect(&r);
this->OnSize(0,r.right - r.left ,r.bottom - r.top );
}
//=================================================================================================
//= 设置字体表
//=================================================================================================
int CChildView::SetFontTable(int nIndex)
{
CString sTemp;
CMenu *pMenu = NULL;
CMainFrame *pMainFrm = NULL;
// 默认的字符表格一
p_fnt = (BYTE **)(&arr_tbl[id_fnt = nIndex % 4][0]);
// 刷新数据
this->Invalidate(TRUE);
// 检测主窗口
pMainFrm = (CMainFrame *)AfxGetMainWnd();
// 无效退出
if(pMainFrm == NULL)
return 0;
// 显示当前字符表
sTemp.Format(_T("Font Table[%d]"),nIndex + 1);
pMainFrm->ShowStatuText(sTemp,2);
// 取得菜单
pMenu = pMainFrm->GetMenu();
// 如果菜单无效就退出
if(pMenu == NULL)
return 0;
// 检查菜单
pMenu ->CheckMenuRadioItem(IDM_FONT_1,IDM_FONT_4,IDM_FONT_1+nIndex % 4,MF_BYCOMMAND);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -