mfc如何获取系统字体文件路径

mfc如何获取系统字体文件路径,第1张

用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这样的函数读取文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9615239.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存