การใช้ไฟล์ทรัพยากรกับ PrivateFontCollection

ฉันใช้ PrivateFontCollection ในโปรแกรม c++ โดยมีไฟล์ .ttf ในโฟลเดอร์ "Resource Files" ฉันอยากจะทำอะไรบางอย่างตามนี้:

privateFontCollection.AddFontFile(L"Exo-Regular.ttf");

แต่วิธีเดียวที่ฉันจะทำให้มันใช้งานได้คือเข้าถึงมันผ่านพาธของไฟล์ในเครื่อง เช่นนี้

privateFontCollection.AddFontFile(L"C:\\Users\\maybe\\Desktop\\Exo-Regular.ttf");

person Maybegus    schedule 05.11.2018    source แหล่งที่มา
comment
โปรดทราบว่า GDI+ เลิกใช้แล้วส่วนใหญ่; และมีเพียงไม่กี่คนที่เคยตั้งโปรแกรมไว้ใน C++ ไม่ว่าคุณกำลังทำอะไรอยู่ ฉันพนันได้เลยว่าคุณคงใช้กลุ่มเทคโนโลยีที่ไม่ถูกต้องในการทำสิ่งนั้น   -  person HostileFork says dont trust SE    schedule 06.11.2018


คำตอบ (1)


คุณไม่สามารถทำเช่นนี้ได้ด้วย AddFontFile() วิธีการ; สตริงเส้นทางที่คาดไว้ไม่สามารถแก้ไขลงในทรัพยากรที่ฝังอยู่ในโปรแกรมที่คอมไพล์ของคุณ

คุณจะต้องใช้ AddMemoryFont() แทน ...และส่งตัวชี้ไปยังข้อมูลทรัพยากรที่คุณดึงมาผ่าน API ที่รับรู้ทรัพยากร

มีคำถามจากปี 2013 ที่มีคนทำเช่นนี้ใน C#: "addFontFile from resources" ฉันไม่รู้ว่าคุณใช้คลาสไลบรารีอื่นใด แต่ถ้าคุณเขียนโปรแกรมเป็น Win32 โดยตรง การหาพอยน์เตอร์และขนาดสำหรับฟอนต์ของคุณจะมีลักษณะดังนี้:

HMODULE module = NULL; // search current process, override if needed
HRSRC resource = FindResource(module, L"Exo-Regular.ttf", RT_RCDATA);
if (!resource) {...error handling... }
HGLOBAL handle = LoadResource(module, resource);
if (!handle) {...error handling... }

// "It is not necessary to unlock resources because the system
// automatically deletes them when the process that created
// them terminates."
//
void *memory = LockResource(handle);
DWORD length = SizeofResource(module, resource);

privateFontCollection.AddMemoryFont(memory, length);
person HostileFork says dont trust SE    schedule 06.11.2018