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

📄 tikudlg.cpp

📁 手动生成试题系统,还原SQL数据库名称为TestPaper
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// TIKUDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TIKU.h"
#include "TIKUDlg.h"
#include "DataModel.h"
#include "WordOffice.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTIKUDlg dialog

CTIKUDlg::CTIKUDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTIKUDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTIKUDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTIKUDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTIKUDlg)
	DDX_Control(pDX, IDC_BUTTON9, btnDeleteShiJuan);
	DDX_Control(pDX, IDC_COMBO5, cbShiJuan);
	DDX_Control(pDX, IDC_COMBO3, cbXueQi);
	DDX_Control(pDX, IDC_EDIT9, txtFenZhi);
	DDX_Control(pDX, IDC_EDIT8, txtNanDu);
	DDX_Control(pDX, IDC_EDIT7, txtZhiShiDian);
	DDX_Control(pDX, IDC_EDIT6, txtTiXing);
	DDX_Control(pDX, IDC_EDIT5, txtZhangJie);
	DDX_Control(pDX, IDC_EDIT4, txtKeMu);
	DDX_Control(pDX, IDC_EDIT11, txtDaAn);
	DDX_Control(pDX, IDC_EDIT10, txtShiTi);
	DDX_Control(pDX, IDC_BUTTON6, btnMake);
	DDX_Control(pDX, IDC_BUTTON7, btnPreviewQ);
	DDX_Control(pDX, IDC_BUTTON8, btnPreviewA);
	DDX_Control(pDX, IDC_BUTTON4, btnDown);
	DDX_Control(pDX, IDC_BUTTON3, btnUp);
	DDX_Control(pDX, IDC_COMBO4, cbYongTu);
	DDX_Control(pDX, IDC_EDIT3, txtRem);
	DDX_Control(pDX, IDC_EDIT2, txtTitle);
	DDX_Control(pDX, IDC_EDIT1, txtName);
	DDX_Control(pDX, IDC_BUTTON2, btnDelete);
	DDX_Control(pDX, IDC_BUTTON1, btnAdd);
	DDX_Control(pDX, IDC_TREE1, treeCtrl);
	DDX_Control(pDX, IDC_LIST1, listCtrl);
	DDX_Control(pDX, IDC_COMBO1, cbKeMu);
	DDX_Control(pDX, IDC_COMBO2, cbTiXing);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTIKUDlg, CDialog)
	//{{AFX_MSG_MAP(CTIKUDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangecbKeMu)
	ON_CBN_SELCHANGE(IDC_COMBO2, OnSelchangecbTiXing)
	ON_NOTIFY(NM_CLICK, IDC_LIST1, OnClickListCtrl)
	ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1, OnKeydownListCtrl)
	ON_BN_CLICKED(IDC_BUTTON1, OnbtnAdd)
	ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTreeCtrl)
	ON_BN_CLICKED(IDC_BUTTON2, OnbtnDelete)
	ON_NOTIFY(NM_CLICK, IDC_TREE1, OnClickTreeCtrl)
	ON_BN_CLICKED(IDC_BUTTON3, OnbtnUp)
	ON_BN_CLICKED(IDC_BUTTON4, OnbtnDown)
	ON_BN_CLICKED(IDC_BUTTON6, OnbtnMake)
	ON_BN_CLICKED(IDC_BUTTON7, OnPreviewQ)
	ON_BN_CLICKED(IDC_BUTTON8, OnPreviewA)
	ON_CBN_SELCHANGE(IDC_COMBO5, OnSelchangecbShiJuan)
	ON_BN_CLICKED(IDC_BUTTON9, OnbtnDeleteShiJuan)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTIKUDlg message handlers

