Afx开头的常用函数
AfxBeginThread:对beginthread再此封装
AfxGetApp( ):返回theApp的地址。
AfxGetThread():返回theApp的地址。
AfxGetAppName:返回工程名:theApp.m_pszAppName
AfxGetInstanceHandle:返回WinMain的第一个参数(资源总管)
(WinMain启动后,这个参数的内容会被记录在theApp对象内)
AfxSocketInit:windows加载Socket,在linux不需要。
AfxRichEditInit:初始化高级编辑控件
AfxGetMainWnd:获取主窗口。
AfxMessageBox:重新封装了MessageBox
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)
// 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
}
以下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是一个句柄,表示当前应用程序实例的句柄。在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是一个成员变量,通常在CWinApp类中使用。它用于存储应用程序的命令行参数。
命令行参数是在应用程序启动时传递给应用程序的参数。例如,在命令提示符下运行一个可执行文件时,可以通过命令行参数向该可执行文件传递一些额外的信息。
m_ldcmdline是一个CString类型的变量,用于存储命令行参数的字符串。在CWinApp类的InitInstance()函数中,可以使用AfxGetApp()->m_ldcmdline获取命令行参数。
以下是一个示例:
BOOL CMyApp::InitInstance()
{
// 获取命令行参数
CString strCmdLine = AfxGetApp()->m_ldcmdline;
// 在此处处理命令行参数
return TRUE;
}
在以上示例中,通过AfxGetApp()->m_ldcmdline获取命令行参数,并将其存储在strCmdLine变量中。您可以根据需要在InitInstance()函数中处理命令行参数。
int nCmdShow是一个参数,常用于WinMain函数中的调用CWinApp类的Run函数。它指定了应用程序窗口的初始显示方式。
nCmdShow接受一个整数参数,代表窗口的显示方式。常用的取值有:
例如,在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有三种来源:
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函数时,需要注意以下几点:
示例代码如下:
#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);
}