MFC第十二天 常用的Afx全局函数汇总、CWinApp类方法简介(注册表的读写与窗口位置记录和布局功能)

文章目录

  • 常用的Afx全局函数汇总
  • CWinApp类方法简介
    • CWinApp::方法
      • 1、加载图标
      • 2、配置文件与注册表读写。
        • 写入、读取注册表内的结构体
        • 写入、读取注册表内的指定的整型数值
    • CWinApp类的成员变量简介:
      • HINSTANCE hInstance
      • m_ldcmdline
      • nCmdShow
      • theApp.m_pszAppName
  • 附录

常用的Afx全局函数汇总

Afx开头的常用函数

AfxBeginThread:对beginthread再此封装
AfxGetApp( ):返回theApp的地址。	
AfxGetThread():返回theApp的地址。
AfxGetAppName:返回工程名:theApp.m_pszAppName
AfxGetInstanceHandle:返回WinMain的第一个参数(资源总管)
(WinMain启动后,这个参数的内容会被记录在theApp对象内)
AfxSocketInit:windows加载Socket,在linux不需要。
AfxRichEditInit:初始化高级编辑控件
AfxGetMainWnd:获取主窗口。
AfxMessageBox:重新封装了MessageBox

CWinApp类方法简介

CWinApp::方法

1、加载图标

HICON CWinApp::LoadIcon(   LPCTSTR lpszResourceName ) const; //历史上ID是字符串
HICON CWinApp::LoadIcon(   UINT nIDResource ) const
{ 	return LoadIcon(m_hInstance,MAKEINTRESOURCE(nIDResource ));	 }

CWinApp::LoadIcon内部封装API:LoadIcon(第一个参数代入theApp.m_hInstance,才可以加载资源试图中的图标资源)
CWinApp::LoadStandardIcon内部封装API:LoadIcon
HICON CWinApp::LoadStandardIcon(LPCTSTR lpszIconName) const
{ 	return ::LoadIcon(NULL, lpszIconName); 	}

如果带入NULL,系统内的一些图标可以加载。系统图标其实四种:参见MessageBox
#define IDI_APPLICATION     MAKEINTRESOURCE(32512)
#define IDI_HAND            MAKEINTRESOURCE(32513)
#define IDI_QUESTION        MAKEINTRESOURCE(32514)
#define IDI_EXCLAMATION     MAKEINTRESOURCE(32515)
#define IDI_ASTERISK        MAKEINTRESOURCE(32516)

2、配置文件与注册表读写。

	// Retrieve an integer value from INI file or registry.
	virtual UINT GetProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault);
	// Sets an integer value to INI file or registry.
	virtual BOOL WriteProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue);

	// Retrieve a string value from INI file or registry.
	virtual CString GetProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault = NULL);
	// Sets a string value to INI file or registry.
	virtual BOOL WriteProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue);

	// Retrieve an arbitrary binary value from INI file or registry.
	virtual BOOL GetProfileBinary(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE* ppData, UINT* pBytes);
	// Sets an arbitrary binary value to INI file or registry.
	virtual BOOL WriteProfileBinary(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE pData, UINT nBytes);
写入、读取注册表内的结构体
	CRect rect;
	GetWindowRect(rect);
	theApp.WriteProfileBinary(_T("SETTING"), _T("RECT"), (LPBYTE)&rect,sizeof(rect));
	 //分类名,里面的某个项
LPRECT p = NULL;
	UINT nSize = 0;
	BOOL b= theApp.GetProfileBinary(_T("SETTING"), _T("RECT"), (LPBYTE*)&p, &nSize);
	if (b)
	{
		MoveWindow(p, FALSE);
		delete []p;
	}

当窗体位置发生改变时,进行刷新重绘

void CMainDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	auto pEdit = GetDlgItem(IDC_TEXT);
	if (pEdit)
		pEdit->MoveWindow(0, 0, cx, cy, FALSE); //false 不进行重绘 true进行重绘                              
}

写入、读取注册表内的指定的整型数值

在对话框被摧毁时,将窗口的位置信息以整数形式写入

void CMainDlg::OnDestroy()
{
	CDialogEx::OnDestroy();
	CRect rect;
	GetWindowRect(rect);
	theApp.WriteProfileInt(_T("RECT"), _T("LEFT"), rect.left);
	theApp.WriteProfileInt(_T("RECT"), _T("RIGHT"), rect.right);
	theApp.WriteProfileInt(_T("RECT"), _T("TOP"), rect.top);
	theApp.WriteProfileInt(_T("RECT"), _T("BOTTOM"), rect.bottom);
}

在对话框被创建时,将窗口的位置信息以整数形式读出,如果没有在注册表中找到相应数据,则指定默认值返回。 并将窗口位置进行记录,更新窗体位置。

