困っていること
「TImage」コントロールのCanvasに時刻を「TextOut()」で表示後,表示更新のタイミングで「TextOut()」を使用して「" "(半角)を9つ」を描画して時刻表示をクリアしようとしていますが,下記のようになり,すべてクリアされず困っています。「調査して分かったこと」に記載したように解決方法はなんとなくわかったのですが,なぜ「TextOut()で" "(半角)を9つ」を描画する方法だとだめなのかが分かりません。どなたかご教授お願いします。
調査して分かったこと
- 「TextOut()」を使用するのではなく,「TextRect()」を使用し,クリッピング範囲に文字列を出力すれば「" "(半角)を9つ」でも問題なかった(ソースコードのOK1)。
- 「TextOut()」を使用するのではなく,「FillRect()」を使用し,キャンバス上の指定四角形を塗りつぶせば問題なかった(ソースコードのOK2)。
ソース
Unit1.cpp
C++
1//--------------------------------------------------------------------------- 2 3#include <vcl.h> 4#pragma hdrstop 5 6#include "Unit1.h" 7//--------------------------------------------------------------------------- 8#pragma package(smart_init) 9#pragma resource "*.dfm" 10TForm1 *Form1; 11//--------------------------------------------------------------------------- 12__fastcall TForm1::TForm1(TComponent* Owner) 13 : TForm(Owner) 14{ 15} 16//--------------------------------------------------------------------------- 17void __fastcall TForm1::Button1Click(TObject *Sender) 18{ 19// TLogFont logfont; 20 LOGFONT logfont; 21 22 // 文字に依存した操作 23 logfont.lfCharSet = DEFAULT_CHARSET; 24 // 文字のクリッピング 25 logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS; 26 // 文字を出力する角度(角度×10倍) 27 logfont.lfEscapement = 900; 28 // フォント名 29 StrCopy((char *)logfont.lfFaceName, (const char *)"@MS ゴシック"); 30 // 文字の高さ 31 logfont.lfHeight = 16; 32 // イタリック体指定 33 logfont.lfItalic = false; 34 // 文字を出力する際の基準線(lfEscapementと同じ値) 35 logfont.lfOrientation = 900; 36 // 出力の形式 37 logfont.lfOutPrecision = OUT_DEFAULT_PRECIS; 38 // 出力の間隔 39 logfont.lfPitchAndFamily = DEFAULT_PITCH; 40 // 出力の品質 41 logfont.lfQuality = DEFAULT_QUALITY; 42 // 打消し線の指定 43 logfont.lfStrikeOut = false; 44 // 下線の指定 45 logfont.lfUnderline = false; 46 // 文字の太さ 47 logfont.lfWidth = 700; 48 // 文字の幅 49 logfont.lfWidth = 8; 50 51 Image1->Canvas->Font->Handle = CreateFontIndirect(&logfont); 52 Image1->Canvas->TextOut(10, 85, "23:59:59"); 53// UnicodeString str = _T("23:59:59"); 54// Image1->Canvas->TextOut(10, 85, str); 55} 56//--------------------------------------------------------------------------- 57void __fastcall TForm1::Button2Click(TObject *Sender) 58{ 59 // NG 60 Image1->Canvas->TextOutW(10, 85, " "); 61 // お試し 62// UnicodeString str = _T(" "); 63// Image1->Canvas->TextOutW(10, 85, str); 64/* 65 // OK1 66 Image1->Canvas->TextRect(Rect(10, 7, 25, 85), 67 10, 7, 68 " "); 69 70 // OK2 71 Image1->Canvas->FillRect(Rect(10, 7, 25, 85)); 72*/ 73} 74//--------------------------------------------------------------------------- 75
Unit1.h
C++
1//--------------------------------------------------------------------------- 2 3#ifndef Unit1H 4#define Unit1H 5//--------------------------------------------------------------------------- 6#include <System.Classes.hpp> 7#include <Vcl.Controls.hpp> 8#include <Vcl.StdCtrls.hpp> 9#include <Vcl.Forms.hpp> 10#include <Vcl.ExtCtrls.hpp> 11//--------------------------------------------------------------------------- 12class TForm1 : public TForm 13{ 14__published: // IDE で管理されるコンポーネント 15 TImage *Image1; 16 TButton *Button1; 17 TButton *Button2; 18 void __fastcall Button1Click(TObject *Sender); 19 void __fastcall Button2Click(TObject *Sender); 20private: // ユーザー宣言 21public: // ユーザー宣言 22 __fastcall TForm1(TComponent* Owner); 23}; 24//--------------------------------------------------------------------------- 25extern PACKAGE TForm1 *Form1; 26//--------------------------------------------------------------------------- 27#endif
開発環境
OS:Windows64bit
IDE:Embarcadero C++Builder 10.3.3
質問文にある画面イメージですが、もう少し見やすいものは無いでしょうか?
表示されているフォントが「MS ゴシック」なのか判断が付かない為です。
画面イメージの更新ありがとうございます。
フォントの形からすると「@MS ゴシック」ではなく「@MS Pゴシック」っぽいですね。
cx20様,夜遅く回答ありがとうございます。
本当ですか?文字フォントでPがつく字体(プロポーショナルフォント)は等幅フォントではなく,「文字ごとに設定された“幅”に従い、詰めて表示される」から,今回のような事象になるから注意深く,フォント名はチェックしていました。それで「@MS ゴシック」だから問題ないと思っていました。「@MS ゴシック」は縦文字の時は@がつくから問題ないと思っていたのですが,これが間違っているのでしょうか?
フォントの指定は「@MS ゴシック」で合っていると思います。
自分が試したのは VC++ ですが「@MS ゴシック」で固定幅で表示されることを確認しました(回答欄参照)

回答1件
あなたの回答
tips
プレビュー