viewdialogrec.cpp

来自「偶作的毕业设计程序」· C++ 代码 · 共 497 行

CPP
497
字号
// ViewDialogRec.cpp : implementation file
//

#include "stdafx.h"
#include "softdocsystem.h"
#include "ViewDialogRec.h"
#include "Manager.h"
#include "Custom.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CViewDialogRec dialog
extern int PublicUserType;
extern CString PublicUserName;

CViewDialogRec::CViewDialogRec(CWnd* pParent /*=NULL*/)
	: CDialog(CViewDialogRec::IDD, pParent)
{
	//{{AFX_DATA_INIT(CViewDialogRec)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CViewDialogRec::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CViewDialogRec)
	DDX_Control(pDX, IDC_LIST2, m_List);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CViewDialogRec, CDialog)
	//{{AFX_MSG_MAP(CViewDialogRec)
	ON_BN_CLICKED(IDC_BUTTON5, OnAllRecord)
	ON_BN_CLICKED(IDC_BUTTON3, OnCommand)
	ON_BN_CLICKED(IDC_BUTTON4, OnClearDialog)
	ON_BN_CLICKED(IDC_BUTTON2, OnTalk)
	ON_WM_CTLCOLOR()
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_BUTTON1, OnPrint)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CViewDialogRec message handlers

BOOL CViewDialogRec::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_Brush.CreateSolidBrush (RGB(0,0,255));
	m_hRedBrush = ::CreateSolidBrush(RGB(255, 0, 0));

	switch(PublicUserType)//按钮初始化
	{case 1:
	GetDlgItem(IDC_BUTTON4)->EnableWindow(true);
	GetDlgItem(IDC_BUTTON2)->EnableWindow(true);
	break;
	case 2:
		GetDlgItem(IDC_BUTTON4)->EnableWindow(false);
		GetDlgItem(IDC_BUTTON2)->EnableWindow(true);
		break;
	case 3:
		GetDlgItem(IDC_BUTTON4)->EnableWindow(false);
		GetDlgItem(IDC_BUTTON2)->EnableWindow(false);
		break;
	}
	InitList();
	ConnectData();//连接数据源
	if(m_Log.InlitSetup (m_DBCnt))//操作日志
		m_Log.Addlog (PublicUserName,"查看会话记录","会话记录");
	return TRUE;  // return TRUE unless you set the focus to a control
	// EXCEPTION: OCX Property Pages should return FALSE
}

void CViewDialogRec::OnAllRecord() 
{
	// TODO: Add your control notification handler code here
	m_List.DeleteAllItems ();
	m_List.SetRedraw (false);
	CString mysql,mystr;	
	_variant_t Holder;
     int	i=0;
	mysql.Format("SELECT * FROM MessageMap");
	_bstr_t sql=mysql;
	_bstr_t source=m_strSource;
	_RecordsetPtr Myset;
	Myset.CreateInstance (__uuidof(Recordset));
	try{
		Myset->Open (sql,source,adOpenDynamic,adLockOptimistic,adCmdText);}
	catch(_com_error &e){
		AfxMessageBox(e.ErrorMessage ());
	}
	while(!Myset->adoEOF ){
		Holder=Myset->GetCollect ("消息类别");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		else 
			mystr="未知类别";
			m_List.InsertItem (i,mystr);
	Holder=Myset->GetCollect ("发出用户");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else 
			mystr="未知发出人";
			m_List.SetItemText(i,1,mystr);
			Holder=Myset->GetCollect ("征对用户");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else mystr="未知接收人";
			m_List.SetItemText(i,2,mystr);
			Holder=Myset->GetCollect ("内容");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else mystr="未知内容";
			m_List.SetItemText(i,3,mystr);
			Holder=Myset->GetCollect ("发出日期");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else mystr="未知日期";
			m_List.SetItemText(i,4,mystr);
			Holder=Myset->GetCollect ("征对状态");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else mystr="未知状态";
			m_List.SetItemText(i,5,mystr);
			Holder=Myset->GetCollect ("消息号");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else mystr="未知编号";
			m_List.SetItemText(i,6,mystr);
			i+=1;
		Myset->MoveNext ();
	}
	Myset->Close();//记录关闭
	m_List.SetRedraw (true);
	Invalidate();//重绘窗口
}

