MFC
#pragma once //能够保证头文件只被编译一次。
全局函数
int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp =0 );
MFC数据类型
1.布尔型BOOL(本质为int型)
typedef int BOOL;//头文件中源码
#define FALSE 0
#define TRUE 1
TRUE本质为符号常量1
FALSE本质为符号常量0
2.字符串型
· | LPCSTR | 指向字符串常量的32位指针。 |
---|---|---|
· | LPSTR | 指向字符串的32位指针。 |
· | LPCTSTR | 指向一个兼容 Unicode 和 DBCS 的字符串的32位指针。 |
· | LPTSTR | 指向一个兼容 Unicode 和 DBCS 的字符串的32位指针。 |
UINT 在Windows 3.0和3.1中表示16位的无符号整数,在Win32中表示32位的无符号整数。
窗口类 CWnd类
成员函数:
CDC* GetDC( );//返回一个CDC类的指针
窗口弹出
在资源视图Dialog右键插入对话框
在插入的对话框界面右键添加类
一个对话框对应一个.cpp文件和一个.h文件
1.在主窗口头文件中声明子窗口类对象
#include "WIN1.h"
#include "WIN2.h"
private:
CWIN1 cw1;
CWIN2 cw2;
//模态弹出
void CDlgTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
cw1.DoModal();
}
//非模态弹出 在oninitdialog()中创建
// TODO: 在此添加额外的初始化代码
cw2.Create(IDD_DIALOG2);
void CDlgTestDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
cw2.ShowWindow(SW_NORMAL);
}
MFC绘图
CDC绘图设备类
在屏幕上书写文字
pDC->TextOut(1,300,L"Hello");
CPen类 钢笔类
CPen pen(PS_DASH,1,RGB(0,0,255));//定义钢笔线型、线宽和颜色
pDC->SelectObject(&pen);
CBrush类 画刷类
CPaintDC dc(this); // 请画家
CBrush brush(RGB(0,255,0)); //创建画刷对象
CBrush* oldBrush= dc.SelectObject(&brush);//将画刷送给画家
dc.Rectangle(100,100,300,300); //画矩形
dc.SelectObject(oldBrush); //要回画刷
brush.DeleteObject(); //销毁画刷
CBitmap类 位图类
基本控件
一、Button控件(按钮)
1.在头文件中创建CButton类对象
CButton m_btn;
2.在实现文件中和对象绑定
DDX_Control(pDX, IDC_BUTTON1, m_btn);
m_btn.MoveWindow(0,0,100,100);
m_btn.SetWindowText(L"button");
3.处理点击按钮事件
void CMFCButtonDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
AfxMessageBox(L"点了按钮");
}
二、EditControl控件(编辑框)
1.在对话框头文件中定义对象
CEdit m_edit;
2.在DoDataExchange函数中绑定消息
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1, m_edit);
3.获取编辑框输入文本信息
char strEdit[256];
m_edit.GetWindowText((LPTSTR)strEdit,256);
AfxMessageBox((LPTSTR)strEdit,MB_ABORTRETRYIGNORE | MB_ICONINFORMATION, 0);
4.设置编辑框内容
m_edit.SetWindowText(_T("hello world"));
5.处理编辑框被修改事件
void CMFCButtonDlg::OnEnChangeEdit1()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
char strEdit[256];
m_edit.GetWindowText((LPTSTR)strEdit,256);
m_btn.SetWindowText((LPTSTR)strEdit);
}
三、Check Box控件(复选框按钮)
1.获取和设置复选框状态
m_check.SetCheck(!m_check.GetCheck());
2.处理复选框被点击事件
void CMFCCheckBoxDlg::OnBnClickedCheck1()
{
// TODO: 在此添加控件通知处理程序代码
int nState= m_check.GetCheck();
CString sState;
sState.Format(L"%d",nState);
m_btn.SetWindowText(sState);
}
四、单选框按钮
成组使用,点击时互斥
void CMFCCheckBoxDlg::OnBnClickedRadio1()
{
// TODO: 在此添加控件通知处理程序代码
m_r1.SetCheck(TRUE);
m_r2.SetCheck(FALSE);
}
void CMFCCheckBoxDlg::OnBnClickedRadio2()
{
// TODO: 在此添加控件通知处理程序代码
m_r1.SetCheck(FALSE);
m_r2.SetCheck(TRUE);
}
Group Box分组框按钮(IDC_STATIC)
提升界面友好性
文本静态框(IDC_STATIC)
都属于CStatic类
图像静态框(IDC_STATIC)
五、ComboBox控件(组合框)
1.添加选项字符串
char szItem[256];
sprintf(szItem,"Item%d",i);
m_simple.AddString((CA2T)szItem);
m_dropdown.AddString((CA2T)szItem);
m_droplist.AddString((CA2T)szItem);
2.清空选项
m_simple.ResetContent();
3.删除选择项
m_simple.DeleteString(m_simple.GetCurSel());
4.设置选择项
m_simple.SetCurSel(99);
5.获取选择项文本内容
CString str;
m_simple.GetLBText(m_simple.GetCurSel(),str);
AfxMessageBox(str);
6.设置和获取附加项数据
m_simple.SetItemData(i,1000+i); //设置附加项数据
DWORD nData= m_simple.GetItemData(m_simple.GetCurSel());//获取选择项附加项数据
CString strData;
strData.Format(CA2T("附加数据:%d"),nData);
AfxMessageBox(strData);
7.处理选择项更改事件
void CMFCComboBoxDlg::OnSelchangeSimple()
{
// TODO: 在此添加控件通知处理程序代码
int nSel= m_simple.GetCurSel();
m_dropdown.SetCurSel(nSel);
m_droplist.SetCurSel(nSel);
}
8.处理选项被修改事件
void CMFCComboBoxDlg::OnEditchangeSimple()
{
// TODO: 在此添加控件通知处理程序代码
AfxMessageBox(_T("内容被修改"));
}
六、Slider Control控件
1.在初始化函数中设置范围
m_slider.SetRange(0, 100);
m_slider.SetPos(50); //设置位置
2.处理滑块拖动事件
void CMFCSlideDlg::OnNMCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
int nPos=m_slider.GetPos();
CString strPos;
strPos.Format(L"滑块位置:%d", nPos);
this->SetWindowText(strPos);
*pResult = 0;
}
七、Progess Control进度条控件
遍历文件类CFileFind
void FindC(CString path){
CString strPath=path;
strPath+="/*.*";
CFileFind find;
BOOL goFind= find.FindFile(strPath);
while(goFind){
goFind=find.FindNextFile();
CString filename= find.GetFileName();
CString filepath= find.GetFilePath();
if (find.IsDirectory()&&!find.IsDots())
{
cout<<"["<<filename<<"]"<<endl;
FindC(filepath);
}else{
cout<<filename<<endl;
}
}
}
八、TabControl控件
1.为控件添加一个类别为Control的变量(这里关联的变量名为m_TabCtrlMain),在头文件里定义。
2.在初始化函数里为选项卡控件添加选项(这里以添加"打怪"和"保护"为例)。
3.接下来我们为"打怪"和"保护"选项关联对应的界面窗口。在资源视图下新建两个对话框。
4.为这两个窗口添加类(对应的类名为CPageBaoHu和CPageDaGuai)。
5.在主对话框头文件包含两个新建类头文件。并添加类成员变量。
6.在cpp文件的初始化函数里写创建窗口的代码:
m_PageBaoHu.Create(CPageBaoHu::IDD);
m_PageDaGuai.Create(CPageDaGuai::IDD);
7.为选项卡控件写个点击事件处理程序,使之点击选项卡后显示相对应的窗口,代码如下:
void CTabControlDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
switch(m_TabCtrlMain.GetCurSel())
{
case 0:
m_PageBaoHu.ShowWindow(SW_SHOW);
m_PageDaGuai.ShowWindow(SW_HIDE);
break;
case 1:
m_PageDaGuai.ShowWindow(SW_SHOW);
m_PageBaoHu.ShowWindow(SW_HIDE);
break;
}
*pResult = 0;
}
8.为创建的窗口指定一个父窗口。
m_PageBaoHu.SetParent(&m_TabCtrlMain);
m_PageDaGuai.SetParent(&m_TabCtrlMain);
九、ListControl控件
风格:
图标 | LVS_ICON |
---|---|
小图标 | LVS_SMALLICON |
列表 | LVS_LIST |
报表 | LVS_REPORT |
//添加列
m_list.InsertColumn(0,"名称",LVCFMT_LEFT,150);
m_list.InsertColumn(1,"修改日期",LVCFMT_LEFT,150);
m_list.InsertColumn(2,"类型",LVCFMT_LEFT,150);
m_list.InsertColumn(3,"大小",LVCFMT_LEFT,150);
m_list.SetExtendedStyle(LVS_EX_GRIDLINES);//添加表格线
//添加选项
m_list.InsertItem(0,"目录",0);
m_list.SetItemText(0,1,"2023.6.2");//添加单元格内容
m_list.SetItemText(0,2,"Dir");
m_list.SetItemText(0,3,"3M");
m_list.InsertItem(1,"文件",0);
m_list.SetItemText(1,1,"2023.6.3");
m_list.SetItemText(1,2,"File");
m_list.SetItemText(1,3,"13K");
十、树控件
1.添加选项
HTREEITEM nRoot= m_tree.InsertItem("达内集团", 0, 0, NULL);
m_tree.InsertItem("中关村", 0, 0, nRoot);
m_tree.InsertItem("洛阳", 0, 0, nRoot);
m_tree.InsertItem("郑州", 0, 0, nRoot);
m_tree.SetItemHeight(50);//设置选择项高度
2.删除选择项
m_tree.DeleteItem(m_tree.GetSelectedItem());
3.获取选择项文本
AfxMessageBox(m_tree.GetItemText(m_tree.GetSelectedItem()));
定时器
1.设置定时器
SetTimer(10000,1000,NULL);
第一个参数为定时期ID;
第二个参数为时间间隔 毫秒
第三个参数为处理函数
2.销毁定时器
KillTimer(10000);
3.处理定时器消息
void CMFCTimerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nIDEvent==10000)
{
CTime now=CTime::GetCurrentTime();
CString str=now.Format(L"%H:%M:%S");
m_lbl.SetWindowText(str);
}
CDialogEx::OnTimer(nIDEvent);
}
线程
//全局变量定义
unsigned int g_flag_threadend=1;//线程循环标志
unsigned int flag_recv=0;//接收线程标识
UINT MyThreadProc_Recv(LPVOID pParam);//线程处理函数
//网络初始化后开启接收线程
Net_Init();
flag_recv=1;
//在OninitDialog中开启线程
CWinThread* pHandleInit= AfxBeginThread(MyThreadProc_Recv,NULL);
if (NULL==pHandleInit)
{
AfxMessageBox(TEXT("无法创建网络数据接收线程!"),MB_OK|MB_ICONERROR);
return FALSE;
}else{
pHandleInit->SetThreadPriority(THREAD_PRIORITY_NORMAL);
pHandleInit->ResumeThread();
}
//线程函数定义
UINT MyThreadProc_Recv(LPVOID pParam){
while(g_flag_threadend){
if (flag_recv)
{
}
Sleep(1);
}
AfxEndThread(101,TRUE);//退出线程
return 0;
}
//在OnClose函数中关闭线程
g_flag_threadend=0;
flag_recv=0;