MFC(VC++)学习记录

一、时间

1-1. CTime(秒级)

CTime tm = CTime::GetCurrentTime();
CString DateTime;
datetime = tm.Format("%Y:%m:%d-%H:%M:%S");

(1) MFC日期控件

Date-Time Picker( Control )
日期控件格式化定义

((CDateTimeCtrl *)GetDlgItem(nID1))->SetFormat(_T("yyyy/MM/dd HH:mm:ss"));
((CDateTimeCtrl *)GetDlgItem(nID2))->SetFormat(_T("yyyy/MM/dd HH:mm:ss"));
CTime CurrentTime = CTime::GetCurrentTime();
CTime BeforTime   = CTime::GetCurrentTime() - CTimeSpan(7, 0, 0, 0 );
((CDateTimeCtrl *)GetDlgItem(nID1))->SetTime(&CurrentTime);
((CDateTimeCtrl *)GetDlgItem(nID2))->SetTime(&BeforTime);

1-2. SYSTEMTIME(毫秒级)

SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
CString DateTime;
DateTime.Format(_T("%04u:%02u:%02u-%02u:%02u:%02u::%03u"), sysTime.wYear, sysTime.wMonth, sysTime.wDay,
	sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds);

二、进程路径

获取当前进程路径

CString path; 
GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
path.ReleaseBuffer(); 
int pos = path.ReverseFind('\\');
path = path.Left(pos);

三、MFC 文件相关

3-1. 设置中文环境

char* pOldLocale=_strdup(setlocale(LC_CTYPE,NULL));
setlocale(LC_CTYPE,"chs");
...
setlocale(LC_CTYPE,pOldLocale);
free(pOldLocale);

3-2. 文件是否存在

BOOL rc = PathFileExists(CString sFilePath);
if(rc != 1)
{
	AfxMessageBox(_T("文件不存在!"));
}

3-3. 文件大小

ULONGLONG size;
CFileStatus fileStatus;
if (CFile::GetStatus(CString sFilePath, fileStatus))
{
	size = fileStatus.m_size;
}

3-4. 复制文件

BOOL rc = CopyFile(sFileDBPath, BackupPath, true);
if(rc != 0)
{
	AfxMessageBox(_T("复制失败!"));
}

四、MFC CStdioFile 读写文件

BOOL CStdioFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);

LPCTSTR lpszFileName 文件名称;
UINT nOpenFlags 打开方式标志位,可以指定用“|”连接多个标志位;
CFileException* pError 错误异常处理

nOpenFlags标志
CFile::typeText以文本文件的形式打开文件
CFile::typeBinary以二进制文件的形式打开文件
CFile::modeCreate如果指定文件名的文件不存在,则新建文件;如果文件存在并且没有设置CFile::modeNoTruncate标志,则清空文件。
CFile::modeNoTruncate如果文件存在,不把它的长度删除为0(即不清空文件中的数据)。
CFile::modeRead以只读方式打开文件
CFile::modeReadWrite以可读可写方式打开文件
CFile::modeWrite以只写方式打开文件
CFile::shareDenyNone文件打开后,不禁止其他进程对文件的读写操作
CFile::shareExclusive文件打开后,禁止其他进程对文件的读写操作
CFile::shareDenyRead文件打开后,禁止其他进程对文件的读操作
CFile::shareDenyWrite文件打开后,禁止其他进程对文件的写操作

读写方式:

BOOL CStdioFile::ReadString(CString& rString); 从文件中读取一行,如果文件未读完返回true,否则返回false。

void CStdioFile::WriteString(LPCTSTR lpsz);

换行 ‘\n’

五、MFC List Control 控件

5-1. 控件风格

项目Value
LVS_ICON为每个item显示大图标
LVS_SMALLICON为每个item显示小图标
LVS_LIST显示一列带有小图标的item
LVS_REPORT显示item详细资料
代码设置风格:
LONG lStyle;
lStyle  = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle &= ~LVS_TYPEMASK; //清除风格
lStyle |= LVS_REPORT; //设置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style

5-2. 扩展样式