BOOL CTIKUDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	AfxEnableControlContainer();
	AfxOleInit();

	m_ShiJuanID="0";
	btnDeleteShiJuan.EnableWindow(false);

	DataModel *DM=new DataModel();

	if(DM->OpenConnection())
	{
		//MessageBox("连接成功!");

		txtName.SetWindowText("XXX考试");
		txtTitle.SetWindowText("系别__________ 班级__________ 姓名__________ 学号__________ 科目__________");
		cbXueQi.SetCurSel(0);
		cbYongTu.SetCurSel(0);
		txtRem.SetWindowText("山东科技大学内部使用");

		//填充考试科目
		DM->FillComboBox(&cbKeMu,"select name from subject order by id");
		DM->FillComboBox(&cbTiXing,"select name from tixing order by id");
		DM->FillComboBox(&cbShiJuan,"select name from PaperMaster order by id","新试卷");

		cbShiJuan.SetCurSel(0);

		//初始化试题列表
		DWORD dwStyle = listCtrl.GetExtendedStyle();
        dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
        dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
        listCtrl.SetExtendedStyle(dwStyle); //设置扩展风格
	
		listCtrl.InsertColumn(0,"试题编号",LVCFMT_LEFT,60);
		listCtrl.InsertColumn(1,"考试科目",LVCFMT_LEFT,60);
		listCtrl.InsertColumn(2,"章节",LVCFMT_LEFT,100);
		listCtrl.InsertColumn(3,"题型",LVCFMT_LEFT,60);
		listCtrl.InsertColumn(4,"难度",LVCFMT_LEFT,60);
		listCtrl.InsertColumn(5,"题目",LVCFMT_LEFT,100);
		listCtrl.InsertColumn(6,"答案",LVCFMT_LEFT,100);
		listCtrl.InsertColumn(7,"分数",LVCFMT_LEFT,60);
		
		//DM->FillListCtrl(&listCtrl,"select id,isnull(kemu,'') as kemu,isnull(zhangjie,'') as zhangjie,isnull(tixing,'') as tixing,isnull(timu,'') as timu,isnull(daan,'') as daan,isnull(nandu,'') as nandu,isnull(score,0) as score from tiku order by id");

		CTIKUDlg::InitTree();

		cbKeMu.SetCurSel(0); // 选择科目的第一项
		cbTiXing.SetCurSel(0); // 选择题型的第一项

		CTIKUDlg::OnSelchangecbTiXing(); // 调用此事件,用以在列表中显示符合条件的试题

		DM->CloseConnection();
	}
	else
	{
		MessageBox("连接出错!");
	}

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTIKUDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTIKUDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTIKUDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CTIKUDlg::OnSelchangecbKeMu() 
{
	CTIKUDlg::FillListCtrl();  //  科目选项改变是重新填充列表
}

void CTIKUDlg::OnSelchangecbTiXing() 
{
	CTIKUDlg::FillListCtrl();  //  题型选项改变是重新填充列表
	
	CTIKUDlg::ReSetCurTreeItem();

	//treeCtrl.SetFocus();
}

void CTIKUDlg::FillListCtrl()
{
	DataModel *DM=new DataModel();

	if(DM->OpenConnection())
	{
		//MessageBox("连接成功!");

		CString tablename;
		CString s1="";
		CString s2="";
		cbKeMu.GetWindowText(s1);
		cbTiXing.GetWindowText(s2);
		tablename=DM->GetReturnString("select cast(tablename as nvarchar(100)) from tixing where cast([name] as nvarchar(100))='"+s2+"'");
		CString query="select id,isnull(cast(subject as nvarchar(100)),'') as subject,isnull(cast(chapter as nvarchar(100)),'') as chapter,'"+s2+"' as tixing,isnull(cast([level] as nvarchar(100)) ,'') as [level],isnull(cast(content as nvarchar(2000)),'') as content,isnull(cast(answer as nvarchar(2000)),'') as answer,isnull(score,0) as score from "+tablename+" where subject ='"+s1+"' order by id";
		if(tablename=="choose")
		{
			query="select id,isnull(cast(subject as nvarchar(100)),'') as subject,isnull(cast(chapter as nvarchar(100)),'') as chapter,'"+s2+"' as tixing,isnull(cast([level] as nvarchar(100)) ,'') as [level],(isnull(cast(content as nvarchar(2000)),'')+'\n\r [ A ] '+isnull(cast(option1 as nvarchar(500)),'')+'\n\r  [ B ] '+isnull(cast(option2 as nvarchar(500)),'')+'\n\r [ C ] '+isnull(cast(option3 as nvarchar(500)),'')+'\n\r [ D ] '+isnull(cast(option4 as nvarchar(500)),'')) as content,isnull(cast(answer as nvarchar(2000)),'') as answer,isnull(score,0) as score from "+tablename+" where subject ='"+s1+"' order by id";
		}
		DM->FillListCtrl(&listCtrl,query);
		m_Index=-1;
		DM->CloseConnection();
	}
	else
	{
		MessageBox("连接出错!");
	}
}

// 此函数用于当试题列表的索引改变是刷新试题信息
void CTIKUDlg::ListItemChanged()
{
	if(m_Index>-1 && m_Index<listCtrl.GetItemCount())
	{
		char* s=new char[2000];		
		txtKeMu.SetWindowText(listCtrl.GetItemText(m_Index,1));
		txtZhangJie.SetWindowText(listCtrl.GetItemText(m_Index,2));
		txtTiXing.SetWindowText(listCtrl.GetItemText(m_Index,3));
		txtNanDu.SetWindowText(listCtrl.GetItemText(m_Index,4));
		listCtrl.GetItemText(m_Index,5,s,2000);
		txtShiTi.SetWindowText(s);
		listCtrl.GetItemText(m_Index,6,s,2000);
		txtDaAn.SetWindowText(s);
		txtFenZhi.SetWindowText(listCtrl.GetItemText(m_Index,7));
	}
}

// 控制试题列表的单击事件,用于改变试题列表的索引m_Index
void CTIKUDlg::OnClickListCtrl(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	int nItem = -1;
    LPNMITEMACTIVATE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;
    if(lpNMItemActivate != NULL)
    {
		nItem = lpNMItemActivate->iItem;
		if(nItem!=m_Index)
		{
			m_Index=nItem;
			CTIKUDlg::ListItemChanged();
		}
    }
	*pResult = 0;
}

