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 + -
显示快捷键?