Bootstrap

windows第七章 MFC类CWinApp介绍

核心成员变量

CWinApp::m_hInstance

标识应用程序的当前实例。

	CString str;
	str.Format(L"当前窗口句柄:%#x", theApp.m_hInstance);
	SetDlgItemText(IDC_EDIT1, str);
	str.Format(L"当前窗口句柄:%#x", AfxGetInstanceHandle());
	SetDlgItemText(IDC_EDIT2, str);

CWinApp::m_lpCmdLine

指向指定应用程序的命令行一个Null终止的字符串。

	str.Format(L"命令行参数:%s", theApp.m_lpCmdLine);
	SetDlgItemText(IDC_EDIT3, str);

CWinApp::m_nCmdShow

指定窗口如何将最初显示

	str.Format(L"CmdShow:%d", theApp.m_nCmdShow);
	SetDlgItemText(IDC_EDIT4, str);

结果显示是10 根据定义
#define SW_SHOWDEFAULT 10
是默认显示

CWinApp::m_pszAppID

应用程序用户模型ID.

CWinApp::m_pszAppName

指定应用程序的名称。

	str.Format(L"当前程序名称%s", theApp.m_pszAppName);
	SetDlgItemText(IDC_EDIT5, str);

CWinApp::m_pszExeName

应用程序的模块名称。

	str.Format(L"当前程序模块名称:%s", theApp.m_pszExeName);
	SetDlgItemText(IDC_EDIT5, str);

显示结果和上面一样,但是m_pszAppName 可以更改

m_pszAppName = L"Hello World";

在这里插入图片描述

CWinApp::m_pszProfileName

应用程序的.INI文件名。

	str.Format(L"INI文件名:%s", theApp.m_pszProfileName);
	SetDlgItemText(IDC_EDIT7, str);

在这里插入图片描述

CWinApp::m_pszRegistryKey

用于确定存储应用程序配置文件设置完整的注册表项

	str.Format(L"注册表:%s", theApp.m_pszRegistryKey);
	SetDlgItemText(IDC_EDIT8, str);

在这里插入图片描述
注册表的是通过

SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

设置的

常用成员函数

CWinApp::InitInstance

执行Windows实例初始化的重写,例如创建windows对象。
第三章介绍过

CWinApp::ExitInstance

清理的重写,当应用程序停止。

CWinApp::LoadIcon

加载一个图标资源。

CWinApp::LoadCursor

加载一种光标资源。

BOOL C核心类Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	switch (nHitTest)
	{
	case HTCLIENT://客户区
	{
		//上面一半鼠标显示十字
		CPoint point;
		GetCursorPos(&point);
		ScreenToClient(&point);
		CRect rect;
		GetClientRect(&rect);
		if (point.y < rect.Height() / 2)
			SetCursor(LoadCursor(NULL, IDC_CROSS));
		else
			SetCursor(LoadCursor(NULL, IDC_HAND));//下面一半鼠标显示手型
		break;
	}
	case HTCAPTION://标题栏
		SetCursor(LoadCursor(NULL, IDC_HELP));
		break;
	default:
		return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
		break;
	}
}

CWinApp::PreTranslateMessage

筛选器消息,并在调度到Windows之前函数 TranslateMessage 和 DispatchMessage。

BOOL C核心类App::PreTranslateMessage(MSG* pMsg)
{
	if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
	{
		return TRUE;// 返回TRUE,不往下传递,按下回车没反应
	}
	return CWinApp::PreTranslateMessage(pMsg);
}

在CWnd里也有这个函数
小案例,实现按钮的上下左右移动

BOOL C核心类Dlg::PreTranslateMessage(MSG* pMsg)
{
	CRect rect;
	CWnd* pWnd = GetDlgItem(IDC_BUTTON1);
	pWnd->GetWindowRect(&rect);
	ScreenToClient(&rect);
	if (pMsg->message == WM_KEYDOWN)
	{
		switch (pMsg->wParam)
		{
		case VK_LEFT:
			rect.MoveToX(rect.left - 10);
			break;
		case VK_RIGHT:
			rect.MoveToX(rect.left + 10);
			break;
		case VK_UP:
			rect.MoveToY(rect.top - 10);
			break;
		case VK_DOWN:
			rect.MoveToY(rect.top + 10);
			break;
		}
		pWnd->MoveWindow(&rect);
	}
	return CDialogEx::PreTranslateMessage(pMsg);
}

