文章目录
- 核心成员变量
- 常用成员函数
- CWinApp::InitInstance
- CWinApp::ExitInstance
- CWinApp::LoadIcon
- CWinApp::LoadCursor
- CWinApp::PreTranslateMessage
- CWinApp::SetRegistryKey
- CWinApp::GetProfileBinary
- CWinApp::GetProfileInt
- CWinApp::GetProfileString
- CWinApp::WriteProfileBinary
- CWinApp::WriteProfileInt
- CWinApp::WriteProfileString
- 案例,让程序拥有记忆功能
- AfxGetAppName
- AfxGetMainWnd
核心成员变量
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会自动设置主窗口指针
可以在其他任何类里面获取主窗口指针