プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

MFCでフォントサイズを変更する。

この記事は2019年06月13日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. MFCでフォントサイズを変更する
  3. おわりに

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているMFCでフォントサイズを変更する方法についてです。

目次へ

2. MFCでフォントサイズを変更する

MFCでフォントサイズを変更する方法ですが、以下のような手順になります。

  1. CFontのインスタンス変数を用意します。
  2. コンストラクタでCFontCreatePointFont関数でフォントを生成します。 この関数でフォントサイズとフォント種別を指定します。
  3. OnInitDialog関数で、フォントを変更したいコントロール(実装例ではラベル)にフォントを設定します。
  4. OnDestroy関数でフォントの後始末を行います。

実装例

MFCFontSizeDlg.h
// MFCFontSizeDlg.h : ヘッダー ファイル
//

#pragma once


// CMFCFontSizeDlg ダイアログ
class CMFCFontSizeDlg : public CDialogEx
{
// コンストラクション
public:
    CMFCFontSizeDlg(CWnd* pParent = NULL);  // 標準コンストラクター

// ダイアログ データ
    enum { IDD = IDD_MFCFONTSIZE_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート


// 実装
protected:
    HICON m_hIcon;

    // 生成された、メッセージ割り当て関数
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnDestroy();   // 追加します。

private:
    CFont m_smallFont;          // 追加します。
    CFont m_midiumFont;         // 追加します。
    CFont m_largeFont;          // 追加します。
};
MFCFontSizeDlg.cpp
// MFCFontSizeDlg.cpp : 実装ファイル
//

#include "stdafx.h"
#include "MFCFontSize.h"
#include "MFCFontSizeDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMFCFontSizeDlg ダイアログ



CMFCFontSizeDlg::CMFCFontSizeDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CMFCFontSizeDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

    // フォントを生成します。
    m_smallFont.CreatePointFont(80, _T("MS ゴシック"));
    m_midiumFont.CreatePointFont(160, _T("MS ゴシック"));
    m_largeFont.CreatePointFont(240, _T("MS ゴシック"));
}

void CMFCFontSizeDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMFCFontSizeDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_WM_DESTROY()
END_MESSAGE_MAP()


// CMFCFontSizeDlg メッセージ ハンドラー

BOOL CMFCFontSizeDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
    //  Framework は、この設定を自動的に行います。
    SetIcon(m_hIcon, TRUE);         // 大きいアイコンの設定
    SetIcon(m_hIcon, FALSE);        // 小さいアイコンの設定

    // 各ラベルにフォントを設定します。
    GetDlgItem(IDC_LB_SMALL)->SetFont(&m_smallFont);
    GetDlgItem(IDC_LB_MIDIUM)->SetFont(&m_midiumFont);
    GetDlgItem(IDC_LB_LARGE)->SetFont(&m_largeFont);

    return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

// ダイアログに最小化ボタンを追加する場合、アイコンを描画するための
//  下のコードが必要です。ドキュメント/ビュー モデルを使う MFC アプリケーションの場合、
//  これは、Framework によって自動的に設定されます。

void CMFCFontSizeDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 描画のデバイス コンテキスト

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // クライアントの四角形領域内の中央
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // アイコンの描画
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

// ユーザーが最小化したウィンドウをドラッグしているときに表示するカーソルを取得するために、
//  システムがこの関数を呼び出します。
HCURSOR CMFCFontSizeDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

void CMFCFontSizeDlg::OnDestroy()
{
    CDialogEx::OnDestroy();

    // フォントの後始末を行います。
    m_smallFont.DeleteObject();
    m_midiumFont.DeleteObject();
    m_largeFont.DeleteObject();
}

3. おわりに

各コントロールのフォントサイズは通常フォームに設定されたフォントサイズになります。
個々にフォントサイズを変更するには、各コントロールのプロパティで指定でず、上記のような方法になります。
ちょっとめんどくさいです。

【Tech Stars Agent】

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。

目次へ


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