CWinApp::SetRegistryKey

在注册表中配置应用程序设置,而不是.INI文件。

CWinApp::GetProfileBinary

从应用程序的.INI文件的项检索二进制数据。

CWinApp::GetProfileInt

从应用程序的.INI文件的项检索整数。

CWinApp::GetProfileString

从应用程序的.INI文件的项检索字符串。

CWinApp::WriteProfileBinary

对项的写入二进制数据在应用程序的.INI文件。

CWinApp::WriteProfileInt

编写每对项的整数在应用程序的.INI文件。

CWinApp::WriteProfileString

写入项的字符串在应用程序的.INI文件。

案例,让程序拥有记忆功能

BOOL C核心类Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标
	CString str;

	//读取注册表
	CRect rect;
	rect.left = AfxGetApp()->GetProfileInt(L"窗口", L"left", 0);
	rect.top = AfxGetApp()->GetProfileInt(L"窗口", L"top", 0);
	rect.right = AfxGetApp()->GetProfileInt(L"窗口", L"right", 0);
	rect.bottom = AfxGetApp()->GetProfileInt(L"窗口", L"bottom", 0);
	MoveWindow(&rect);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void C核心类Dlg::OnClose()
{
	//关闭的时候写入配置信息
	CRect rect;
	GetWindowRect(&rect);
	AfxGetApp()->WriteProfileInt(L"窗口", L"left", rect.left);
	AfxGetApp()->WriteProfileInt(L"窗口", L"top", rect.top);
	AfxGetApp()->WriteProfileInt(L"窗口", L"right", rect.right);
	AfxGetApp()->WriteProfileInt(L"窗口", L"bottom", rect.bottom);
	CDialogEx::OnClose();
}

上述方式是用MFC的方式,配置信息存储到注册表里,但是不方便,可以用win32的方式,把信息存储在当前程序文件夹下
先把App里的SetRegistryKey注释掉
在这里插入图片描述
在Dlg.cpp写如下代码

BOOL C核心类Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	//写入到当前可执行文件所在目录下的ini文件中
	LPWSTR strPath = new WCHAR[MAX_PATH];
	//获取当前可执行文件路径
	GetModuleFileName(NULL, strPath, MAX_PATH);
	CString str = strPath;
	str = str.Left(str.ReverseFind('\\'));
	str += L"\\config.ini";

	//读取注册表
	CRect rect;
	::GetPrivateProfileStruct(L"窗口", L"rect", &rect, sizeof(rect), str);
	MoveWindow(&rect);
	CString title;
	::GetPrivateProfileString(L"窗口", L"title", L"", title.GetBuffer(MAX_PATH), MAX_PATH, str);
	SetWindowText(title);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void C核心类Dlg::OnClose()
{
	//关闭的时候写入配置信息
	CRect rect;
	GetWindowRect(&rect);
	CString title;
	GetDlgItemText(IDC_EDIT1, title);

	//写入到当前可执行文件所在目录下的ini文件中
	LPWSTR strPath = new WCHAR[MAX_PATH];
	//获取当前可执行文件路径
	GetModuleFileName(NULL, strPath, MAX_PATH);
	CString str = strPath;
	str = str.Left(str.ReverseFind('\\'));
	str += L"\\config.ini";

	//写入配置信息
	::WritePrivateProfileStruct(L"窗口", L"rect", &rect, sizeof(rect), str);
	::WritePrivateProfileString(L"窗口", L"title", title, str);
	CDialogEx::OnClose();
}

AfxGetAppName

获取指向包含应用程序名称的字符串。 或者,因此,如果您有指向 CWinApp 对象,请使用 m_pszExeName 保护应用程序名称。

AfxGetMainWnd

获取指向线程的主窗口指针
在建MFC程序的时候,APP会自动设置主窗口指针
在这里插入图片描述
可以在其他任何类里面获取主窗口指针
在这里插入图片描述

;