MFC笔记

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;
MFC中,OnCtrlColor是一个消息处理函数,用于控制对话框中控件的颜色。当对话框绘制控件时,将调用该函数来获取控件的背景色和文本色。 OnCtrlColor函数的原型如下: HBRUSH OnCtrlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); 其中,pDC是与控件相关联的设备上下文,pWnd是指向控件的指针,nCtlColor是控件的类型。nCtlColor可以是以下之一: - CTLCOLOR_MSGBOX:消息框 - CTLCOLOR_EDIT:编辑框 - CTLCOLOR_LISTBOX:列表框 - CTLCOLOR_BTN:按钮 - CTLCOLOR_DLG:对话框 - CTLCOLOR_SCROLLBAR:滚动条 - CTLCOLOR_STATIC:静态文本 OnCtrlColor的返回值是一个HBRUSH类型的句柄,用于绘制控件的背景。如果返回NULL,则使用系统颜色作为控件的背景。 下面是一个OnCtrlColor函数的例子: ```cpp HBRUSH CMyDlg::OnCtrlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { switch (nCtlColor) { case CTLCOLOR_EDIT: pDC->SetTextColor(RGB(255, 0, 0)); // 设置文本颜色为红色 pDC->SetBkColor(RGB(255, 255, 255)); // 设置背景颜色为白色 return (HBRUSH)GetStockObject(WHITE_BRUSH); // 返回白色画刷 case CTLCOLOR_STATIC: pDC->SetTextColor(RGB(0, 0, 255)); // 设置文本颜色为蓝色 pDC->SetBkMode(TRANSPARENT); // 设置背景为透明 return (HBRUSH)GetStockObject(NULL_BRUSH); // 返回透明画刷 default: return CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); // 调用默认处理函数 } } ``` 这个例子中,当控件类型为编辑框时,设置文本颜色为红色,背景颜色为白色,并返回一个白色画刷;当控件类型为静态文本时,设置文本颜色为蓝色,背景为透明,并返回一个透明画刷;对于其他控件类型,调用默认的处理函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值