LVS_EX_扩展样式
LVS_EX_CHECKBOXES您可以获得 ListView_GetCheckState 指定项目的复选框的状态。若要设置检查状态,请使用 ListView_SetCheckState。如果设置了此样式,则当用户单击该复选框,或按空格键在列表视图控件自动切换复选状态。
LVS_EX_FLATSB扁平滚动条
列表视图中的启用平面滚动条。如果您需要更多的控制列表视图滚动条的外观,您应该操作平的滚动栏 Api 使用直接的列表视图滚动条。如果更改系统度量,您负责调整与 FlatSB_SetScrollProp 的滚动栏度量。有关进一步的详细信息请参阅平滚动条。
LVS_EX_FULLROWSELECT选择整行
当选择某个项目时,强调了项目和其所有子项。此样式是仅在 LVS_REPORT 风格结合中可用。
LVS_EX_GRIDLINES绘制表格
显示项及其子项周围的网格线。此样式是仅在 LVS_REPORT 风格结合中可用
LVS_EX_HEADERDRAGDROP报表头可以拖拽
允许拖放的列表视图控件中的列重新排序。此样式是只可用于使用 LVS_REPORT 样式的列表视图控件。
LVS_EX_INFOTIP将提示信息窗口的消息通知父窗口
当列表视图控件使用的 LVS_EX_INFOTIP 样式时,LVN_GETINFOTIP 通知代码发送到父窗口显示工具提示项之前。
LVS_EX_LABELTIP
LVS_EX_MULTIWORKAREAS多工作区
LVS_EX_ONECLICKACTIVATE单击激活
LVS_EX_REGIONAL
LVS_EX_SUBITEMIMAGES子项目图标列表
LVS_EX_TRACKSELECT自动换行
LVS_EX_TWOCLICKACTIVATE双击激活
LVS_EX_UNDERLINECOLD
LVS_EX_UNDERLINEHOT

代码设置扩展:

DWORD dwStyle = m_list.GetExtendedStyle();//获取当前窗口扩展样式
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //设置扩展风格

5-3. 使用心得

插入列

m_list.InsertColumn( 0, "value", LVCFMT_LEFT, 40 );//序列-数据-属性-列宽

插入行

int nRow = m_list.InsertItem(0, "value");//行号-数据

补充行数据

"创建行后才能使用SetItemText填充数据"
m_list.SetItemText(nRow, index, "value");//行号-列号-数据

获取行数量

int nLine = m_list.GetItemCount();//返回现有行数

获取列数量

int nLine = m_list.GetHeaderCtrl()->GetItemCount();//返回现有列数

获取行号

int m_irow = m_list.GetNextItem(-1,LVIS_SELECTED);//返回选中行号

获取数据

CString Value = m_list.GetItemText(m_irow, m_icloumn);//行-列

删除所有行

m_list.DeleteAllItems();

删除列

m_list.DeleteColumn(index);

避免闪烁

m_list.SetRedraw(FALSE);
...更新内容...
m_list.SetRedraw(TRUE);
m_list.Invalidate();
m_list.UpdateWindow();

5-4. 了解更多

记录一些优质/补充文档参考:

https://blog.csdn.net/highyyy/article/details/5973280

六、MFC对话框

6-1. 创建对话框

CMyDialog* myDlg = new CMyDialog();
if(myDlg->DoModal() == IDOK)
{
	......
}

6-2. 结束对话框

EndDialog(int nResult);//结束对话框并返回 nResult

6-3. 居中窗口

void CenterWindow( CWnd* pAlternateOwner = NULL );
其中参数pAlternateOwner指向所想居中的窗口的指针。
然后利用函数GetSystemMetrics( int nIndex )得到系统当前设置如屏幕分辨率等。
nIndexs= SM_CXSCREEN 时函数返回屏幕的宽度;返回值单位为像素点。
nIndexs= SM_CYSCREEN 时函数返回屏幕的高度;返回值单位为像素点。
函数BOOL GetWindowPlacement(WINDOWPLACEMENT* lpwndpl) 包含了窗口在屏幕上的定位重要信息。参数为一个指向结构体变量WINDOWPLACEMENT的指针(lpwndpl);其中WINDOWPLACEMENT结构变量数据结构具体为:
typedef struct tagWINDOWPLACEMENT { /* wndpl */
UINT length;
UINT flags;
UINT showCmd;
POINT ptMinPosition;
POINT ptMaxPosition;
RECT rcNormalPosition;
} WINDOWPLACEMENT;