void CViewDialogRec::ConnectData()
{
 CSoftDocSystemApp* myApp=(CSoftDocSystemApp*)AfxGetApp();
	 CString source_;
	 source_.Format ("driver={SQL Server};server=%s;database=SoftDocument",myApp->ConnectServer);
	_bstr_t source=source_;
	_bstr_t pwd=myApp->ConnectPwd;
	_bstr_t user=myApp->ConnectUser;

	try{
		TESTHR(m_DBCnt.CreateInstance(_uuidof(Connection)));//测试结果的合法性
		TESTHR(m_DBCnt->Open(source, user, pwd, 16));
		
	}
	catch (_com_error &e){
		MessageBox(e.ErrorMessage()); 
		MessageBox("数据源初始化失败!");
		return;
	}
	m_strSource = (char * )source;
}

void CViewDialogRec::InitList()//初始化列表框
{
	   		m_List.InsertColumn (0,"消息类别");
			m_List.InsertColumn (1,"发出用户");
			m_List.InsertColumn (2,"征对用户");	
			m_List.InsertColumn (3,"内容");
			m_List.InsertColumn (4,"发出日期");
			m_List.InsertColumn (5,"征对状态");
			m_List.InsertColumn (6,"消息号");
				RECT rect;
			m_List.GetWindowRect(& rect);
			int wid=(rect.right -rect.left )/5;
			m_List.SetColumnWidth(0,wid);
			m_List.SetColumnWidth(1,wid);
			m_List.SetColumnWidth(2,wid);
			m_List.SetColumnWidth(3,wid);
			m_List.SetColumnWidth(4,wid);
			m_List.SetExtendedStyle (LVS_EX_FULLROWSELECT);
}

void CViewDialogRec::OnCommand() 
{
	// TODO: Add your control notification handler code here
	m_List.DeleteAllItems ();
	m_List.SetRedraw (false);
	CString mysql,mystr;	
	_variant_t Holder;
     int	i=0;
	mysql.Format("SELECT * FROM MessageMap where 消息类别 = '通知'");
	_bstr_t sql=mysql;
	_bstr_t source=m_strSource;
	_RecordsetPtr Myset;
	Myset.CreateInstance (__uuidof(Recordset));
	try{
		Myset->Open (sql,source,adOpenDynamic,adLockOptimistic,adCmdText);}
	catch(_com_error &e){
		AfxMessageBox(e.ErrorMessage ());
	}

	while(!Myset->adoEOF ){
		Holder=Myset->GetCollect ("消息类别");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		else mystr="未知类别";
			m_List.InsertItem (i,mystr);
	Holder=Myset->GetCollect ("发出用户");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else mystr="未知发出人";
			m_List.SetItemText(i,1,mystr);
			Holder=Myset->GetCollect ("征对用户");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else mystr="未知接收人";
			m_List.SetItemText(i,2,mystr);
			Holder=Myset->GetCollect ("内容");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else mystr="未知内容";
			m_List.SetItemText(i,3,mystr);
			Holder=Myset->GetCollect ("发出日期");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else mystr="未知日期";
			m_List.SetItemText(i,4,mystr);
			Holder=Myset->GetCollect ("征对状态");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else mystr="未知状态";
			m_List.SetItemText(i,5,mystr);
			Holder=Myset->GetCollect ("消息号");
		if(Holder.vt!=VT_NULL){
			mystr=(char*)(_bstr_t)Holder;
			mystr.TrimRight (" ");}
		    else mystr="未知编号";
			m_List.SetItemText(i,6,mystr);
			i+=1;
		Myset->MoveNext ();
	}
	Myset->Close();//记录关闭
	m_List.SetRedraw (true);
	Invalidate();//重绘窗口;
	Invalidate();//重绘窗口
}