// 控制键盘的向上和向下的键,用于改变试题列表的索引m_Index
void CTIKUDlg::OnKeydownListCtrl(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
	// TODO: Add your control notification handler code here
	if(pLVKeyDow->wVKey==VK_UP)
	{
		if(m_Index>0)
		{
			m_Index-=1;
			CTIKUDlg::ListItemChanged();
		}
	}
	else if(pLVKeyDow->wVKey==VK_DOWN)
	{
		if(m_Index<listCtrl.GetItemCount()-1)
		{
			m_Index+=1;
			CTIKUDlg::ListItemChanged();
		}
	}
	*pResult = 0;
}

void CTIKUDlg::OnOK()
{
}
void CTIKUDlg::OnCancel()
{
	CDialog::OnCancel();
}

void CTIKUDlg::OnbtnAdd() 
{
	// 判断索引是否超出范围
	if(m_Index>-1 && m_Index<listCtrl.GetItemCount())
	{
		bool flag=false;
		HTREEITEM hParent=m_curTreeItem; // 获得当前的题型节点
		if(treeCtrl.ItemHasChildren(hParent)) // 是否存在子节点
		{
			HTREEITEM hItem=treeCtrl.GetChildItem(hParent); // 获取第一个子节点
			do
			{
				if(treeCtrl.GetItemText(hItem)==listCtrl.GetItemText(m_Index,0)) // 判断所选的试题是否存在
				{
					flag=true;
					MessageBox("您选择的试题已经存在!");
					break;
				}			
			}while(hItem=treeCtrl.GetNextSiblingItem(hItem)); // 是否存在下一个兄弟节点
		}
		if(!flag)
		{
			treeCtrl.InsertItem(listCtrl.GetItemText(m_Index,0),m_curTreeItem);
		}
	}
	else
	{
		MessageBox("请选择试题!");
	}	
}

void CTIKUDlg::OnbtnDelete() 
{
	// TODO: Add your control notification handler code here
	HTREEITEM hParent=treeCtrl.GetRootItem(); // 获得根节点
	HTREEITEM hItem=treeCtrl.GetSelectedItem(); // 获得当前选择的节点
	// 以下代码判断当前选择的节点是否试题节点,否则不能删除
	if(hItem!=hParent) // 判断当前选择的节点是否根节点
	{
		if(treeCtrl.GetParentItem(hItem)!=hParent) // 判断当前选择的节点是否题型节点(根据其父节点是否根结点来判断)
		{
			treeCtrl.DeleteItem(hItem);
		}
	}
}

void CTIKUDlg::OnSelchangedTreeCtrl(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	HTREEITEM hParent=treeCtrl.GetRootItem(); // 获得根节点
	HTREEITEM hItem=treeCtrl.GetSelectedItem(); // 获得当前选择的节点
	if(!hItem)
	{
		return;
	}
	// 以下代码判断当前选择的节点是否试题节点,否则不刷新试题信息
	if(hItem!=hParent) // 判断当前选择的节点是否根节点
	{
		if(treeCtrl.GetParentItem(hItem)!=hParent) // 判断当前选择的节点是否题型节点(根据其父节点是否根结点来判断)
		{
			DataModel *DM=new DataModel();

			if(DM->OpenConnection())
			{
				//MessageBox("连接成功!");
				CString s1="";
				cbKeMu.GetWindowText(s1);
				CString s2=treeCtrl.GetItemText(treeCtrl.GetParentItem(hItem));
				CString tablename=DM->GetReturnString("select cast(tablename as nvarchar(100)) from tixing where cast([name] as nvarchar(100))='"+s2+"'");
				CString query="select id,isnull(cast(subject as nvarchar(100)),'') as subject,isnull(cast(chapter as nvarchar(100)),'') as chapter,'"+s2+"' as tixing,isnull(cast([level] as nvarchar(100)) ,'') as [level],isnull(cast(content as nvarchar(2000)),'') as content,isnull(cast(answer as nvarchar(2000)),'') as answer,isnull(score,0) as score from "+tablename+" where id='"+treeCtrl.GetItemText(hItem)+"' order by id";
				if(tablename=="choose")
				{
					query="select id,isnull(cast(subject as nvarchar(100)),'') as subject,isnull(cast(chapter as nvarchar(100)),'') as chapter,'"+s2+"' as tixing,isnull(cast([level] as nvarchar(100)) ,'') as [level],(isnull(cast(content as nvarchar(2000)),'')+'\n\r [ A ] '+isnull(cast(option1 as nvarchar(500)),'')+'\n\r  [ B ] '+isnull(cast(option2 as nvarchar(500)),'')+'\n\r [ C ] '+isnull(cast(option3 as nvarchar(500)),'')+'\n\r [ D ] '+isnull(cast(option4 as nvarchar(500)),'')) as content,isnull(cast(answer as nvarchar(2000)),'') as answer,isnull(score,0) as score from "+tablename+" where id='"+treeCtrl.GetItemText(hItem)+"' order by id";
				}

⌨️ 快捷键说明

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