[辅助工具] LOGFONT 解放双手式的初始化

包装一下 LOGFONT

想必您已经看到了本文的简述。总的来说灰常简单,把 LOGFONT 整合到一个名字叫 StylerFont 的类里了。技术含量虽然不高,但用起来很方便。以下是一个小示范:

#include "StylerFont.h"
#include <easyx.h> /* 尽管 StylerFont.h 已经包含了 easyx.h */
#include <conio.h>

int main(int argc, char** argv) {
	initgraph(640, 480);

	// 声明一个 StylerFont 对象~
	StylerFont font;

	// 然后就直接很自然的 settextstyle
	settextstyle(font);

	// 接下来的代码随心所欲
	outtextxy(10, 10, L"Hello world!");

	_getch();
	return 0;
}

当然它不止可以这么做。比如:

StylerFont font;
font.setFontHeight(30);

LOGFONT myFont = font;
  • 直接为一个 LOGFONT 或 LOGFONT const* 或 LOGFONT const& 变量赋值。这么做是为了不修改原值。如果想修改原值请看 StylerFont::setValue();
StylerFont font;

LOGFONT myFont = font;
LOGFONT const& fontRef = font;
LOGFONT const* fontPtr = font;
  • 或者,你想反过来:
LOGFONT myLogFont;

StylerFont font = myLogFont;

StylerFont anotherFont;
anotherFont = myLogFont;
  • 提供了一些直接修改的常用值的函数。当然也可以用 StylerFont::setValue(); 修改一些特定值。
StylerFont font;

/* 字体 */
font.setFontFamily(L"Consolas"); 

/* 大小 */
font.setFontHeight(30); 

/* 输出质量 */
font.setFontQuality(PROOF_QUALITY);

/* 粗细 */ 
font.setFontWeight(FW_THIN); 


/* LOGFONT 成员 */
font.setValue().lfItalic = true; 
  • 自带颜色。
StylerFont font;

/* 如果希望它自带颜色就把第一个参数设为 true,否则 false 即可(默认 false) */
/* 第二个参数就是一个正常的 COLORREF */
font.fontColor(true, 0xFF00FF);

/* 随后只需要 settextstyle 就会帮你把颜色一起设置了 */
settextstyle(font);

/* gettextstyle 的时候会顺便 gettextcolor,但不会自行把上面的第一个参数设为 true */
gettextstyle(font);

是不是很方便呢!

源码(不多)

文件:StylerFont.h

#pragma once

#include <easyx.h>

class StylerFont {
public:
	StylerFont();
	StylerFont(LOGFONT const& _right); /* 来自 LOGFONT */
	StylerFont(StylerFont const& _right); /* 复制 */
	StylerFont(wchar_t const* fontFamily, LONG fontHeight, BYTE lfQuality = ANTIALIASED_QUALITY, LONG lfWeight = FW_NORMAL); /* 赋些值 */

	~StylerFont();
private:
	LOGFONT NativeFont;

	bool ConstantFontColor; /* 是否拥有自己的颜色 */
	COLORREF FontColor; /* 如果 ConstantFontColor 为 true, settextstyle() 的时候会顺便设置颜色 */

	void InitNativeFont(); /* 初始化 NativeFont 的值 */
public:
	LOGFONT const* getLogFont() const; /* 获取 LOGFONT const 指针 */
	LOGFONT& setValue(); /* 可修改 LOGFONT 的值 */
	void setLogFont(LOGFONT const& fontToBePassed); /* 复制 LOGFONT */

	operator LOGFONT const&(); /* 允许强制转换:LOGFONT&(StylerFont 对象) */
	operator LOGFONT const*(); /* 允许强制转换:LOGFONT*(StylerFont 对象) */

	friend void settextstyle(StylerFont const& fontToBeSet); /* 重载 settextstyle 以实现单独颜色功能 */
	friend void gettextstyle(StylerFont& fontToBeSet); /* 重载 gettextstyle 以便使用 */

	StylerFont& operator=(LOGFONT const& _right); /* 复制 */
	bool operator==(StylerFont const& _right); /* 对比 */

	/* 修改某单一值 */
	void setFontFamily(wchar_t const* fontFamily); /* 字体 */
	void setFontHeight(LONG fontHeight); /* 大小 */
	void setFontQuality(BYTE lfQuality); /* 输出质量 */
	void setFontWeight(LONG lfWeight); /* 粗细 */
	