BOOL CMainDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	CRect rect;
	rect.left = theApp.GetProfileInt(_T("RECT"), _T("LEFT"), 0);
	rect.right = theApp.GetProfileInt(_T("RECT"), _T("RIGHT"),600);
	 //如果该结构找不到项,指定默认值返回。 该值可以是在0到65,535之间的无符号值或在该范围(– 32,768到32,767的有符号值。
	rect.top = theApp.GetProfileInt(_T("RECT"), _T("TOP"), 0);
	rect.bottom = theApp.GetProfileInt(_T("RECT"), _T("BOTTOM"), 800);

	MoveWindow(rect, TRUE);
	GetClientRect(rect);
	GetDlgItem(IDC_TEXT)->MoveWindow(rect, false); 
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

CWinApp类的成员变量简介:

以下3个App成员是来自于WinMain

public:
	HINSTANCE m_hInstance; //AfxGetInstanceHandle()获取的也是这个
	LPTSTR m_lpCmdLine;//类似于main(argv)
	int m_nCmdShow;//参见ShowWindow的参数说明
	LPCTSTR m_pszAppName;// constructor or retreived from AFX_IDS_APP_TITLE.

	// SetRegistryKey() member function.
	LPCTSTR m_pszRegistryKey;//注册表的Key字符串
	如果这个指针是NULL,CWinApp::WriteProfileXX写入到什么地方去呢?
调用API:GetPrivateProfileInt
	
	// Default based on this application's name.
	LPCTSTR m_pszProfileName; //配置文件的xxx.ini的全路径文件名
	// set in constructor to override default
	LPCTSTR m_pszExeName; //来自于GetModuleFileName	 Executable name (no spaces).
修改配置文件名的方法:
	TCHAR s[MAX_PATH];
	GetModuleFileName(m_hInstance, s, MAX_PATH);
	if(m_pszProfileName)
		free(( void*)m_pszProfileName);
	//LPTSTR p = (LPTSTR )malloc(32*sizeof(TCHAR));
	//_tcscpy_s(p,32, _T("D:\\notelx.ini"));
	m_pszProfileName = (LPCTSTR)_tcsdup(_T("D:\\notelx.ini"));

HINSTANCE hInstance


HINSTANCE hInstance是一个句柄,表示当前应用程序实例的句柄。在Windows中,句柄是一个用于标识和访问对象的32位或64位值。
在CWinApp类中,hInstance参数通常用于指定当前应用程序实例的句柄。在MFC框架中,hInstance句柄通常会在InitInstance()函数中被传递到一些函数中,以便进行一些与窗口和资源相关的操作。

例如,可以使用hInstance句柄来加载资源,如图标、位图、字符串等。示例代码如下:

BOOL CMyApp::InitInstance()
{
   // 加载图标资源
   HICON hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);   
   // 加载位图资源
   CBitmap bmp;
   bmp.LoadBitmap(IDB_BITMAP1); 
   // 加载字符串资源
   CString str;
   str.LoadString(IDS_MYSTRING);
   
   return TRUE;
}

在上述代码中,通过AfxGetApp()函数获取CWinApp实例,然后使用hInstance句柄加载资源。


m_ldcmdline

m_ldcmdline是一个成员变量,通常在CWinApp类中使用。它用于存储应用程序的命令行参数。

命令行参数是在应用程序启动时传递给应用程序的参数。例如,在命令提示符下运行一个可执行文件时,可以通过命令行参数向该可执行文件传递一些额外的信息。

m_ldcmdline是一个CString类型的变量,用于存储命令行参数的字符串。在CWinApp类的InitInstance()函数中,可以使用AfxGetApp()->m_ldcmdline获取命令行参数。

以下是一个示例:

BOOL CMyApp::InitInstance()
{
    // 获取命令行参数
    CString strCmdLine = AfxGetApp()->m_ldcmdline;
    // 在此处处理命令行参数
    return TRUE;
}

在以上示例中,通过AfxGetApp()->m_ldcmdline获取命令行参数,并将其存储在strCmdLine变量中。您可以根据需要在InitInstance()函数中处理命令行参数。


nCmdShow

int nCmdShow是一个参数,常用于WinMain函数中的调用CWinApp类的Run函数。它指定了应用程序窗口的初始显示方式。

nCmdShow接受一个整数参数,代表窗口的显示方式。常用的取值有:

  • SW_HIDE(0):隐藏窗口。
  • SW_SHOWNORMAL(1):正常显示窗口,以当前大小和位置显示。
  • SW_SHOWMINIMIZED(2):显示窗口并将其最小化。
  • SW_SHOWMAXIMIZED(3):显示窗口并将其最大化。
  • SW_SHOWNOACTIVATE(4):显示窗口,但不激活。
  • SW_SHOW(5):显示窗口,以当前大小和位置显示。
  • SW_MINIMIZE(6):最小化窗口。
  • SW_SHOWMINNOACTIVE(7):显示窗口并将其最小化,但不激活。
  • SW_SHOWNA(8):显示窗口,以当前大小和位置显示,但不激活。
  • SW_RESTORE(9):恢复窗口,如果最小化或最大化则还原。
  • SW_SHOWDEFAULT(10):根据启动应用程序时指定的显示方式设置窗口的默认显示。