void CViewDialogRec::OnClearDialog() 
{
	// TODO: Add your control notification handler code here
	int choice=AfxMessageBox("你将清楚全部会话记录,会话将不可恢复,确定删除吗?",MB_OKCANCEL|MB_ICONEXCLAMATION);
if(choice==IDOK){//清除操作日志
	_bstr_t strSQL("TRUNCATE TABLE MessageMap");
	try{
		m_DBCnt->Execute(strSQL,NULL,adCmdText);
	}
	catch(_com_error &e){
	AfxMessageBox(e.ErrorMessage ());return;
	}
AfxMessageBox("管理员,会话记录已成功删除,请进行下一步操作!");
//操作日志
m_Log.Addlog ("管理员","删除会话记录","会话记录");
}	
}

void CViewDialogRec::OnTalk() 
{
	// TODO: Add your control notification handler code here
	if(PublicUserType==1){
		this->ShowWindow(SW_HIDE);
		CManager dlg;
		dlg.DoModal ();}
	else
		if(PublicUserType==2){
			this->ShowWindow(SW_HIDE);
			CCustom dlg;
			dlg.DoModal ();
		}
}

HBRUSH CViewDialogRec::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	HBRUSH hRedBrush = ::CreateSolidBrush(RGB(255, 0, 0));
	//HBRUSH hGreenBrush = ::CreateSolidBrush(RGB(0, 255, 0));
	//HBRUSH hBlueBrush = ::CreateSolidBrush(RGB(0, 0, 255));
	// TODO: Change any attributes of the DC here
if(nCtlColor==CTLCOLOR_BTN)
	//if (pWnd->GetDlgCtrlID() == IDC_BUTTON3)
	{
		// Set the text color to red
		pDC->SetTextColor(RGB(255, 0, 0));
		//pDC->SetBkColor(RGB(255, 0, 0));
		
		// Set the background mode for text to transparent 
		// so background will show thru.
		//pDC->SetBkMode(TRANSPARENT);
		
		// Return handle to our CBrush object
		//hbr = m_Brush;
		//hbr = hRedBrush;
	
}	
	return hRedBrush;
/*	
	{//如果它的名字叫
		pDC->SetTextColor(RGB(0,0,255));
		
	}
	// TODO: Return a different brush if the default is not desired
	return hbr;*/
	/*if (pWnd->GetDlgCtrlID() == IDC_BUTTON5)
	{
		pDC->SetTextColor(RGB(0, 255, 0));
		//pDC->SetBkColor(RGB(0, 255, 0));
	//	pDC->SetBkMode(TRANSPARENT);
		hbr = m_Brush;

		return m_hRedBrush;
	}
	if (pWnd->GetDlgCtrlID() == IDC_BUTTON3)
	{
		pDC->SetTextColor(RGB(0, 255, 255));
		//pDC->SetBkMode(TRANSPARENT);
		hbr = m_Brush;

		return m_hRedBrush;
	}
	if (nCtlColor == CTLCOLOR_EDIT){
		CRect rectWindow;
		pWnd->GetClientRect(rectWindow);
		pDC->FillSolidRect(rectWindow, RGB(0, 0, 255));
		return hBlueBrush;
	}
	if (nCtlColor == CTLCOLOR_BTN || nCtlColor == CTLCOLOR_STATIC){
		CRect rectWindow;
		pWnd->GetClientRect(rectWindow);
		pDC->FillSolidRect(rectWindow, RGB(0, 0, 255));
		pDC->SetBkColor(RGB(255, 0, 0));
		return hBlueBrush;
	}*/
	// TODO: Return a different brush if the default is not desired
	//return hRedBrush;//hbr;
}

void CViewDialogRec::OnDestroy() 
{
	CDialog::OnDestroy();
	
	if(m_DBCnt->GetState()==adStateOpen)
		m_DBCnt->Close();
	
}

