📄 datawin.cpp
字号:
{
//计算滚动条相对位移
CRect rtClient;
GetClientRect(&rtClient);
if(m_bIsPrintView) //模似显示
return xPos*(m_RectPage.Width()-rtClient.Width()+m_nFrameW*2)/100;
else
return xPos*(m_RectPage.Width()-rtClient.Width())/100;
}
////////////////////////////////////////////////////////////////
//取页面总面积
void CDataWin::GetPageRect(RECT *pRect)
{
SetRect(pRect, m_RectPage.left, m_RectPage.top,
m_RectPage.right, m_RectPage.bottom);
if(m_bIsPrintView)
{//模似显示
pRect->right +=2*m_nFrameW;
pRect->bottom+=2*m_nFrameH;
/* pRect->left *=m_xZoom;
pRect->top *=m_yZoom;
pRect->right *=m_xZoom;
pRect->bottom*=m_yZoom;
*/
}
else
{
pRect->bottom=m_nHead+m_nEnd+m_nFoot+
m_nCellMax*m_nCellHeight;
}
}
void CDataWin::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
CalSize(m_RectPage, m_xPix, m_yPix); //重新计算页面
RefurbishDoubleRam(); //更新
Invalidate();
}
////////////////////////////////////////////////
//水平滚动
void CDataWin::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
int iCurrent, iOld;
HWND hWnd = GetSafeHwnd();
iCurrent = ::GetScrollPos(hWnd, SB_HORZ);
iOld = iCurrent;
switch(nSBCode)
{
case SB_THUMBTRACK:
case SB_THUMBPOSITION: //释放滚动块
iCurrent = nPos;
break;
case SB_LINEDOWN: //击滚动条右箭头
iCurrent+=10;
break;
case SB_LINEUP: //击滚动条左箭头
iCurrent-=10;
break;
case SB_PAGEDOWN: //击滚动块右边空白区
iCurrent = iCurrent + 20;
break;
case SB_PAGEUP: //击滚动块左边空白区
iCurrent = iCurrent - 20;
break;
} // switch结束
if(iCurrent<0) iCurrent=0;
if(iCurrent>100) iCurrent=100;
if(iOld != iCurrent)
{
::SetScrollPos(GetSafeHwnd(), SB_HORZ, iCurrent, TRUE);
CRect rtClient;
GetClientRect(rtClient);
RedrawWindow(&rtClient,NULL,RDW_INTERNALPAINT| RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
// Invalidate();
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
////////////////////////////////////////////////
//垂直滚动
void CDataWin::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
int iCurrent, iOld;
SCROLLINFO si;
si.cbSize = sizeof (si) ;
si.fMask = SIF_ALL ;
GetScrollInfo(SB_VERT, &si);
iCurrent = si.nPos;
iOld = iCurrent;
switch(nSBCode)
{
case SB_THUMBTRACK:
case SB_THUMBPOSITION: //释放滚动块
iCurrent = nPos;
break;
case SB_LINEDOWN: //击滚动条右箭头
iCurrent++;
break;
case SB_LINEUP: //击滚动条左箭头
iCurrent--;
break;
case SB_PAGEDOWN: //击滚动块右边空白区
iCurrent = iCurrent + si.nMax/5;
break;
case SB_PAGEUP: //击滚动块左边空白区
iCurrent = iCurrent - si.nMax/5;
break;
} // switch结束
if(iCurrent<0) iCurrent=0;
if(iCurrent>si.nMax) iCurrent=si.nMax;
if(iOld != iCurrent)
{
::SetScrollPos(GetSafeHwnd(), SB_VERT, iCurrent, TRUE);
CRect rtClient;
GetClientRect(rtClient);
RedrawWindow(&rtClient,NULL,RDW_INTERNALPAINT| RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
//Invalidate();
}
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
////////////////////////////////////////////////
//设置当前页
int CDataWin::SetCurrentPage(int nPage, BOOL bIsPrint)
{
int nOld;
if(nPage < 0) nPage = 0;
if(bIsPrint)
{
if(nPage > m_nPageMaxPn-1) nPage = m_nPageMaxPn-1;
nOld = m_nPagePn;
m_nPagePn = nPage;
if(nOld != m_nPagePn)
{
::SetScrollPos(GetSafeHwnd(), SB_VERT,0, TRUE);
//m_RecordSet.MoveFirst();
//for(int i = 0; i < m_nPagePn * m_nCellMaxPn; i++)
// m_RecordSet.MoveNext();
m_RecordSet.Move((long)m_nPagePn);
Invalidate();
}
return nOld;
}
else
{
if(nPage > m_nPageMax-1) nPage = m_nPageMax-1;
nOld = m_nPage;
m_nPage = nPage;
if(nOld != m_nPage)
{
::SetScrollPos(GetSafeHwnd(), SB_VERT,0, TRUE);
//m_RecordSet.MoveFirst();
//for(int i = 0; i < m_nPage * m_nCellMax; i++)
// m_RecordSet.MoveNext();
m_RecordSet.Move((long)m_nPage);
UpdateRecord();
RefurbishDoubleRam(); //更新
Invalidate();
}
return nOld;
}
}
////////////////////////////////////////////////
//取当前页
int CDataWin::GetCurrentPage( BOOL bIsPrint)
{
if(bIsPrint)
return m_nPagePn;
else
return m_nPage;
}
////////////////////////////////////////////////
//取总页数
int CDataWin::GetPageCount(BOOL bIsPrint)
{
if(bIsPrint)
return m_nPageMaxPn;
else
return m_nPageMax;
}
////////////////////////////////////////////////
//创建绘图类,打印绘图类和显示绘图类一个
BOOL CDataWin::InitGraphic()
{
if(m_pGraphic) delete m_pGraphic;
if(m_pGraphicPn) delete m_pGraphicPn;
m_pGraphicPn = NULL;
m_pGraphic = new CPreGraphic;
if(!m_pGraphic) return FALSE;
m_pGraphicPn = m_pGraphic;
return TRUE;
}
////////////////////////////////////////////////
//设置当前绘图类
CPreGraphic *CDataWin::SetGraphic(CPreGraphic *p, BOOL bIsPrint)
{
CPreGraphic *pOld;
if(bIsPrint)
{
pOld = m_pGraphicPn;
m_pGraphicPn = p;
return pOld;
}
else
{
pOld = m_pGraphic;
m_pGraphic = p;
return pOld;
}
}
///////////////////////////////////////////////////////////
//设置双缓存
//缓存状态被改变后,并不马上生效,它必须在OnPaint事件中
//进行状态转换,这样做是为了避免在执行OnPaint事件时,
//刚好删除m_bkBitamp使画面混乱,也不知道有没有这种可能了
BOOL CDataWin::SetDoubleRam(BOOL bFlag)
{
if(bFlag == FALSE && m_nDoubleRam > 0) //禁止
{//发出删除命令,在OnPain中删除
m_nDoubleRam = PNR_DELETERAM;
}
else if(bFlag == TRUE)
{//起用双缓存
if(m_nDoubleRam == PNR_DISABLEDRAM)
m_nDoubleRam = PNR_CREATERAM; //发出创建命令
else if(m_nDoubleRam == PNR_USEDRAM)
m_nDoubleRam = PNR_REFURBISHRAM; //发出更新命令
else if(m_nDoubleRam == PNR_DELETERAM)
return FALSE; //设置失败
}
return TRUE;
}
///////////////////////////////////////////
//更新双缓存
void CDataWin::RefurbishDoubleRam()
{
if(m_nDoubleRam > 0) //目前状态可以使用双缓存
m_nDoubleRam=PNR_REFURBISHRAM;
}
////////////////////////////////////////
//返回双缓存状态
BOOL CDataWin::GetDoubleRam()
{
if(m_nDoubleRam > 0) return TRUE;
return FALSE;
}
////////////////////////////////////////////////
//返回绘图类
CPreGraphic *CDataWin::GetGraphic(BOOL bIsPrint)
{
if(bIsPrint)
return m_pGraphicPn;
else
return m_pGraphic;
}
////////////////////////////////////////////////
//设置打印机
BOOL CDataWin::SetPrinter(LPTSTR pszPrinterName)
{
if(pszPrinterName == NULL)
{
m_strPrinterName = _T("");
return TRUE;
}
if(m_Print.IsPrinter(pszPrinterName))
{
m_strPrinterName = pszPrinterName;
return TRUE;
}
return FALSE;
}
void CDataWin::SetPrintView(BOOL bPrintView, int nWidth, int nHeight)
{
if(bPrintView != m_bIsPrintView)
{
m_nPage=0;
m_bIsPrintView=bPrintView;
RefurbishDoubleRam();
}
if(bPrintView) //虚拟显示的左右、上下边距
{
m_nFrameW = nWidth;
m_nFrameH = nHeight;
}
}
//////////////////////////////////////////////////
//按比例转换坐标系
void CDataWin::CalMulRect(LPRECT pRect, double xPix, double yPix)
{
pRect->left *=xPix/m_xPix;
pRect->right *=xPix/m_xPix;
pRect->top *=yPix/m_yPix;
pRect->bottom *=yPix/m_yPix;
}
/////////////////////////////////////////////////
//坐标转换
int CDataWin::CalMulInt(int x, double dbPix)
{
return x * dbPix/m_yPix;
}
BOOL CDataWin::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return false;
// return CDialog::OnEraseBkgnd(pDC);
}
int CDataWin::Retrieve(LPCSTR pSQL, BOOL bMsg)
{
if(!m_RecordSet.Open(pSQL)) goto err01;
if(m_RecordSet.IsEOF()) goto err02;
if(m_pUp) m_pUp->EnableWindow(false);
if(m_pDown) m_pDown->EnableWindow(false);
m_RecordSet.MoveFirst(); //移至首行
m_nPage = 0;
m_nPagePn=m_nPageMaxPn=0;
CalSize(m_RectPage, m_xPix, m_yPix); //重新计算页面
UpdateRecord();
RefurbishDoubleRam(); //清除缓存
Invalidate(); //强制重绘
if(m_pDown && m_nPageMax > 1)
m_pDown->EnableWindow(true);
return 0;
err01:
if (bMsg)
::MessageBox(NULL,"错误:打开数据库出错误!" ,"错误", MB_OK|MB_ICONSTOP);
return -1;
err02:
if (bMsg)
::MessageBox(NULL,"注意:没有发现任何资料!","系统提示", MB_OK|MB_ICONEXCLAMATION);
return 100;
}
///////////////////////////////////////////////
//句法分析
BOOL CDataWin::Construe(CDataCell *pCell, char *p)
///////////////////////////////////////////////
{
int iBegin=0, i=0, j;
BOOL bExit = false, bDel = true;
char cCode;
CString strText = _T("");
CString strCmd = p;
CString strCell;
//去空格、等号
strCmd.MakeUpper();
strCmd = strCmd.Right(strCmd.GetLength()-1);
for (i = 0; i < strCmd.GetLength(); i++)
{
cCode = strCmd.GetAt(i);
if (cCode == ';') //;右边可以删除空格
bDel = true;
else if (cCode == '=') //=右边禁止删除空格
bDel = false;
else if(bDel == TRUE && cCode == ' ')
continue; //删除空格
strText = strText + strCmd.Mid(i, 1);
}
//默认值
//pCell->strClass = _T("EDIT");
pCell->dwCommand = PNS_DATABASE;
//取数据项名
i = strText.Find(';');
if ( i < 0) //无项目设置
{
pCell->strName = strText;
return true;
}
else
{
iBegin = i + 1; //移动指针
pCell->strName = strText.Left(i);
goto next01;
}
for(;;)
{
//7)VALUES指定取值范围
j = strCmd.Find("VALUES=");
if (j >= 0)
{
pCell->strValues = strCmd.Right(strCmd.GetLength()-j-7);
goto next01;
}
//9)ZOOMH垂直放大
j = strCmd.Find("ZOOMH=");
if (j >= 0)
{
pCell->fZoomH = atof(strCmd.Right(strCmd.GetLength()-j-6));
goto next01;
}
//10)ZOOMV水平放大
j = strCmd.Find("ZOOMV=");
if (j >= 0)
{
pCell->fZoomV = atof(strCmd.Right(strCmd.GetLength()-j-6));
goto next01;
}
//11)STYLE样式
/* j = strCmd.Find("STYLE=");
if (j >= 0)
{
strCmd = strCmd.Right(strCmd.GetLength()-j-6);
if(strCmd == _T("MULTILINE"))
pCell->dwStyle &= ~DT_SINGLELINE;
goto next01;
}
*/
next01: //取出;号分格项目
if (bExit) break; //退出
i = strText.Find(';', iBegin);
if ( i < 0)
{
strCmd = strText.Right(strText.GetLength()-iBegin);
bExit = true; //最后一项
}
else
{
strCmd = strText.Mid(iBegin, i-iBegin);
iBegin = i+1; //移动一项
}
}//end for
return true;
}
void CDataWin::PageUp()
{
SetCurrentPage(GetCurrentPage()-1);
int nPage = GetCurrentPage();
//是否第一页
if(m_pUp && nPage == 0 )
m_pUp->EnableWindow(FALSE);
//是否最后一页
if(m_pDown &&
m_pDown->IsWindowEnabled( ) == FALSE &&
nPage != GetPageCount()-1)
m_pDown->EnableWindow(TRUE);
}
void CDataWin::PageDown()
{
SetCurrentPage(GetCurrentPage()+1);
int nPage = GetCurrentPage();
//是否最后一页
if(m_pDown && nPage == GetPageCount()-1)
m_pDown->EnableWindow(FALSE);
//是否只有一页
if( m_pUp &&
m_pUp->IsWindowEnabled( ) == FALSE &&
nPage != 0)
m_pUp->EnableWindow(TRUE);
}
void CDataWin::SetPageButton(CButton *pUp, CButton *pDown)
{
m_pUp = pUp;
m_pDown = pDown;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -