トップページ > 記事閲覧
改行コードを含む文字列の縁付き描画に関して
名前:Ingaan 日時: 2024/06/10 22:00

改行コード"\r\n"を含む文字列を、黒塗りつぶし・白縁で描画したいのですが、次の問題点の正しい解決方法が分かりません。 (1) 改行部分に中点が表示される。 ttps://tadaup.jp/260910bd2.jpg ttps://tadaup.jp/260911b3e.jpg 高さを計算して、制御コードなしの文字列を一行毎に出力する必要があるのでしょうか? (2)毎ループ描画すると偶に塗り潰されないことがある。 ttps://tadaup.jp/26096b110.jpg ttps://tadaup.jp/26096bcef.jpg 描画間隔を緩めると発生しなくなることは確認していますが、何か使い方が間違ってるんでしょうか? 以下、文字列出力部分のソースコードになります。 ===== dxlib_text_writer.h ===== #ifndef DXLIB_TEXT_WRITER_H_ #define DXLIB_TEXT_WRITER_H_ class CDxLibTextWriter { public: CDxLibTextWriter(); ~CDxLibTextWriter(); bool SetFont(const wchar_t* pwzFontFileName, int iFontSize, bool bBold, bool bItalic); void Draw(const wchar_t* pwzText, unsigned long ulTextLength, int iPosX = 0, int iPosY = 0); void SwitchTextColour(); private: int m_iFontHandle = -1; enum Colours : unsigned int { kBlack = 0xff000000, kWhite = 0xffffffff, }; unsigned int m_uiFillColour = Colours::kBlack; unsigned int m_uiOutLineColour = Colours::kWhite; bool DeleteFont(); }; #endif // !DXLIB_TEXT_WRITER_H_ ============================== ===== dxlib_text_writer.cpp ===== #include "dxlib_text_writer.h" #define DX_NON_USING_NAMESPACE_DXLIB #include <DxLib.h> CDxLibTextWriter::CDxLibTextWriter() { } CDxLibTextWriter::~CDxLibTextWriter() { DeleteFont(); } bool CDxLibTextWriter::SetFont(const wchar_t* pwzFontFileName, int iFontSize, bool bBold, bool bItalic) { DeleteFont(); m_iFontHandle = DxLib::CreateFontToHandle ( pwzFontFileName, iFontSize > 0 ? iFontSize : DEFAULT_FONT_SIZE, bBold ? DEFAULT_FONT_THINCK : static_cast<int>(DEFAULT_FONT_THINCK / 2), DX_FONTTYPE_ANTIALIASING_EDGE_4X4, DX_CHARSET_UTF8, DEFAULT_FONT_EDGESIZE, bItalic ? TRUE : FALSE ); return m_iFontHandle != -1; } void CDxLibTextWriter::Draw(const wchar_t* pwzText, unsigned long ulTextLength, int iPosX, int iPosY) { if (m_iFontHandle != -1) { DxLib::DrawNStringToHandle(iPosX, iPosY + 4, pwzText, ulTextLength, m_uiFillColour, m_iFontHandle, m_uiOutLineColour); } } void CDxLibTextWriter::SwitchTextColour() { m_uiFillColour = m_uiFillColour == Colours::kBlack ? Colours::kWhite : Colours::kBlack; m_uiOutLineColour = m_uiOutLineColour == Colours::kBlack ? Colours::kWhite : Colours::kBlack; } bool CDxLibTextWriter::DeleteFont() { if (m_iFontHandle != -1) { int iRet = DxLib::DeleteFontToHandle(m_iFontHandle); if (iRet == -1)return false; m_iFontHandle = -1; } return true; } ============================== 実際には次のように設定しています。 m_DxLibTextWriter.SetFont(L"游明朝 Demibold", 24, true, true); 後は完全に脱線になりますが、DEFAULT_FONT_THINCKのマクロ名は'N'が余計か、名詞化して..._THICKNESSなのかな、という気がしました。 以上、よろしくお願いします。
メンテ

Page: 1 |

Re: 改行コードを含む文字列の縁付き描画に関して ( No.1 )
名前:管理人 日時:2024/06/10 22:22

> (1) 改行部分に中点が表示される。 DXライブラリは printf と同じで \n だけで改行する形となっていますので \r\n を \n のみにしてみてください m(_ _;m > (2)毎ループ描画すると偶に塗り潰されないことがある。 恐らくですが、加算ブレンドの設定がされている状態で描画してしまっているのではないかと思います なので DrawNStringToHandle の前に SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ); という記述を 追加して、ブレンドなし描画の設定を行ってから文字列を描画するようにしてみてください m(_ _)m > 後は完全に脱線になりますが、DEFAULT_FONT_THINCKのマクロ名は'N'が余計か、名詞化して..._THICKNESSなのかな、という気がしました。 ご指摘ありがとうございます SetFontThickness などは Thinck という記述ミスをしていないので、DEFAULT_FONT_THINCK の定義のみ 記述ミスをしていたようです DEFAULT_FONT_THICKNESS に修正しましたので、次のバージョンでは修正された状態となります m(_ _;m
メンテ
Re: 改行コードを含む文字列の縁付き描画に関して ( No.2 )
名前:Ingaan 日時:2024/06/10 23:06

迅速な回答ありがとうございます。 改行の件、\nに変更したところ問題なく表示されました。 > 恐らくですが、加算ブレンドの設定がされている状態で描画してしまっているのではないかと思います 凄い…正にその通りでした。ご指摘の修正にて無事正常に描画できました。重ね重ねありがとうございます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存