如何在.NET WinForm中使用Font Awesome字体图标
思路
- 将fontawesome-webfont.ttf文件添加到项目资源中
- 将字体自动添加到内存中,无需安装字体,易于部署
- 自动绘制字体图标图片
IconHelper
public sealed class IconHelper
{
public static Image GetFontImage(IconType type, Color color, int size)
{
var bmp = new Bitmap(size, size);
var g = Graphics.FromImage(bmp);
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
var ch = char.ConvertFromUtf32((int)type);
var font = GetAdjustedFont(g, ch, size, size, 4, true);
var stringSize = g.MeasureString(ch, font, size);
float w = stringSize.Width;
float h = stringSize.Height;
// center icon
float left = (size - w) / 2;
float top = (size - h) / 2;
// Draw string to screen.
var brush = new SolidBrush(color);
g.DrawString(ch, font, brush, new PointF(left, top));
return bmp;
}
private static Font GetAdjustedFont(Graphics g, string graphicString, int containerWidth, int maxFontSize, int minFontSize, bool smallestOnFail)
{
for (double adjustedSize = maxFontSize; adjustedSize >= minFontSize; adjustedSize = adjustedSize - 0.5)
{
Font testFont = GetIconFont((float)adjustedSize);
// Test the string with the new size
SizeF adjustedSizeNew = g.MeasureString(graphicString, testFont);
if (containerWidth > Convert.ToInt32(adjustedSizeNew.Width))
{
// Fits! return it
return testFont;
}
}
// Could not find a font size
// return min or max or maxFontSize?
return GetIconFont(smallestOnFail ? minFontSize : maxFontSize);
}
private static Font GetIconFont(float size)
{
return new Font(Fonts.Families[0], size, GraphicsUnit.Point);
}
static IconHelper()
{
InitialiseFont();
}
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [System.Runtime.InteropServices.In] ref uint pcFonts);
private static readonly PrivateFontCollection Fonts = new PrivateFontCollection();
private static void InitialiseFont()
{
try
{
unsafe
{
fixed (byte* pFontData = Properties.Resources.fontawesome_webfont)
{
uint dummy = 0;
Fonts.AddMemoryFont((IntPtr)pFontData, Properties.Resources.fontawesome_webfont.Length);
AddFontMemResourceEx((IntPtr)pFontData, (uint)Properties.Resources.fontawesome_webfont.Length, IntPtr.Zero, ref dummy);
}
}
}
catch (Exception)
{
// log?
}
}
}
IconType
图标字体Unicode代码通过http://www.fontawesome.com.cn/faicons/查找
public enum IconType
{
Adjust = 0xf042,
Adn = 0xf170,
AlignCenter = 0xf037,
AlignJustify = 0xf039,
AlignLeft = 0xf036,
AlignRight = 0xf038,
Ambulance = 0xf0f9,
Anchor = 0xf13d,
Android = 0xf17b,
AngleDoubleDown = 0xf103,
AngleDoubleLeft = 0xf100,
AngleDoubleRight = 0xf101,
AngleDoubleUp = 0xf102,
AngleDown = 0xf107,
AngleLeft = 0xf104,
AngleRight = 0xf105,
AngleUp = 0xf106,
Apple = 0xf179,
Archive = 0xf187,
ArrowCircleDown = 0xf0ab,
ArrowCircleLeft = 0xf0a8,
ArrowCircleODown = 0xf01a,
ArrowCircleOLeft = 0xf190,
ArrowCircleORight = 0xf18e,
ArrowCircleOUp = 0xf01b,
ArrowCircleRight = 0xf0a9,
ArrowCircleUp = 0xf0aa,
ArrowDown = 0xf063,
ArrowLeft = 0xf060,
ArrowRight = 0xf061,
ArrowUp = 0xf062,
Arrows = 0xf047,
ArrowsAlt = 0xf0b2,
ArrowsH = 0xf07e,
ArrowsV = 0xf07d,
Asterisk = 0xf069,
Automobile = 0xf1b9,
Backward = 0xf04a,
Ban = 0xf05e,
Bank = 0xf19c,
BarChartO = 0xf080,
Barcode = 0xf02a,
Bars = 0xf0c9,
Beer = 0xf0fc,
Behance = 0xf1b4,
BehanceSquare = 0xf1b5,
Bell = 0xf0f3,
BellO = 0xf0a2,
Bitbucket = 0xf171,
BitbucketSquare = 0xf172,
Bitcoin = 0xf15a,
Bold = 0xf032,
Bolt = 0xf0e7,
Bomb = 0xf1e2,
Book = 0xf02d,
Bookmark = 0xf02e,
BookmarkO = 0xf097,
Briefcase = 0xf0b1,
Btc = 0xf15a,
Bug = 0xf188,
Building = 0xf1ad,
BuildingO = 0xf0f7,
Bullhorn = 0xf0a1,
Bullseye = 0xf140,
Cab = 0xf1ba,
Calendar = 0xf073,
CalendarO = 0xf133,
Calculator = 0xf1ec,
Camera = 0xf030,
CameraRetro = 0xf083,
Car = 0xf1b9,
CaretDown = 0xf0d7,
CaretLeft = 0xf0d9,
CaretRight = 0xf0da,
CaretSquareODown = 0xf150,
CaretSquareOLeft = 0xf191,
CaretSquareORight = 0xf152,
CaretSquareOUp = 0xf151,
CaretUp = 0xf0d8,
Certificate = 0xf0a3,
Chain = 0xf0c1,
ChainBroken = 0xf127,
Check = 0xf00c,
CheckCircle = 0xf058,
CheckCircleO = 0xf05d,
CheckSquare = 0xf14a,
CheckSquareO = 0xf046,
ChevronCircleDown = 0xf13a,
ChevronCircleLeft = 0xf137,
ChevronCircleRight = 0xf138,
ChevronCircleUp = 0xf139,
ChevronDown = 0xf078,
ChevronLeft = 0xf053,
ChevronRight = 0xf054,
ChevronUp = 0xf077,
Child = 0xf1ae,
Circle = 0xf111,
CircleO = 0xf10c,
CircleONotch = 0xf1ce,
CircleThin = 0xf1db,
Clipboard = 0xf0ea,
ClockO = 0xf017,
Cloud = 0xf0c2,
CloudDownload = 0xf0ed,
CloudUpload = 0xf0ee,
Cny = 0xf157,
Code = 0xf121,
CodeFork = 0xf126,
Codepen = 0xf1cb,
Coffee = 0xf0f4,
Cog = 0xf013,
Cogs = 0xf085,
Columns = 0xf0db,
Comment = 0xf075,
CommentO = 0xf0e5,
Comments = 0xf086,
CommentsO = 0xf0e6,
Compass = 0xf14e,
Compress = 0xf066,
Copy = 0xf0c5,
CreditCard = 0xf09d,
Crop = 0xf125,
Crosshairs = 0xf05b,
Css3 = 0xf13c,
Cube = 0xf1b2,
Cubes = 0xf1b3,
Cut = 0xf0c4,
Cutlery = 0xf0f5,
Dashboard = 0xf0e4,
Database = 0xf1c0,
Dedent = 0xf03b,
Delicious = 0xf1a5,
Desktop = 0xf108,
Deviantart = 0xf1bd,
Digg = 0xf1a6,
Dollar = 0xf155,
DotCircleO = 0xf192,
Download = 0xf019,
Dribbble = 0xf17d,
Dropbox = 0xf16b,
Drupal = 0xf1a9,
Edit = 0xf044,
Eject = 0xf052,
EllipsisH = 0xf141,
EllipsisV = 0xf142,
Empire = 0xf1d1,
Envelope = 0xf0e0,
EnvelopeO = 0xf003,
EnvelopeSquare = 0xf199,
Eraser = 0xf12d,
Eur = 0xf153,
Euro = 0xf153,
Exchange = 0xf0ec,
Exclamation = 0xf12a,
ExclamationCircle = 0xf06a,
ExclamationTriangle = 0xf071,
Expand = 0xf065,
ExternalLink = 0xf08e,
ExternalLinkSquare = 0xf14c,
Eye = 0xf06e,
EyeSlash = 0xf070,
Facebook = 0xf09a,
FacebookSquare = 0xf082,
FastBackward = 0xf049,
FastForward = 0xf050,
Fax = 0xf1ac,
Female = 0xf182,
FighterJet = 0xf0fb,
File = 0xf15b,
FileArchiveO = 0xf1c6,
FileAudioO = 0xf1c7,
FileCodeO = 0xf1c9,
FileExcelO = 0xf1c3,
FileImageO = 0xf1c5,
FileMovieO = 0xf1c8,
FileO = 0xf016,
FilePdfO = 0xf1c1,
FilePhotoO = 0xf1c5,
FilePictureO = 0xf1c5,
FilePowerpointO = 0xf1c4,
FileSoundO = 0xf1c7,
FileText = 0xf15c,
FileTextO = 0xf0f6,
FileVideoO = 0xf1c8,
FileWordO = 0xf1c2,
FileZipO = 0xf1c6,
FilesO = 0xf0c5,
Film = 0xf008,
Filter = 0xf0b0,
Fire = 0xf06d,
FireExtinguisher = 0xf134,
Flag = 0xf024,
FlagCheckered = 0xf11e,
FlagO = 0xf11d,
Flash = 0xf0e7,
Flask = 0xf0c3,
Flickr = 0xf16e,
FloppyO = 0xf0c7,
Folder = 0xf07b,
FolderO = 0xf114,
FolderOpen = 0xf07c,
FolderOpenO = 0xf115,
Font = 0xf031,
Forward = 0xf04e,
Foursquare = 0xf180,
FrownO = 0xf119,
Gamepad = 0xf11b,
Gavel = 0xf0e3,
Gbp = 0xf154,
Ge = 0xf1d1,
Gear = 0xf013,
Gears = 0xf085,
Gift = 0xf06b,
Git = 0xf1d3,
GitSquare = 0xf1d2,
Github = 0xf09b,
GithubAlt = 0xf113,
GithubSquare = 0xf092,
Gittip = 0xf184,
Glass = 0xf000,
Globe = 0xf0ac,
Google = 0xf1a0,
GooglePlus = 0xf0d5,
GooglePlusSquare = 0xf0d4,
GraduationCap = 0xf19d,
Group = 0xf0c0,
HSquare = 0xf0fd,
HackerNews = 0xf1d4,
HandODown = 0xf0a7,
HandOLeft = 0xf0a5,
HandORight = 0xf0a4,
HandOUp = 0xf0a6,
HddO = 0xf0a0,
Header = 0xf1dc,
Headphones = 0xf025,
Heart = 0xf004,
HeartO = 0xf08a,
History = 0xf1da,
Home = 0xf015,
HospitalO = 0xf0f8,
HourglassHalf = 0xf252,
HourglassEnd = 0xf253,
Html5 = 0xf13b,
Image = 0xf03e,
Inbox = 0xf01c,
Indent = 0xf03c,
Info = 0xf129,
InfoCircle = 0xf05a,
Inr = 0xf156,
Instagram = 0xf16d,
Institution = 0xf19c,
Italic = 0xf033,
Joomla = 0xf1aa,
Jpy = 0xf157,
Jsfiddle = 0xf1cc,
Key = 0xf084,
KeyboardO = 0xf11c,
Krw = 0xf159,
Language = 0xf1ab,
Laptop = 0xf109,
Leaf = 0xf06c,
Legal = 0xf0e3,
LemonO = 0xf094,
LevelDown = 0xf149,
LevelUp = 0xf148,
LifeBouy = 0xf1cd,
LifeRing = 0xf1cd,
LifeSaver = 0xf1cd,
LightbulbO = 0xf0eb,
LineChart = 0xf201,
Link = 0xf0c1,
Linkedin = 0xf0e1,
LinkedinSquare = 0xf08c,
Linux = 0xf17c,
List = 0xf03a,
ListAlt = 0xf022,
ListOl = 0xf0cb,
ListUl = 0xf0ca,
LocationArrow = 0xf124,
Lock = 0xf023,
LongArrowDown = 0xf175,
LongArrowLeft = 0xf177,
LongArrowRight = 0xf178,
LongArrowUp = 0xf176,
Magic = 0xf0d0,
Magnet = 0xf076,
MailForward = 0xf064,
MailReply = 0xf112,
MailReplyAll = 0xf122,
Male = 0xf183,
MapMarker = 0xf041,
Maxcdn = 0xf136,
Medkit = 0xf0Fa,
MehO = 0xf11a,
Microphone = 0xf130,
MicrophoneSlash = 0xf131,
Minus = 0xf068,
MinusCircle = 0xf056,
MinusSquare = 0xf146,
MinusSquareO = 0xf147,
Mobile = 0xf10b,
MobilePhone = 0xf10b,
Money = 0xf0d6,
MoonO = 0xf186,
MortarBoard = 0xf19d,
Music = 0xf001,
Navicon = 0xf0c9,
Openid = 0xf19b,
Outdent = 0xf03b,
Pagelines = 0xf18c,
PaperPlane = 0xf1d8,
PaperPlaneO = 0xf1d9,
Paperclip = 0xf0c6,
Paragraph = 0xf1dd,
Paste = 0xf0ea,
Pause = 0xf04c,
PauseCircle = 0xf28b,
PauseCircleO = 0xf28c,
Paw = 0xf1b0,
Pencil = 0xf040,
PencilSquare = 0xf14b,
PencilSquareO = 0xf044,
Phone = 0xf095,
PhoneSquare = 0xf098,
Photo = 0xf03e,
PictureO = 0xf03e,
PiedPiper = 0xf1a7,
PiedPiperAlt = 0xf1a8,
PiedPiperSquare = 0xf1a7,
Pinterest = 0xf0d2,
PinterestSquare = 0xf0d3,
Plane = 0xf072,
Play = 0xf04b,
PlayCircle = 0xf144,
PlayCircleO = 0xf01d,
Plus = 0xf067,
PlusCircle = 0xf055,
PlusSquare = 0xf0fe,
PlusSquareO = 0xf196,
PowerOff = 0xf011,
Print = 0xf02f,
PuzzlePiece = 0xf12e,
QQ = 0xf1d6,
Rrcode = 0xf029,
Ruestion = 0xf128,
RuestionCircle = 0xf059,
RuoteLeft = 0xf10d,
RuoteRight = 0xf10e,
Ra = 0xf1d0,
Random = 0xf074,
Rebel = 0xf1d0,
Recycle = 0xf1b8,
Reddit = 0xf1a1,
RedditSquare = 0xf1a2,
Refresh = 0xf021,
Renren = 0xf18b,
Reorder = 0xf0c9,
Repeat = 0xf01e,
Reply = 0xf112,
ReplyAll = 0xf122,
Retweet = 0xf079,
Rmb = 0xf157,
Road = 0xf018,
Rocket = 0xf135,
RotateLeft = 0xf0e2,
RotateRight = 0xf01e,
Rouble = 0xf158,
Rss = 0xf09e,
RssSquare = 0xf143,
Rub = 0xf158,
Ruble = 0xf158,
Rupee = 0xf156,
Save = 0xf0c7,
Scissors = 0xf0c4,
Search = 0xf002,
SearchMinus = 0xf010,
SearchPlus = 0xf00e,
Send = 0xf1d8,
SendO = 0xf1d9,
Share = 0xf064,
ShareAlt = 0xf1e0,
ShareAltSquare = 0xf1e1,
ShareSquare = 0xf14d,
ShareSquareO = 0xf045,
Shield = 0xf132,
ShoppingCart = 0xf07a,
SignIn = 0xf090,
SignOut = 0xf08b,
Signal = 0xf012,
Sitemap = 0xf0e8,
Skype = 0xf17e,
Slack = 0xf198,
Sliders = 0xf1de,
SmileO = 0xf118,
Sort = 0xf0dc,
SortAlphaAsc = 0xf15d,
SortAlphaDesc = 0xf15e,
SortAmountAsc = 0xf160,
SortAmountDesc = 0xf161,
SortAsc = 0xf0de,
SortDesc = 0xf0dd,
SortDown = 0xf0dd,
SortNumericAsc = 0xf162,
SortNumericDesc = 0xf163,
SortUp = 0xf0de,
Soundcloud = 0xf1be,
SpaceShuttle = 0xf197,
Spinner = 0xf110,
Spoon = 0xf1b1,
Spotify = 0xf1bc,
Square = 0xf0c8,
SquareO = 0xf096,
StackExchange = 0xf18d,
StackOverflow = 0xf16c,
Star = 0xf005,
StarHalf = 0xf089,
StarHalfEmpty = 0xf123,
StarHalfFull = 0xf123,
StarHalfO = 0xf123,
StarO = 0xf006,
Steam = 0xf1b6,
SteamSquare = 0xf1b7,
StepBackward = 0xf048,
StepForward = 0xf051,
Stethoscope = 0xf0f1,
Stop = 0xf04d,
StopCircle = 0xf28d,
StopCircleO = 0xf28e,
Strikethrough = 0xf0cc,
Stumbleupon = 0xf1a4,
StumbleuponCircle = 0xf1a3,
Subscript = 0xf12c,
Suitcase = 0xf0f2,
SunO = 0xf185,
Superscript = 0xf12b,
Support = 0xf1cd,
Table = 0xf0ce,
Tablet = 0xf10a,
Tachometer = 0xf0e4,
Tag = 0xf02b,
Tags = 0xf02c,
Tasks = 0xf0ae,
Taxi = 0xf1ba,
TencentWeibo = 0xf1d5,
Terminal = 0xf120,
TextHeight = 0xf034,
TextWidth = 0xf035,
Th = 0xf00a,
ThLarge = 0xf009,
ThList = 0xf00b,
ThumbTack = 0xf08d,
ThumbsDown = 0xf165,
ThumbsODown = 0xf088,
ThumbsOUp = 0xf087,
ThumbsUp = 0xf164,
Ticket = 0xf145,
Times = 0xf00d,
TimesCircle = 0xf057,
TimesCircleO = 0xf05c,
Tint = 0xf043,
ToggleDown = 0xf150,
ToggleLeft = 0xf191,
ToggleRight = 0xf152,
ToggleUp = 0xf151,
TrashO = 0xf014,
Tree = 0xf1bb,
Trello = 0xf181,
Trophy = 0xf091,
Truck = 0xf0d1,
Try = 0xf195,
Tumblr = 0xf173,
TumblrSquare = 0xf174,
TurkishLira = 0xf195,
Twitter = 0xf099,
TwitterSquare = 0xf081,
Umbrella = 0xf0e9,
Underline = 0xf0cd,
Undo = 0xf0e2,
University = 0xf19c,
Unlink = 0xf127,
Unlock = 0xf09c,
UnlockAlt = 0xf13e,
Unsorted = 0xf0dc,
Upload = 0xf093,
Usd = 0xf155,
User = 0xf007,
UserMd = 0xf0f0,
Users = 0xf0c0,
VideoCamera = 0xf03d,
VimeoSquare = 0xf194,
Vine = 0xf1ca,
Vk = 0xf189,
VolumeDown = 0xf027,
VolumeOff = 0xf026,
VolumeUp = 0xf028,
Warning = 0xf071,
Wechat = 0xf1d7,
Weibo = 0xf18a,
Weixin = 0xf1d7,
Wheelchair = 0xf193,
Windows = 0xf17a,
Won = 0xf159,
Wordpress = 0xf19a,
Wrench = 0xf0ad,
Xing = 0xf168,
XingSquare = 0xf169,
Yahoo = 0xf19e,
Yen = 0xf157,
Youtube = 0xf167,
YoutubePlay = 0xf16a,
YoutubeSquare = 0xf166,
}