例如,在WinMain函数中,可以使用nCmdShow参数来设置应用程序窗口的初始显示方式:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    CMyApp myApp;
    // 初始化应用程序
    // 运行应用程序,并指定窗口的初始显示方式
    int nRet = myApp.Run();

    return nRet;
}

在以上示例中,nCmdShow作为参数传递给myApp.Run()函数,以控制应用程序窗口的初始显示方式。


theApp.m_pszAppName

theApp.m_pszAppName有三种来源:

a)CWinApp的参数:CApp::CApp():CWinApp(_T("温馨提示"))
b)LoadString(AFX_IDS_APP_TITLE)的结果
c)如果以上都没有,就是执行文件名与m_pszExeName内容相同。
_tcsdup(char *p){
char *p=malloc(strlen(p)+1);
return strcpy(q,p);
}

if (m_pszAppName == NULL)
	{
	if (AfxLoadString(AFX_IDS_APP_TITLE, szTitle) != 0)
		m_pszAppName = _tcsdup(szTitle);    // human readable title
	else
		m_pszAppName = _tcsdup(m_pszExeName);   // same as EXE new
	}

_tcsdup是一个函数,用于将一个以null结尾的字符串复制到新分配的内存块中。

函数原型如下:TCHAR* _tcsdup(const TCHAR* strSource);	  其中,strSource是要复制的字符串。

该函数会在堆上分配与源字符串相同大小的内存,并将源字符串的内容复制到新分配的内存中。它返回一个指向新分配的字符串的指针。如果内存分配失败,则返回NULL。

使用_tcsdup函数时,需要注意以下几点:

  1. 需要包含头文件tchar.h。
  2. 如果使用Unicode字符集编译,_tcsdup会被映射为_wcsdup,用于操作宽字符字符串。如果使用多字节字符集编译,_tcsdup会被映射为_strdup,用于操作多字节字符串。
  3. 返回的字符串指针需要在使用后进行释放,避免内存泄漏。可使用delete或free函数来释放内存。

示例代码如下:

#include 
int main()
{
    const TCHAR* str = _T("Hello, World!");
    TCHAR* duplicate = _tcsdup(str);
    
    if (duplicate != NULL)
    {
        _tprintf(_T("Duplicate string: %s"), duplicate); // 处理复制的字符串
        delete[] duplicate;   // 释放内存
    }
    return 0;
}

以上示例代码演示了使用_tcsdup函数将字符串复制到新分配的内存中,并在使用后释放内存。

附录

注册表简介:

a)系统配置和很多软件的配置数据。
b)比如浏览器的启动主页,比如:windows启动自动加载的软件。
计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
c)注册表内的数据主要分为5大类。
HKEY_CLASSES_ROOT:主要是各种人家的文档关联。
HKEY_CURRENT_USER:当前登录windows的用户配置。
HKEY_LOCAL_MACHINE:所有本机用户的配置。

配置文件有什么用?

a)为了让一个软件通用性更强,让C++代码是通用的里面不放一些具体数据。
b).ini是配置文件,用于存储和读取配置数据。
c)常用的API包括GetPrivateProfileString、GetPrivateProfileInt(在Windows中)

MFC三种MessageBox的调用方法

a)API:四个参数不能少。
b)CWnd::MessageBox:必填参数只有1个。默认标题是AfxGetAppName(),
对象内如果有句柄,消息框就附着在这句柄关联窗口上。
c)AfxMessageBox:必填参数只有1个,默认标题是AfxGetAppName(),无需指定对象,而且还有默认图标。

加载图标和光标:

a)LoadCursor:API第一个参数如果是NULL,就从系统中加载标准光标
b)CWinApp中利用第一个参数分成两个加载方法。CWinApp::LoadCursor和CWinApp::LoadStandardCursor
c)窗口或者按钮的图标设置,只要调用CWnd::SetIcon即可。
d)SetCursor是一个API没有被封装到CWnd类内。必须在MouseMove或者SetCursor时使用。
BOOL CMainDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	if (pWnd->GetDlgCtrlID()==IDC_TEXT)
	{
		//auto hCursor = LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_PENCIL));
		//auto hCursor = LoadCursor(NULL, IDC_HAND); //带入NULL,默认系统光标
		auto hCursor = theApp.LoadCursor(IDC_PENCIL); //MAKEINTRESOURCE(IDC_PENCIL)不需要了,系统内部帮你处理
	//	auto hCursor = theApp.LoadStandardCursor(IDC_HAND); //只能加载系统光标,不能调用整数型的 源码第一个参数为NULL

		SetCursor(hCursor);
		return TRUE;
	}
	return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
}

你可能感兴趣的:(MFC开发,mfc,c++)