void CViewDialogRec::OnPrint() 
{
	// TODO: Add your control notification handler code here
	typedef struct tagColAtt//存储各列信息
	{
		int nColIndex;
		CString strColText;
		int nPrintX;
		int nSubItemIndex;
	}COLATT;
	
	PRINTDLG pd;
	pd.lStructSize = sizeof(PRINTDLG);//初始化打印机
	pd.Flags = PD_RETURNDC;
	pd.hDC = NULL;
	pd.hwndOwner = NULL;
	pd.hInstance = NULL;
	pd.nMaxPage = 1;
	pd.nMinPage = 1;
	pd.nFromPage = 1;
	pd.nToPage  = 1;
	pd.nCopies = 1;
	pd.hDevMode = NULL;
	pd.hDevNames = NULL;
	
	//显示打印对话框,由用户来设定纸张大小等。
	if(!PrintDlg(&pd)) {AfxMessageBox("ERROR");return; }
	ASSERT(pd.hDC!=NULL);
	
	int nHorRes = GetDeviceCaps(pd.hDC, HORZRES);	
	int nVerRes = GetDeviceCaps(pd.hDC, VERTRES);
	int nXMargin = 2;
	int nYMargin = 2;
	TEXTMETRIC tm;
	GetTextMetrics(pd.hDC, &tm);
	int nCharHeight = tm.tmHeight;
	int nCharWidth = tm.tmAveCharWidth;
	
	
	CHeaderCtrl* pHeader = m_List.GetHeaderCtrl();
	
	int nColCount = pHeader->GetItemCount();//获得列的个数
	int nLineCount = m_List.GetItemCount();//获得行的个数
	
	int ColOrderArray[100];
	COLATT ca[100];//定义数组记录打印的文字
	m_List.GetColumnOrderArray(ColOrderArray, nColCount);
	int nColX =nXMargin*nCharWidth;//X方向的移动距离
	
	//检索各列的信息,确定列标题的内容长度。
	for(int i =0 ; i< nColCount; i++)//逐行打印
	{
		ca[i].nColIndex = ColOrderArray[i];
		LVCOLUMN lvc;//取得该列的表头
		char text[100];
		lvc.mask = LVCF_TEXT|LVCF_SUBITEM;
		lvc.pszText = text;
		lvc.cchTextMax = 100;
        m_List.GetColumn(ca[i].nColIndex, &lvc);
		ca[i].strColText = lvc.pszText;//
		ca[i].nSubItemIndex = lvc.iSubItem;
		ca[i].nPrintX = nColX;
		nColX += nCharWidth * strlen(ca[i].strColText);//以表头宽定义打印宽度
		
		if(nColX > nHorRes) //如果如果此时的宽度已大于水平极限宽度
		{
			DeleteDC(pd.hDC);
			AfxMessageBox("字段太多,无法在一行内打印,请试用较大的纸,或横向打印。");
			return;
		}
		
		
	}
	
	DOCINFO di;
	di.cbSize = sizeof(DOCINFO);
	di.lpszDocName = "ListCtrl Data Printing"; 
	di.lpszOutput = (LPTSTR) NULL; 
	di.lpszDatatype = (LPTSTR) NULL; 
	di.fwType = 0; 
	StartDoc(pd.hDC, &di);
	StartPage(pd.hDC);
	
	//调整各列的宽度,以使各列在后面的打印输出时更均匀的打印在纸上。
	int space = (nHorRes-nXMargin*nCharWidth-nColX) / (nColCount -1);
	for(i =1; i<nColCount; i++)
	{
		ca[i].nPrintX += i*space;
	}
	
	//输出列标题
	for(i =0; i<nColCount; i++)
		TextOut(pd.hDC, ca[i].nPrintX, nYMargin, 
		ca[i].strColText, strlen(ca[i].strColText));
	
	int nMaxLinePerPage = nVerRes/nCharHeight -3;
	int nCurPage =1;
	//输出各列的数据
	for(i =0; i<nLineCount; i++)//行
	{
		for(int j =0; j<nColCount; j++)//列
		{
			if(i+1-(nCurPage-1)*nMaxLinePerPage > nMaxLinePerPage)
			{
				//新的一页
				EndPage(pd.hDC);
				StartPage(pd.hDC);
				nCurPage ++;
			}
			CString subitem = m_List.GetItemText(i, j/*ca[j].nSubItemIndex*/);//取出列表框的字段
			TextOut(pd.hDC, ca[j].nPrintX, 
				nYMargin+(i+1-(nCurPage-1)*nMaxLinePerPage)*nCharHeight, 
				subitem, strlen(subitem));
		}
	}
	
	EndPage(pd.hDC);
	EndDoc(pd.hDC);
	//打印结束
	DeleteDC(pd.hDC);
	return;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?