参数解析

WINDOWPLACEMENT含义
length指结构变量的长度,单位字节
flags标志值,控制窗口最小化或窗口还原的方法,可以取如下值:
WPF_SETMINPOSITION:指定窗口最小化时的x位置和y位置;
WPF_RESTORETOMAXIMIZED:指定窗口以最大化方式还原,尽管可能窗口并不是在最大化时最小化的。不改变窗口的缺省还原方式。
showCmd指定窗口的当前显示状态。可以取值:
SW_HIDE:隐藏窗口并激活另一窗口;
SW_MINIMIZE:最小化指定窗口并激活系统窗口列表中最顶层窗口;
SW_RESTORE:激活并显示窗口,如果窗口处于最小化或最大化状态,则窗口还原到原始大小和位置;
SW_SHOW:以窗口的当前大小和位置激活并显示窗口;
SW_SHOWMAXIMIZED:以最大化方式激活并显示窗口;
SW_SHOWMINIMIZED:以图标方式激活并显示窗口;
SW_SHOWMINNOACTIVE:以图标方式窗口。 但不改变窗口的活动状态;
SW_SHOWNA:以窗口的当前状态显示窗口;
SW_SHOWNOACTIVATE:以窗口最近一次的大小和位置显示窗口。 但不改变窗口的活 动状态;
SW_SHOWNORMAL:激活并显示窗口。如果窗口被最大化或最小化,则窗口还原到原始大小和位置;
ptMinPosition指定窗口最小化时的左伤角坐标
ptMaxPosition指定窗口最大化时的左伤角坐标
rcNormalPosition指定窗口在还原时的坐标
SetWindowPlacement(WINDOWPLACEMENT* lpwndpl);//设置窗口配置

6-4. 滑动条

  1. 开启滑动条

滑动条有水平和垂直两类,在对话框属性界面找到对应水平(Horizontal Scrollbar)和垂直(Vertical Scrollbar)的属性并设置为true,即可打开对话框滑条功能。

  1. 添加滑动条响应消息

项目——类向导——消息 找到系统消息WM_HSCROLL(水平条)和WM_VSCROLL(垂直条)并添加处理程序

  1. 处理水平条响应消息OnHScroll
void XXXXX::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	SCROLLINFO scrollinfo;//滑动条数据结构体
	//获取当前滑动条状态 SB_HORZ水平条 scrollinfo结构体数据 SIF_ALL所有数据
	GetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);
	switch (nSBCode)
	{
	case SB_LEFT:
		//最左侧
		ScrollWindow((scrollinfo.nPos - scrollinfo.nMin) * 10, 0);//偏置窗口X,Y
		scrollinfo.nPos = scrollinfo.nMin;//设置水平条pos位置
		SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);//映射水平条当前位置变化
		break;
	case SB_RIGHT:
		//最右侧
		ScrollWindow((scrollinfo.nPos - scrollinfo.nMax) * 10, 0);//偏置窗口X,Y
		scrollinfo.nPos = scrollinfo.nMax;//设置水平条pos位置
		SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);//映射水平条当前位置变化
		break;
	case SB_LINELEFT:
		//左滚动
		scrollinfo.nPos -= 1;//设置水平条pos位置
		if (scrollinfo.nPos < scrollinfo.nMin)
		{
			scrollinfo.nPos = scrollinfo.nMin;
			break;
		}
		SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);//映射水平条当前位置变化
		ScrollWindow(10, 0);//偏置窗口X,Y
		break;
	case SB_LINERIGHT:
		//右滚动
		scrollinfo.nPos += 1;//设置水平条pos位置
		if (scrollinfo.nPos > scrollinfo.nMax)
		{
			scrollinfo.nPos = scrollinfo.nMax;
			break;
		}
		SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);//映射水平条当前位置变化
		ScrollWindow(-10, 0);//偏置窗口X,Y
		break;
	case SB_PAGELEFT:
		//左滚动一页
		scrollinfo.nPos -= 5;//设置水平条pos位置
		if (scrollinfo.nPos < scrollinfo.nMin)
		{
			scrollinfo.nPos = scrollinfo.nMin;
			break;
		}
		SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);//映射水平条当前位置变化
		ScrollWindow(-10 * 5, 0);//偏置窗口X,Y
		break;
	case SB_PAGERIGHT:
		//右滚动一页
		scrollinfo.nPos += 5;//设置水平条pos位置
		if (scrollinfo.nPos > scrollinfo.nMax)
		{
			scrollinfo.nPos = scrollinfo.nMax;
			break;
		}
		SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);//映射水平条当前位置变化
		ScrollWindow(10 * 5, 0);//偏置窗口X,Y
		break;
	case SB_THUMBPOSITION:
		//绝对位置滚动
		break;
	case SB_THUMBTRACK:
		//指定位置
		ScrollWindow((scrollinfo.nPos - nPos) * 10, 0);//偏置窗口X,Y
		scrollinfo.nPos = nPos;//设置水平条pos位置
		SetScrollInfo(SB_HORZ, &scrollinfo, SIF_ALL);//映射水平条当前位置变化
		break;
	case SB_ENDSCROLL:
		//结束滚动
		break;
	default:
		break;
	}
	Invalidate();//即时刷新
	CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
  1. 处理垂直条响应消息OnVScroll
