
用EnumFontFamiliesEx函数就可以了,示例如下:
LOGFONT lf;ZeroMemory(&lf,sizeof(LOGFONT));
lflfCharSet = DEFAULT_CHARSET;
_tcscpy(lflfFaceName,TEXT(""));
EnumFontFamiliesEx(pDC->GetSafeHdc(),&lf,(FONTENUMPROC)EnumFontFamiliesProc,(LPARAM)this,0);BOOL CALLBACK CFontCombo::EnumFontFamiliesProc(LPENUMLOGFONT lpelf,LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lParam)
{
if(!(nFontType & RASTER_FONTTYPE))
{
// if (lpelf->elfLogFontlfCharSet == ANSI_CHARSET || lpelf->elfLogFontlfCharSet == GB2312_CHARSET)
{
CFontCombo pCombo = (CFontCombo )lParam;
//过滤以@开头的字体,过滤已经添加的字体。
if(lpelf->elfFullName[0] != TEXT('@') && pCombo->FindStringExact(0,(LPCTSTR)lpelf->elfFullName) == LB_ERR)
{
int index = ((CFontCombo )lParam)->AddString((LPCTSTR)lpelf->elfFullName);
LPLOGFONT lpLF = new LOGFONT;
CopyMemory(lpLF,lpelf,sizeof(LOGFONT));
((CFontCombo )lParam)->SetItemData(index,(DWORD)lpLF);
}
}
}
return TRUE;
}
GetCurrentDirectory获取的是当前路径,并不是程序文件本身所在的路径,应用程序的当前路径是可以通过SetCurrentDirectory来改变的,当你调用CFileDialog打开文件以后,这个类就会调用SetCurrentDirectory来修改当前路径,所以你在保存时使用GetCurrentDirectory获取到的肯定是上次打开文件的那个路径,要想不改变当前路径,可以参考楼上兄弟的做法,但不推荐这样做,因为你下次打开文件的时候可能还是希望在上次打开的地方来打开,这本身是一种比较人性化的功能
如果你想获取程序本身所在的路径,可用API函数GetModuleFileName来获取,这个函数获取到的就是应用程序所在的路径,无论你是否确定当前路径是否会被改变,都建议不要用GetCurrentDirectory来获取应用程序的路径,因为不可预知会改变当前路径的因素太多了
要注意区分当前路径和应用程序所在路径,例如,你给程序创建一个快捷方式,快捷方式中的起始位置那一项设置的就是当前路径,与你目标程序的路径可以不一样;同样,在VC编译器里指定的工作路径也是当前路径,这个路径同样可以与你在命令里面设置的路径不一样,都是可以修改的
已经获取了CString类型的文件路径,一般推荐使用CFile或者CStdioFile进行文件 *** 作。
fread也是可以的,打开的文件名参数使用cstringGetBuffer(0)就可以了,不过注意工程最好不要是UNICODE模式,这种模式下fread会有一些麻烦。
快捷方式 属于 平台SDK 中 Windows Shell 的内容。用到了COM。相当麻烦。
我替你查了一下MSDN。
首先因为用到了COM,
你要在你程序启动的时候 调用 CoInitilize(NULL);,在程序退出时调用CoUninitialize();
然后是准备 *** 作,找到你要的快捷方式的路径。用FindFirstFile 和 FindNextFile 找。如果是MFC,可以用CFileFind比较方便。当然,你也可以在代码中给出快捷方式的路径,但这样会使程序不通用。
需要的头文件:<objidlh>
需要链接的IDL文件: <shobjidlidl>
之后是查找快捷方式的目标。MSDN 里有这段代码。就用MS 的吧。是一个函数的代码。我给你粘在这个帖子的最后面。你可以把它拷进你代码里。
最后当然是运行exe 文件了。 用CreateProcess 或 WinExec 都行。
那个函数的代码:
HRESULT ResolveIt(HWND hwnd, LPCSTR lpszLinkFile, LPSTR lpszPath, int iPathBufferSize)
{
HRESULT hres;
IShellLink psl;
char szGotPath[MAX_PATH];
char szDescription[MAX_PATH];
WIN32_FIND_DATA wfd;
lpszPath = 0; // assume failure
// Get a pointer to the IShellLink interface
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID)&psl);
if (SUCCEEDED(hres))
{
IPersistFile ppf;
// Get a pointer to the IPersistFile interface
hres = psl->QueryInterface(IID_IPersistFile, (void)&ppf);
if (SUCCEEDED(hres))
{
WCHAR wsz[MAX_PATH];
// Ensure that the string is Unicode
MultiByteToWideChar(CP_ACP, 0, lpszLinkFile, -1, wsz, MAX_PATH);
// TODO: Check return value from MultiByteWideChar to ensure
success
// Load the shortcut
hres = ppf->Load(wsz, STGM_READ);
if (SUCCEEDED(hres))
{
// Resolve the link
hres = psl->Resolve(hwnd, 0);
if (SUCCEEDED(hres))
{
// Get the path to the link target
hres = psl->GetPath(szGotPath,
MAX_PATH,
(WIN32_FIND_DATA)&wfd,
SLGP_SHORTPATH);
if (SUCCEEDED(hres))
{
// Get the description of the target
hres = psl->GetDescription(szDescription, MAX_PATH);
if (SUCCEEDED(hres))
{
hres = StringCbCopy(lpszPath, iPathBufferSize,
szGotPath);
if (SUCCEEDED(hres))
{
// Handle success
}
else
// application-defined function
HandleErr(hres);
}
}
}
}
// Release the pointer to the IPersistFile interface
ppf->Release();
}
// Release the pointer to the IShellLink interface
psl->Release();
}
return hres;
}
以上就是关于mfc如何获取系统字体文件路径全部的内容,包括:mfc如何获取系统字体文件路径、MFC 保存文件路径问题、在mfc中获取的文件路径是cstring型,想用fread和fopen这样的函数读取文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)