学习历程
一、时间
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. 滑动条
- 开启滑动条
滑动条有水平和垂直两类,在对话框属性界面找到对应水平(Horizontal Scrollbar)和垂直(Vertical Scrollbar)的属性并设置为true,即可打开对话框滑条功能。
- 添加滑动条响应消息
项目——类向导——消息 找到系统消息WM_HSCROLL(水平条)和WM_VSCROLL(垂直条)并添加处理程序
- 处理水平条响应消息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);
}
- 处理垂直条响应消息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