	void fontColor(bool constantFontColor, COLORREF fontColor = 0x00000000); /* constantFontColor 为 true 才可以设置 fontColor */
};

文件:StylerFont.cpp

#include "StylerFont.h"

#include <iostream>

StylerFont::StylerFont() : ConstantFontColor(false), FontColor(0x000000f0) {
	this->InitNativeFont();
}

StylerFont::StylerFont(LOGFONT const& _right) : ConstantFontColor(false), FontColor(0x000000f0) {
	memcpy(&(this->NativeFont), &_right, sizeof(LOGFONT));
}

StylerFont::StylerFont(StylerFont const& _right) {
	this->setLogFont(_right.NativeFont);
}

StylerFont::StylerFont(wchar_t const* fontFamily, LONG fontHeight, BYTE lfQuality, LONG lfWeight)
	: ConstantFontColor(false), FontColor(0x000000f0) {
	this->InitNativeFont();
	wcscpy_s(NativeFont.lfFaceName, LF_FACESIZE, fontFamily);
	NativeFont.lfHeight = fontHeight;
	NativeFont.lfQuality = lfQuality;
	NativeFont.lfWeight = lfWeight;
}

StylerFont::~StylerFont() {

}

void StylerFont::InitNativeFont() {
	this->NativeFont = {
		20, 0, 0, 0,
		FW_NORMAL,
		false,
		false,
		false,
		DEFAULT_CHARSET,
		OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,
		ANTIALIASED_QUALITY,
		DEFAULT_PITCH
	};

	wcscpy_s(this->NativeFont.lfFaceName, LF_FACESIZE, L"Microsoft YaHei");

}

LOGFONT const* StylerFont::getLogFont() const {
	return &(this->NativeFont);
}

LOGFONT& StylerFont::setValue() {
	return this->NativeFont;
}

void StylerFont::setLogFont(LOGFONT const& fontToBePassed) {
	wchar_t* tmpFontFamilyString = new wchar_t[LF_FACESIZE];
	wcscpy_s(tmpFontFamilyString, LF_FACESIZE, fontToBePassed.lfFaceName);

	memcpy(&(this->NativeFont), &fontToBePassed, sizeof(LOGFONT));
	wcscpy_s(this->NativeFont.lfFaceName, LF_FACESIZE, tmpFontFamilyString);

	delete[] tmpFontFamilyString;
}

StylerFont::operator LOGFONT const& () {
	return this->NativeFont;
}

StylerFont::operator LOGFONT const* () {
	return &(this->NativeFont);
}

void settextstyle(StylerFont const& fontToBeSet) {
	settextstyle(&(fontToBeSet.NativeFont));
	if (fontToBeSet.ConstantFontColor) {
		settextcolor(fontToBeSet.FontColor);
	}
}

void gettextstyle(StylerFont& fontToBeSet) {
	gettextstyle(&(fontToBeSet.NativeFont));
	fontToBeSet.FontColor = gettextcolor();
}

StylerFont& StylerFont::operator=(LOGFONT const& _right) {
	this->setLogFont(_right);
	return *this;
}

bool StylerFont::operator==(StylerFont const& _right) {
	return !memcmp(&this->NativeFont, &_right, sizeof(LOGFONT));
}

void StylerFont::setFontFamily(wchar_t const* fontFamily) {
	wcscpy_s(this->NativeFont.lfFaceName, LF_FACESIZE, fontFamily);
}

void StylerFont::setFontHeight(LONG fontHeight) {
	this->NativeFont.lfHeight = fontHeight;
}

void StylerFont::setFontQuality(BYTE lfQuality) {
	this->NativeFont.lfQuality = lfQuality;
}

void StylerFont::setFontWeight(LONG lfWeight) {
	this->NativeFont.lfWeight = lfWeight;
}

void StylerFont::fontColor(bool constantFontColor, COLORREF fontColor) {
	this->ConstantFontColor = constantFontColor;
	this->FontColor = fontColor;
}

如果有什么可以添加的函数或者任何用起来没有任何用处的函数都可以在评论区反馈哦!

当前代码最后一次更新日期为 2021 年 5 月 26 日。

添加评论