📄 font_win32.cpp
字号:
/* $Id: font_win32.cpp,v 1.11 2003/09/19 10:33:02 mbn Exp $
**
** ClanLib Game SDK
** Copyright (C) 2003 The ClanLib Team
** For a total list of contributers see the file CREDITS.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "Display/display_precomp.h"
#include "font_win32.h"
#include "API/Display/Providers/dc_buffer.h"
#include "API/Display/sprite_description.h"
#include "API/Display/pixel_format.h"
/////////////////////////////////////////////////////////////////////////////
// CL_Font_Win32 operations:
void CL_Font_Win32::create_sysfont(
const std::string &font_name,
const std::string &letters,
int font_height,
int font_width,
bool bold,
bool italic,
bool underline,
bool strikeout)
{
// Create the font we need:
HFONT font = CreateFont(
font_height,
font_width,
0,
0,
bold ? FW_BOLD : FW_NORMAL,
italic ? TRUE : FALSE,
underline ? TRUE : FALSE,
strikeout ? TRUE : FALSE,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
FF_DONTCARE,
font_name.c_str());
const int num_chars = letters.length();
int i;
int total_width = 0;
int pos = 0;
HDC screen_dc;
HFONT old_font;
INT widths[256];
// Get the glyph widths:
screen_dc = GetDC(0);
old_font = (HFONT) SelectObject(screen_dc, font);
GetCharWidth32(screen_dc, 0, 255, widths);
SelectObject(screen_dc, old_font);
// Figure out how big our device context has to be:
for (i=0; i<num_chars; i++)
{
total_width += widths[static_cast<unsigned char>(letters[i])];
}
// Create device context, set it up for glyph drawing:
CL_DeviceContextBuffer dc_buffer(screen_dc, total_width, font_height, true);
RECT rc = { 0, 0, total_width, font_height };
SetBkColor(dc_buffer.get_dc(), RGB(0,0,0));
FillRect(dc_buffer.get_dc(), &rc, (HBRUSH) GetStockObject(BLACK_BRUSH));
SetTextColor(dc_buffer.get_dc(), RGB(255,255,255));
SetBkMode(dc_buffer.get_dc(), OPAQUE);
old_font = (HFONT) SelectObject(dc_buffer.get_dc(), font);
// Draw each glyph:
for (i=0; i<num_chars; i++)
{
const unsigned char cur = static_cast<unsigned char>(letters[i]);
TextOut(dc_buffer.get_dc(), pos, 0, (char *)(&cur), 1);
pos += widths[cur];
}
SelectObject(dc_buffer.get_dc(), old_font);
DeleteObject(font);
// Add each glyph as a frame:
CL_SpriteDescription desc;
pos = 0;
for (i=0; i<num_chars; i++)
{
const int character = static_cast<unsigned char>(letters[i]);
desc.add_gridclipped_frames(&dc_buffer, pos, 0, widths[character], font_height, 1, 1);
pos += widths[character];
}
// Set up the actual font data:
create_font(CL_Sprite(desc), letters);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -