728x90
반응형
728x170
▶ FontCharSet.cs
namespace TestProject
{
/// <summary>
/// 폰트 문자 세트
/// </summary>
public enum FontCharSet : byte
{
/// <summary>
/// ANSI_CHARSET
/// </summary>
ANSI_CHARSET = 0,
/// <summary>
/// DEFAULT_CHARSET
/// </summary>
DEFAULT_CHARSET = 1,
/// <summary>
/// SYMBOL_CHARSET
/// </summary>
SYMBOL_CHARSET = 2,
/// <summary>
/// MAC_CHARSET
/// </summary>
MAC_CHARSET = 77,
/// <summary>
/// SHIFTJIS_CHARSET
/// </summary>
SHIFTJIS_CHARSET = 128,
/// <summary>
/// HANGEUL_CHARSET
/// </summary>
HANGEUL_CHARSET = 129,
/// <summary>
/// HANGUL_CHARSET
/// </summary>
HANGUL_CHARSET = 129,
/// <summary>
/// JOHAB_CHARSET
/// </summary>
JOHAB_CHARSET = 130,
/// <summary>
/// GB2312_CHARSET
/// </summary>
GB2312_CHARSET = 134,
/// <summary>
/// CHINESEBIG5_CHARSET
/// </summary>
CHINESEBIG5_CHARSET = 136,
/// <summary>
/// GREEK_CHARSET
/// </summary>
GREEK_CHARSET = 161,
/// <summary>
/// TURKISH_CHARSET
/// </summary>
TURKISH_CHARSET = 162,
/// <summary>
/// VIETNAMESE_CHARSET
/// </summary>
VIETNAMESE_CHARSET = 163,
/// <summary>
/// HEBREW_CHARSET
/// </summary>
HEBREW_CHARSET = 177,
/// <summary>
/// ARABIC_CHARSET
/// </summary>
ARABIC_CHARSET = 178,
/// <summary>
/// BALTIC_CHARSET
/// </summary>
BALTIC_CHARSET = 186,
/// <summary>
/// RUSSIAN_CHARSET
/// </summary>
RUSSIAN_CHARSET = 204,
/// <summary>
/// THAI_CHARSET
/// </summary>
THAI_CHARSET = 222,
/// <summary>
/// EASTEUROPE_CHARSET
/// </summary>
EASTEUROPE_CHARSET = 238,
/// <summary>
/// OEM_CHARSET
/// </summary>
OEM_CHARSET = 255
}
}
728x90
▶ FontClipPrecision.cs
namespace TestProject
{
/// <summary>
/// 폰트 클리핑 정밀도
/// </summary>
public enum FontClipPrecision : byte
{
/// <summary>
/// CLIP_DEFAULT_PRECIS
/// </summary>
CLIP_DEFAULT_PRECIS = 0,
/// <summary>
/// CLIP_CHARACTER_PRECIS
/// </summary>
CLIP_CHARACTER_PRECIS = 1,
/// <summary>
/// CLIP_STROKE_PRECIS
/// </summary>
CLIP_STROKE_PRECIS = 2,
/// <summary>
/// CLIP_MASK
/// </summary>
CLIP_MASK = 0xf,
/// <summary>
/// CLIP_LH_ANGLES
/// </summary>
CLIP_LH_ANGLES = (1 << 4),
/// <summary>
/// CLIP_TT_ALWAYS
/// </summary>
CLIP_TT_ALWAYS = (2 << 4),
/// <summary>
/// CLIP_DFA_DISABLE
/// </summary>
CLIP_DFA_DISABLE = (4 << 4),
/// <summary>
/// CLIP_EMBEDDED
/// </summary>
CLIP_EMBEDDED = (8 << 4)
}
}
반응형
▶ FontPitchAndFamily.cs
using System;
namespace TestProject
{
/// <summary>
/// 폰트 피치 & 패밀리
/// </summary>
[Flags]
public enum FontPitchAndFamily : byte
{
/// <summary>
/// DEFAULT_PITCH
/// </summary>
DEFAULT_PITCH = 0,
/// <summary>
/// FIXED_PITCH
/// </summary>
FIXED_PITCH = 1,
/// <summary>
/// VARIABLE_PITCH
/// </summary>
VARIABLE_PITCH = 2,
/// <summary>
/// FF_DONTCARE
/// </summary>
FF_DONTCARE = (0 << 4),
/// <summary>
/// FF_ROMAN
/// </summary>
FF_ROMAN = (1 << 4),
/// <summary>
/// FF_SWISS
/// </summary>
FF_SWISS = (2 << 4),
/// <summary>
/// FF_MODERN
/// </summary>
FF_MODERN = (3 << 4),
/// <summary>
/// FF_SCRIPT
/// </summary>
FF_SCRIPT = (4 << 4),
/// <summary>
/// FF_DECORATIVE
/// </summary>
FF_DECORATIVE = (5 << 4)
}
}
300x250
▶ FontPrecision.cs
namespace TestProject
{
/// <summary>
/// 폰트 정밀도
/// </summary>
public enum FontPrecision : byte
{
/// <summary>
/// OUT_DEFAULT_PRECIS
/// </summary>
OUT_DEFAULT_PRECIS = 0,
/// <summary>
/// OUT_STRING_PRECIS
/// </summary>
OUT_STRING_PRECIS = 1,
/// <summary>
/// OUT_CHARACTER_PRECIS
/// </summary>
OUT_CHARACTER_PRECIS = 2,
/// <summary>
/// OUT_STROKE_PRECIS
/// </summary>
OUT_STROKE_PRECIS = 3,
/// <summary>
/// OUT_TT_PRECIS
/// </summary>
OUT_TT_PRECIS = 4,
/// <summary>
/// OUT_DEVICE_PRECIS
/// </summary>
OUT_DEVICE_PRECIS = 5,
/// <summary>
/// OUT_RASTER_PRECIS
/// </summary>
OUT_RASTER_PRECIS = 6,
/// <summary>
/// OUT_TT_ONLY_PRECIS
/// </summary>
OUT_TT_ONLY_PRECIS = 7,
/// <summary>
/// OUT_OUTLINE_PRECIS
/// </summary>
OUT_OUTLINE_PRECIS = 8,
/// <summary>
/// OUT_SCREEN_OUTLINE_PRECIS
/// </summary>
OUT_SCREEN_OUTLINE_PRECIS = 9,
/// <summary>
/// OUT_PS_ONLY_PRECIS
/// </summary>
OUT_PS_ONLY_PRECIS = 10
}
}
▶ FontQuality.cs
namespace TestProject
{
/// <summary>
/// 폰트 품질
/// </summary>
public enum FontQuality : byte
{
/// <summary>
/// DEFAULT_QUALITY
/// </summary>
DEFAULT_QUALITY = 0,
/// <summary>
/// DRAFT_QUALITY
/// </summary>
DRAFT_QUALITY = 1,
/// <summary>
/// PROOF_QUALITY
/// </summary>
PROOF_QUALITY = 2,
/// <summary>
/// NONANTIALIASED_QUALITY
/// </summary>
NONANTIALIASED_QUALITY = 3,
/// <summary>
/// ANTIALIASED_QUALITY
/// </summary>
ANTIALIASED_QUALITY = 4,
/// <summary>
/// CLEARTYPE_QUALITY
/// </summary>
CLEARTYPE_QUALITY = 5,
/// <summary>
/// CLEARTYPE_NATURAL_QUALITY
/// </summary>
CLEARTYPE_NATURAL_QUALITY = 6
}
}
▶ FontWeight.cs
namespace TestProject
{
/// <summary>
/// 폰트 가중치
/// </summary>
public enum FontWeight : int
{
/// <summary>
/// DONT_CARE
/// </summary>
DONT_CARE = 0,
/// <summary>
/// THIN
/// </summary>
THIN = 100,
/// <summary>
/// EXTRA_LIGHT
/// </summary>
EXTRA_LIGHT = 200,
/// <summary>
/// LIGHT
/// </summary>
LIGHT = 300,
/// <summary>
/// NORMAL
/// </summary>
NORMAL = 400,
/// <summary>
/// MEDIUM
/// </summary>
MEDIUM = 500,
/// <summary>
/// SEMI_BOLD
/// </summary>
SEMI_BOLD = 600,
/// <summary>
/// BOLD
/// </summary>
BOLD = 700,
/// <summary>
/// EXTRA_BOLD
/// </summary>
EXTRA_BOLD = 800,
/// <summary>
/// HEAVY
/// </summary>
HEAVY = 900
}
}
▶ ENUMLOGFONTEX.cs
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// ENUMLOGFONTEX
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct ENUMLOGFONTEX
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// LOG 폰트
/// </summary>
public LOGFONT LogFont;
/// <summary>
/// 전체 명칭
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string FullName;
/// <summary>
/// 스타일
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string Style;
/// <summary>
/// 스크립트
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string Script;
#endregion
}
}
▶ FONTSIGNATURE.cs
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// FONTSIGNATURE
/// </summary>
public struct FONTSIGNATURE
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// USB
/// </summary>
[MarshalAs(UnmanagedType.ByValArray)]
public int[] USB;
/// <summary>
/// CSB
/// </summary>
[MarshalAs(UnmanagedType.ByValArray)]
public int[] CSB;
#endregion
}
}
▶ LOGFONT.cs
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// LOGFONT
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public struct LOGFONT
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 높이
/// </summary>
public int Height;
/// <summary>
/// 너비
/// </summary>
public int Width;
/// <summary>
/// 이스케이프먼트
/// </summary>
public int Escapement;
/// <summary>
/// 방향
/// </summary>
public int Orientation;
/// <summary>
/// 가중치
/// </summary>
public FontWeight Weight;
/// <summary>
/// 이탤릭체 여부
/// </summary>
[MarshalAs(UnmanagedType.U1)]
public bool Italic;
/// <summary>
/// 밑줄 여부
/// </summary>
[MarshalAs(UnmanagedType.U1)]
public bool Underline;
/// <summary>
/// 스트라이크 아웃 여부
/// </summary>
[MarshalAs(UnmanagedType.U1)]
public bool StrikeOut;
/// <summary>
/// 문자 세트
/// </summary>
public FontCharSet CharSet;
/// <summary>
/// 출력 정밀도
/// </summary>
public FontPrecision OutPrecision;
/// <summary>
/// 클리핑 정밀도
/// </summary>
public FontClipPrecision ClipPrecision;
/// <summary>
/// 품질
/// </summary>
public FontQuality Quality;
/// <summary>
/// 피치 & 패밀리
/// </summary>
public FontPitchAndFamily PitchAndFamily;
/// <summary>
/// 폰트명
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string FaceName;
#endregion
}
}
▶ NEWTEXTMETRIC.cs
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// NEWTEXTMETRIC
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public struct NEWTEXTMETRIC
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
#region Field
/// <summary>
/// 높이
/// </summary>
public int Height;
/// <summary>
/// 상단 높이
/// </summary>
public int Ascent;
/// <summary>
/// 하단 높이
/// </summary>
public int Descent;
/// <summary>
/// 내부 간격
/// </summary>
public int InternalLeading;
/// <summary>
/// 외부 간격
/// </summary>
public int ExternalLeading;
/// <summary>
/// 평균 문자 너비
/// </summary>
public int AverageCharacterWidth;
/// <summary>
/// 최대 문자 너비
/// </summary>
public int MaximumCharacterWidth;
/// <summary>
/// 가중치
/// </summary>
public int Weight;
/// <summary>
/// 오버행
/// </summary>
public int Overhang;
/// <summary>
/// 종횡비 X
/// </summary>
public int AspectX;
/// <summary>
/// 종횡비 Y
/// </summary>
public int AspectY;
/// <summary>
/// 첫번째 문자
/// </summary>
public char FirstCharacter;
/// <summary>
/// 마지막 문자
/// </summary>
public char LastCharacter;
/// <summary>
/// 디폴트 문자
/// </summary>
public char DefaultCharacter;
/// <summary>
/// BREAK 문자
/// </summary>
public char BreakCharacter;
/// <summary>
/// 이탤릭체 여부
/// </summary>
public byte Italic;
/// <summary>
/// 밑줄 여부
/// </summary>
public byte Underlined;
/// <summary>
/// 스트라이크 아웃 여부
/// </summary>
public byte StrikeOut;
/// <summary>
/// 피치 & 패밀리
/// </summary>
public byte PitchAndFamily;
/// <summary>
/// 문자 세트 여부
/// </summary>
public byte CharSet;
/// <summary>
/// 플래그
/// </summary>
public int Flag;
/// <summary>
/// EM 크기
/// </summary>
public int SizeEM;
/// <summary>
/// 셀 높이
/// </summary>
public int CellHeight;
/// <summary>
/// 평균 너비
/// </summary>
public int AverageWidth;
#endregion
}
}
▶ NEWTEXTMETRICEX.cs
namespace TestProject
{
/// <summary>
/// NEWTEXTMETRICEX
/// </summary>
public struct NEWTEXTMETRICEX
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 텍스트 메트릭
/// </summary>
public NEWTEXTMETRIC TextMetric;
/// <summary>
/// 폰트 서명
/// </summary>
public FONTSIGNATURE FontSignature;
#endregion
}
}
▶ FontHelper.cs
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// 폰트 헬퍼
/// </summary>
public class FontHelper
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Delegate
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 폰트 열거하기 대리자 - EnumerateFontDelegate(enumLogFontEx, newTextMetricEx, fontType, longParameter)
/// <summary>
/// 폰트 열거하기 대리자
/// </summary>
/// <param name="enumLogFontEx">ENUMLOGFONTEX</param>
/// <param name="newTextMetricEx">NEWTEXTMETRICEX</param>
/// <param name="fontType">폰트 타입</param>
/// <param name="longParameter">LONG 매개 변수</param>
/// <returns>처리 결과</returns>
public delegate int EnumerateFontDelegate
(
ref ENUMLOGFONTEX enumLogFontEx,
ref NEWTEXTMETRICEX newTextMetricEx,
int fontType,
int longParameter
);
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Import
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 디바이스 컨텍스트 구하기 - GetDC(windowHandle)
/// <summary>
/// 디바이스 컨텍스트 구하기
/// </summary>
/// <param name="windowHandle">윈도우 핸들</param>
/// <returns>디바이스 컨텍스트 핸들</returns>
[DllImport("user32")]
private static extern int GetDC(int windowHandle);
#endregion
#region 디바이스 컨텍스트 해제하기 - ReleaseDC(windowHandle, deviceContextHandle)
/// <summary>
/// 디바이스 컨텍스트 해제하기
/// </summary>
/// <param name="windowHandle">윈도우 핸들</param>
/// <param name="deviceContextHandle">디바이스 컨텍스트 핸들</param>
/// <returns>처리 결과</returns>
[DllImport("user32")]
private static extern int ReleaseDC(int windowHandle, int deviceContextHandle);
#endregion
#region 폰트 패밀리 열거하기 (확장) - EnumFontFamiliesEx(deviceContextHandle, logFontHandle, enumerateFontDelegate, longParameter, flag)
/// <summary>
/// 폰트 패밀리 열거하기 (확장)
/// </summary>
/// <param name="deviceContextHandle">디바이스 컨텍스트 핸들</param>
/// <param name="logFontHandle">LOG 폰트 핸들</param>
/// <param name="enumerateFontDelegate">폰트 열거하기 대리자</param>
/// <param name="longParameter">LONG 매개 변수</param>
/// <param name="flag">플래그</param>
/// <returns>처리 결과</returns>
[DllImport("gdi32", CharSet = CharSet.Auto)]
private static extern int EnumFontFamiliesEx
(
int deviceContextHandle,
[In] IntPtr logFontHandle,
EnumerateFontDelegate enumerateFontDelegate,
IntPtr longParameter,
uint flag
);
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 폰트명 리스트
/// </summary>
private static List<string> _fontNameList = new List<string>();
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Instance
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// RASTER_FONTTYPE
/// </summary>
private const int RASTER_FONTTYPE = 1;
/// <summary>
/// DEVICE_FONTTYPE
/// </summary>
private const int DEVICE_FONTTYPE = 2;
/// <summary>
/// TRUETYPE_FONTTYPE
/// </summary>
private const int TRUETYPE_FONTTYPE = 4;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 폰트명 리스트 구하기 - GetFontNameList(windowHandle, charSet)
/// <summary>
/// 폰트명 리스트 구하기
/// </summary>
/// <param name="windowHandle">윈도우 핸들</param>
/// <param name="charSet">문자 세트</param>
/// <returns>폰트명 리스트</returns>
public static List<string> GetFontNameList(int windowHandle, FontCharSet charSet)
{
LOGFONT logFont = GetLogFont();
IntPtr logFontHandle = Marshal.AllocHGlobal(Marshal.SizeOf(logFont));
Marshal.StructureToPtr(logFont, logFontHandle, true);
_fontNameList.Clear();
try
{
int deviceContextHandle = GetDC(windowHandle);
EnumerateFontDelegate enumerateFontDelegate = new EnumerateFontDelegate(enumerateFont);
int result = EnumFontFamiliesEx
(
deviceContextHandle,
logFontHandle,
enumerateFontDelegate,
(IntPtr)charSet,
0
);
if(ReleaseDC(windowHandle, deviceContextHandle) == -1)
{
return null;
}
if(result == 0)
{
return null;
}
}
catch
{
return null;
}
finally
{
Marshal.DestroyStructure(logFontHandle, typeof(LOGFONT));
}
_fontNameList.Sort();
return _fontNameList;
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Private
#region LOG 폰트 구하기 - GetLogFont()
/// <summary>
/// LOG 폰트 구하기
/// </summary>
/// <returns>LOG 폰트</returns>
private static LOGFONT GetLogFont()
{
LOGFONT logFont = new LOGFONT();
logFont.Height = 0;
logFont.Width = 0;
logFont.Escapement = 0;
logFont.Orientation = 0;
logFont.Weight = 0;
logFont.Italic = false;
logFont.Underline = false;
logFont.StrikeOut = false;
logFont.CharSet = FontCharSet.DEFAULT_CHARSET;
logFont.OutPrecision = 0;
logFont.ClipPrecision = 0;
logFont.Quality = 0;
logFont.PitchAndFamily = FontPitchAndFamily.FF_DONTCARE;
logFont.FaceName = string.Empty;
return logFont;
}
#endregion
#region 폰트 열거하기 - enumerateFont(enumLogFontEx, newTextMetricEx, fontType, longParameter)
/// <summary>
/// 폰트 열거하기
/// </summary>
/// <param name="enumLogFontEx">ENUMLOGFONTEX</param>
/// <param name="newTextMetricEx">NEWTEXTMETRICEX</param>
/// <param name="fontType">폰트 타입</param>
/// <param name="longParameter">LONG 매개 변수</param>
/// <returns>처리 결과</returns>
private static int enumerateFont(ref ENUMLOGFONTEX enumLogFontEx, ref NEWTEXTMETRICEX newTextMetricEx, int fontType, int longParameter)
{
try
{
if(fontType == TRUETYPE_FONTTYPE)
{
if(enumLogFontEx.LogFont.CharSet == (FontCharSet)longParameter)
{
_fontNameList.Add(enumLogFontEx.FullName);
}
}
}
catch(Exception)
{
return 0;
}
return 1;
}
#endregion
}
}
▶ Program.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace TestProject
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
List<string> fontNameList = FontHelper.GetFontNameList
(
(int)Process.GetCurrentProcess().MainWindowHandle,
FontCharSet.HANGEUL_CHARSET
);
foreach(string fontName in fontNameList)
{
Console.WriteLine(fontName);
}
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] 조건부 컴파일 사용하기 (0) | 2022.01.16 |
---|---|
[C#/COMMON] 누겟 패키지 조건부 참조 사용하기 (0) | 2022.01.16 |
[C#/COMMON] 조건부 참조 사용하기 (0) | 2022.01.16 |
[C#/COMMON] 멀티 타겟팅 클래스 라이브러리 만들기 (0) | 2022.01.16 |
[C#/COMMON] 빌드시 누겟 패키지 만들기 (0) | 2022.01.16 |
[C#/COMMON] Marshal 클래스 : AllocHGlobal 정적 메소드를 사용해 네이티브 힙 사용하기 (0) | 2022.01.09 |
[C#/COMMON] 누겟 설치 : System.Memory (0) | 2022.01.09 |
[C#/COMMON] 닷넷 프레임워크 버전 구하기 (0) | 2022.01.09 |
[C#/COMMON] GetSystemMetrics API 함수를 사용해 터치 이용 가능 여부 구하기 (0) | 2022.01.08 |
[C#/COMMON] 누겟 설치 : AudioSwitcher.AudioApi.CoreAudio (0) | 2022.01.08 |
댓글을 달아 주세요