⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datawin.cpp

📁 用户管理系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
{
//计算滚动条相对位移
	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 + -