请教如何将字体信息保存到ini文件,字体信息通过FontDialog1设置

时间:2022-06-02 00:24:25
请教如题,我通过调用FontDialog1设置了字体信息,想将字体的名称、字形、字号信息保存到ini文件中,主要是字形信息无法独立获取,请教如何实现,谢谢!

4 个解决方案

#1


字形是什么?

加粗,斜体,下线线这些属性吗?

if( Font->Style.Contains(fsBold) ) //fsBold 加粗, fsItalic 斜体, fsUnderline下线线
 {
 } 

设置的时候这样

Font->Style = Font->Style << fsBold;

#2


Font->Style 是 TFontStyles 类型,它是 fsBold、fsItalic 等 TFontStyle 类型的一个集合。


void __fastcall TForm1::btn1Click(TObject *Sender)
{
   if (dlgFont1->Execute())
   {
       // enum TFontStyle { fsBold, fsItalic, fsUnderline, fsStrikeOut };
       TFontStyles fss = dlgFont1->Font->Style;

       if (fss.Contains(fsBold))
          Caption = "fsBold";

       if (fss.Contains(fsItalic))
          Caption = Caption + "|fsItalic";

       if (fss.Contains(fsUnderline))
          Caption = Caption + "|fsUnderline";

       if (fss.Contains(fsStrikeOut))
          Caption = Caption + "|fsStrikeOut";
   }
}

#3


这个,逐个保存的话比较的费劲,用序列化的方法比较的好,我记得早期的FontDialog控件有个BUG,就是FontDialog序列化后并不能保存颜色设置,因此我这边给你一个将FontDialog设置信息保存到注册表中并还原回FontDialog中的一套完整方法给你参考:

  #include <Registry.hpp>//读写注册表
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // 将FontDialog控件的字体设置保存到注册表
    if(FontDialog1->Execute()){
      LOGFONT lf;
      TRegistry &regkey = *new TRegistry();
      regkey.RootKey = HKEY_CURRENT_USER; // 定义跟键,如果是“HKEY_CURRENT_USER”可以省略这行
      regkey.OpenKey("Software\\test",true); // 在注册表中新建一个主键,把改变的字体信息存储在主键中
      GetObject(FontDialog1->Font->Handle,sizeof(lf), &lf);
      regkey.WriteBinaryData("font", &lf, sizeof(lf)); // 向注册表中写入字体信息
      regkey.WriteInteger("fontColor",FontDialog1->Font->Color); // 向注册表中写入字体颜色信息
      regkey.CloseKey(); // 关闭该键
      delete &regkey; // 释放资源
      Font = FontDialog1->Font;
      ShowMessage("字体信息保存完毕");
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{ // 读取注册表中的字体设置
  TRegistry &regkey100 = *new TRegistry();
  regkey100.RootKey = HKEY_CURRENT_USER;
  regkey100.OpenKey("Software\\test",false);
    if(regkey100.ValueExists("font")){ // 从注册表取值,用于判断键值是否存在
      LOGFONT lf;
      regkey100.ReadBinaryData("font", &lf, sizeof(lf));
      FontDialog1->Font->Handle = CreateFontIndirect(&lf); // 还原字体设置
    }
    if(regkey100.ValueExists("fontColor"))FontDialog1->Font->Color=regkey100.ReadInteger("fontColor"); // 还原字体颜色设置
  regkey100.CloseKey(); // 关闭该键
  delete &regkey100; // 释放资源
  Font = FontDialog1->Font;
  //Memo1->Font->Assign(FontDialog1->Font);
}

#4


保存到文件的原理是一样的

#1


字形是什么?

加粗,斜体,下线线这些属性吗?

if( Font->Style.Contains(fsBold) ) //fsBold 加粗, fsItalic 斜体, fsUnderline下线线
 {
 } 

设置的时候这样

Font->Style = Font->Style << fsBold;

#2


Font->Style 是 TFontStyles 类型,它是 fsBold、fsItalic 等 TFontStyle 类型的一个集合。


void __fastcall TForm1::btn1Click(TObject *Sender)
{
   if (dlgFont1->Execute())
   {
       // enum TFontStyle { fsBold, fsItalic, fsUnderline, fsStrikeOut };
       TFontStyles fss = dlgFont1->Font->Style;

       if (fss.Contains(fsBold))
          Caption = "fsBold";

       if (fss.Contains(fsItalic))
          Caption = Caption + "|fsItalic";

       if (fss.Contains(fsUnderline))
          Caption = Caption + "|fsUnderline";

       if (fss.Contains(fsStrikeOut))
          Caption = Caption + "|fsStrikeOut";
   }
}

#3


这个,逐个保存的话比较的费劲,用序列化的方法比较的好,我记得早期的FontDialog控件有个BUG,就是FontDialog序列化后并不能保存颜色设置,因此我这边给你一个将FontDialog设置信息保存到注册表中并还原回FontDialog中的一套完整方法给你参考:

  #include <Registry.hpp>//读写注册表
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // 将FontDialog控件的字体设置保存到注册表
    if(FontDialog1->Execute()){
      LOGFONT lf;
      TRegistry &regkey = *new TRegistry();
      regkey.RootKey = HKEY_CURRENT_USER; // 定义跟键,如果是“HKEY_CURRENT_USER”可以省略这行
      regkey.OpenKey("Software\\test",true); // 在注册表中新建一个主键,把改变的字体信息存储在主键中
      GetObject(FontDialog1->Font->Handle,sizeof(lf), &lf);
      regkey.WriteBinaryData("font", &lf, sizeof(lf)); // 向注册表中写入字体信息
      regkey.WriteInteger("fontColor",FontDialog1->Font->Color); // 向注册表中写入字体颜色信息
      regkey.CloseKey(); // 关闭该键
      delete &regkey; // 释放资源
      Font = FontDialog1->Font;
      ShowMessage("字体信息保存完毕");
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{ // 读取注册表中的字体设置
  TRegistry &regkey100 = *new TRegistry();
  regkey100.RootKey = HKEY_CURRENT_USER;
  regkey100.OpenKey("Software\\test",false);
    if(regkey100.ValueExists("font")){ // 从注册表取值,用于判断键值是否存在
      LOGFONT lf;
      regkey100.ReadBinaryData("font", &lf, sizeof(lf));
      FontDialog1->Font->Handle = CreateFontIndirect(&lf); // 还原字体设置
    }
    if(regkey100.ValueExists("fontColor"))FontDialog1->Font->Color=regkey100.ReadInteger("fontColor"); // 还原字体颜色设置
  regkey100.CloseKey(); // 关闭该键
  delete &regkey100; // 释放资源
  Font = FontDialog1->Font;
  //Memo1->Font->Assign(FontDialog1->Font);
}

#4


保存到文件的原理是一样的