// AccessDBDlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "AccessDB.h"
#include "AccessDBDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CAccessDBDlg 对话框
CAccessDBDlg::CAccessDBDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_ACCESSDB_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CAccessDBDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_list);
}
BEGIN_MESSAGE_MAP(CAccessDBDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_Open, &CAccessDBDlg::OnBnClickedBtnOpen)
ON_BN_CLICKED(IDC_BTN_Add, &CAccessDBDlg::OnBnClickedBtnAdd)
ON_NOTIFY(NM_CLICK, IDC_LIST1, &CAccessDBDlg::OnNMClickList1)
ON_BN_CLICKED(IDC_BTN_Del, &CAccessDBDlg::OnBnClickedBtnDel)
ON_BN_CLICKED(IDC_BTN_Change, &CAccessDBDlg::OnBnClickedBtnChange)
ON_BN_CLICKED(IDC_BTN_Search, &CAccessDBDlg::OnBnClickedBtnSearch)
//ON_EN_CHANGE(IDC_EDIT, &CAccessDBDlg::OnEnChangeEdit)
END_MESSAGE_MAP()
// CAccessDBDlg 消息处理程序
BOOL CAccessDBDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
DWORD dwstyle = m_list.GetExtendedStyle();
dwstyle = dwstyle | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
m_list.SetExtendedStyle(dwstyle);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CAccessDBDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CAccessDBDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
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;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CAccessDBDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
//当点击一个条目时,回调用 NM_CLICK
void CAccessDBDlg::OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
NMLISTVIEW* pListView = (NMLISTVIEW*)pNMHDR;
if (pListView->iItem != -1) { //当选中一个条目的值
CString strId = m_list.GetItemText(pListView->iItem, 0); //
CString strName = m_list.GetItemText(pListView->iItem, 1); //
CString strSex = m_list.GetItemText(pListView->iItem, 2); //
CString strAge = m_list.GetItemText(pListView->iItem, 3); //
CString strPhone = m_list.GetItemText(pListView->iItem, 4); //
CString strCountry = m_list.GetItemText(pListView->iItem, 5); //
//显示到文本框
SetDlgItemText(IDC_EDIT_ID, strId);
SetDlgItemText(IDC_EDIT_Name, strName);
SetDlgItemText(IDC_EDIT_Sex, strSex);
SetDlgItemText(IDC_EDIT_Age, strAge);
SetDlgItemText(IDC_EDIT_Phone, strPhone);
SetDlgItemText(IDC_EDIT_Country, strCountry);
}
}
void CAccessDBDlg::DispBySql(CString sql)
{
CRecordset rs(&m_db);
rs.Open(CRecordset::dynaset, sql, CRecordset::none);
short sFieldCount = rs.GetODBCFieldCount(); //获取filed的数量,即有多少列
if (sFieldCount <= 0) {
return;
}
//2、清空列表框中的数据,并重绘
m_list.DeleteAllItems(); //删除所有行
while (m_list.GetHeaderCtrl()->GetItemCount() > 0) {
m_list.DeleteColumn(m_list.GetHeaderCtrl()->GetItemCount() - 1); //删除列表控件原来所有的列
}
m_list.SetRedraw(TRUE);
m_list.Invalidate();
m_list.UpdateWindow();
LV_COLUMN lvcolumn{};
CRect rect{};
m_list.GetClientRect(&rect); //获取列表控件的宽高信息
for (short column = 0; column < sFieldCount; column++) {
CODBCFieldInfo fInfo{};
rs.GetODBCFieldInfo(column, fInfo);
//MessageBox(fInfo.m_strName); //这里获取的就是 第一栏几个标题字符串
lvcolumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
lvcolumn.fmt = LVCFMT_LEFT;
lvcolumn.pszText = fInfo.m_strName.GetBuffer(fInfo.m_strName.GetLength());
fInfo.m_strName.ReleaseBuffer();
lvcolumn.iSubItem = column;
lvcolumn.cx = rect.Width() / sFieldCount;
m_list.InsertColumn(column, &lvcolumn); //插入列表框的头部
}
LV_ITEM lvitem{};
CDBVariant var{};
CString value{};
while (!rs.IsEOF()) {
for (short column{ 0 }; column < sFieldCount; column++)
{
rs.GetFieldValue(column, var); //获取字段的值
switch (var.m_dwType)
{
case DBVT_STRING:
value.Format(_T("%s"), var.m_pstring->GetBuffer(var.m_pstring->GetLength()));
break;
case DBVT_WSTRING:
value.Format(_T("%s"), var.m_pstringW->GetBuffer(var.m_pstringW->GetLength()));
break;
case DBVT_LONG:
value.Format(_T("%ld"), var.m_lVal);
break;
case DBVT_SHORT:
value.Format(_T("%d"), var.m_iVal);
break;
default:
value = _T("");
break;
}
if (column == 0)
{
lvitem.mask = LVIF_TEXT;
lvitem.iItem = m_list.GetItemCount();
lvitem.iSubItem = column;
lvitem.pszText = value.GetBuffer(value.GetLength());
value.ReleaseBuffer();
lvitem.cchTextMax = value.GetLength();
m_list.InsertItem(&lvitem); //添加行数据的第 1 列
}
else
{
lvitem.mask = LVIF_TEXT;
lvitem.iItem = m_list.GetItemCount() - 1; //注意需要 -1
lvitem.iSubItem = column;
lvitem.pszText = value.GetBuffer(value.GetLength());
value.ReleaseBuffer();
lvitem.cchTextMax = value.GetLength();
m_list.SetItem(&lvitem); //添加行数据的第 2~n 列
}
}
rs.MoveNext();
}
}
//打开文件路径按钮
void CAccessDBDlg::OnBnClickedBtnOpen()
{
// TODO: 在此添加控件通知处理程序代码
// 1、打开文件,选择对应的数据库文件
//定义一个过滤器
TCHAR szFilter[] =
_T("所有文件(*.*)|*.*|Acess2003数据库文�
没有合适的资源?快使用搜索试试~ 我知道了~
MFC操作Access数据库源码
共34个文件
h:12个
cpp:6个
vcxproj:2个
需积分: 2 2 下载量 3 浏览量
2024-01-05
14:09:14
上传
评论
收藏 270KB ZIP 举报
温馨提示
MFC绘制界面,连接Acess数据库,实现对数据库的增删改查操作.
资源推荐
资源详情
资源评论
收起资源包目录
MFC2Access.zip (34个子文件)
AccessDB
x64
AccessDB
AccessDB.rc 13KB
AccessDB.vcxproj 10KB
resource.h 1KB
framework.h 2KB
res
AccessDB.rc2 672B
AccessDB.ico 66KB
pch.h 544B
x64
AccessDB
AccessDB.rc 13KB
AccessDB.vcxproj 10KB
resource.h 1KB
framework.h 2KB
res
AccessDB.rc2 672B
AccessDB.ico 66KB
pch.h 544B
x64
AccessDB.vcxproj.user 234B
AccessDBDlg.cpp 18KB
AccessDB.aps 91KB
pch.cpp 158B
AccessDB.h 490B
AccessDBDlg.h 1015B
AccessDB.cpp 3KB
targetver.h 295B
AccessDB.vcxproj.filters 2KB
AccessDB.vcxproj.user 234B
AccessDBDlg.cpp 18KB
AccessDB.aps 91KB
pch.cpp 158B
AccessDB.h 490B
AccessDBDlg.h 1015B
AccessDB.sln 1KB
AccessDB.cpp 3KB
targetver.h 295B
AccessDB.vcxproj.filters 2KB
AccessDB.sln 1KB
共 34 条
- 1
资源评论
yy_xzz
- 粉丝: 1371
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功