void CMapShow::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    SCROLLINFO scrollinfo;//滑动条数据结构体
    //获取当前滑动条状态 SB_VERT垂直条 scrollinfo结构体数据 SIF_ALL所有数据
    GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
	switch (nSBCode)
	{
	case SB_LINEUP:
		scrollinfo.nPos -= 1;//设置垂直条pos位置
		if (scrollinfo.nPos<scrollinfo.nMin)
		{
			scrollinfo.nPos = scrollinfo.nMin;
			break;
		}
		SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);//映射垂直条当前位置变化
		ScrollWindow(0, 10 * -1);//偏置窗口X,Y
		break;  
	case SB_LINEDOWN:
		scrollinfo.nPos += 1;//设置垂直条pos位置
		if (scrollinfo.nPos+scrollinfo.nPage>scrollinfo.nMax)
		{
			scrollinfo.nPos = scrollinfo.nMax;
			break;
		}
		SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);//映射垂直条当前位置变化
		ScrollWindow(0, 10 * 1);//偏置窗口X,Y
		break;
	case SB_PAGEUP:
		scrollinfo.nPos -= 5;//设置垂直条pos位置
		if (scrollinfo.nPos<=scrollinfo.nMin)
		{
			scrollinfo.nPos = scrollinfo.nMin;
			break;
		}
		SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);//映射垂直条当前位置变化
		ScrollWindow(0, 10 * -5);//偏置窗口X,Y
		break;  
	case SB_PAGEDOWN:
		scrollinfo.nPos += 5;//设置垂直条pos位置
		if (scrollinfo.nPos+scrollinfo.nPage>=scrollinfo.nMax)
		{
			scrollinfo.nPos = scrollinfo.nMax;
			break;
		}
		SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);//映射垂直条当前位置变化
		ScrollWindow(0, 10 * 5);//偏置窗口X,Y
		break;
	case SB_ENDSCROLL:
		break;
	case SB_THUMBPOSITION:
		break;
	case SB_THUMBTRACK:
		//指定位置
		ScrollWindow(0, (scrollinfo.nPos - nPos) * 10);//偏置窗口X,Y
		scrollinfo.nPos = nPos;//设置垂直条pos位置
		SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);//映射垂直条当前位置变化
		break;
	default:
		break;
	}
	Invalidate();//即时刷新
	CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}

七、字符

7-1. 字符替换和切割

字符替换

CString.Replace(_T("\n"),_T(""));//左"\n"👈替换👉右""

字符切割

SplitString(CString, char, CStringArray);
"左CString根据char(';' 或 '\r')字符分割成若干份,存储到CString对象数组👉CStringArray"

7-2. 随机数和取整数

随机数

int num = rand()%N;//功能:返回一个不大于N的数

取整数

#include <math.h>
floor(double/float x);//功能:返回一个小于传入参数的最大整数
ceil(double/float x);//功能:返回的是大于传入参数的最小整数

C#学习网站:http://c.biancheng.net/view/2831.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值