C言語GUI入門|C言語でGUIを作成する方法

C言語には、計算、条件分岐、繰り返し、文字列処理、ファイル操作など、プログラムを作るための基本的な機能が用意されています。しかし、C言語の標準機能だけでは、Windowsの画面上にウィンドウ、ボタン、入力欄、メニューなどを表示できません。

C言語でGUIアプリを作成するには、Windows APIやGTK 4など、画面を作るための機能を利用する必要があります。

この記事では、C言語の標準機能だけでGUIを作れない理由、GUIライブラリの役割、Windows APIとGTKを利用する方法を解説します。さらに、QtやwxWidgetsなど、ほかのGUIライブラリとの違いも紹介します。

第1章では具体的なプログラムをまだ作成しません。ここでは、それぞれの方法がどのような仕組みでGUIを表示するのかをイメージし、本コンテンツでGTK 4を採用する理由を理解していきましょう。

C言語の標準機能だけではGUIを作れない理由

C言語は、さまざまなコンピューターやオペレーティングシステムで利用できるように設計されたプログラミング言語です。

C言語の規格では、次のような基本機能が定められています。

  • 数値の計算
  • 変数や配列の利用
  • 条件分岐
  • 繰り返し
  • 関数
  • 文字や文字列の処理
  • コンソールへの文字出力
  • キーボードからの文字入力
  • ファイルの読み書き
  • メモリの確保と解放
  • 日付や時刻の処理

これらの機能は、Windows、Linux、macOSなど、異なる環境でも利用できるように考えられています。

一方、ウィンドウの表示方法やボタンの作り方は、オペレーティングシステムによって異なります。

たとえば、WindowsにはWindows独自のウィンドウ管理やメッセージ処理の仕組みがあります。Linuxでは、使用するデスクトップ環境や表示システムによって仕組みが異なります。macOSにも独自のGUI環境があります。

C言語の規格が特定のオペレーティングシステムだけに存在する機能を標準機能として定めてしまうと、ほかの環境で同じプログラムを利用しにくくなります。そのため、C言語の標準機能には、特定の画面環境へ依存するウィンドウやボタンの作成機能が含まれていません。

標準ライブラリでできること

C言語の標準ライブラリを利用すると、コンソール画面へ文字を表示したり、キーボードから入力を受け取ったりできます。

たとえば、次のようなコンソールアプリを作成できます。

  • 入力された数値を計算する
  • 成績の平均値を求める
  • 文字列を検索する
  • ファイルの内容を表示する
  • データを並べ替える
  • 処理結果を文字として表示する

これらのアプリでは、ウィンドウやボタンを自分で作らなくても、コンソール画面を通して結果を確認できます。

標準ライブラリだけではできないこと

C言語の標準ライブラリだけでは、次のようなGUI特有の処理を直接行えません。

  • ウィンドウを作成する
  • ウィンドウの大きさを設定する
  • ボタンを表示する
  • 入力欄を表示する
  • メニューを作成する
  • マウスのクリックを受け取る
  • ウィンドウの閉じる操作を受け取る
  • 画面上に画像やアイコンを表示する
  • ウィジェットを縦横に配置する

これらを実現するには、オペレーティングシステムが提供する機能、またはGUIライブラリを利用します。

図1:C言語の標準機能とGUI機能の関係

この図から分かること

C言語には、計算、条件分岐、文字列処理、ファイル操作など、プログラムの中心となる処理を作るための機能があります。

しかし、ウィンドウやボタンなどを作成する機能はC言語の標準機能に含まれていません。そのため、C言語でGUIアプリを作成するときは、Windows APIやGUIライブラリの機能を組み合わせます。

GUIライブラリを利用しても、C言語の知識が不要になるわけではありません。計算やデータ処理はC言語で作り、画面の作成と操作の受け取りをGUIライブラリに担当してもらいます。

GUIライブラリとは

GUIライブラリとは、ウィンドウ、ボタン、入力欄、メニューなどを作成するための機能をまとめたものです。

ライブラリは、よく使われる処理を再利用できる形で提供する仕組みです。プログラマーは、ライブラリが提供する関数やデータ型を利用してアプリケーションを作成します。

GUIライブラリを使わず、ウィンドウやボタンを表示するための処理をすべて自分で作るのは簡単ではありません。オペレーティングシステムとのやり取り、画面描画、マウス操作、キーボード入力など、多くの仕組みを用意する必要があるからです。

GUIライブラリを利用すると、このような複雑な処理の多くをライブラリに任せられます。

GUIライブラリが担当する主な役割

GUIライブラリには、GUIアプリを作成するためのさまざまな機能が用意されています。

ウィンドウを作成する

GUIアプリの土台となるウィンドウを作成します。

ウィンドウには、次のような情報を設定できます。

  • ウィンドウのタイトル
  • 最初に表示する大きさ
  • 最小サイズ
  • 最大サイズ
  • ウィンドウ内に表示する内容
  • 閉じる操作を行ったときの動作

ウィジェットを作成する

ウィジェットとは、GUI画面を構成する部品です。

代表的なウィジェットには、次のようなものがあります。

  • ラベル
  • ボタン
  • 入力欄
  • チェックボックス
  • メニュー
  • リスト
  • 画像
  • スクロールバー

GUIライブラリを利用すると、これらの部品を必要な数だけ作成し、ウィンドウ内へ配置できます。

ウィジェットを配置する

GUI画面では、ウィジェットの位置や大きさを決める必要があります。

GUIライブラリには、部品を縦方向、横方向、格子状などに配置する機能があります。ウィンドウの大きさが変わったときに、部品の位置や大きさを調整する機能もあります。

ユーザーの操作を受け取る

GUIライブラリは、次のようなユーザー操作を受け取ります。

  • ボタンのクリック
  • キーボードからの入力
  • メニュー項目の選択
  • マウスポインターの移動
  • ウィンドウのサイズ変更
  • ウィンドウを閉じる操作

GUIライブラリは操作が発生したことをプログラムへ伝えます。プログラムは、操作に対応する処理を実行します。

画面を描画する

ウィンドウやボタンを実際に画面へ表示するためには、文字、線、背景、枠などを描画しなければなりません。

GUIライブラリを使えば、一般的なウィジェットの細かな描画処理を自分で作らずに済みます。

オペレーティングシステムとの違いを吸収する

複数のオペレーティングシステムに対応したGUIライブラリでは、Windows、Linux、macOSなどの違いをある程度吸収してくれます。

プログラマーは、GUIライブラリが提供する共通の機能を使ってプログラムを作成します。GUIライブラリは、実行する環境に合わせて、それぞれのオペレーティングシステムとやり取りします。

GUIアプリが画面に表示されるまで

GUIライブラリを利用する場合、C言語のプログラムが直接モニターへウィンドウを描くわけではありません。

大まかには、次のような関係で画面が表示されます。

C言語のプログラム
        ↓
GUIライブラリの機能を呼び出す
        ↓
GUIライブラリがOSの機能を利用する
        ↓
OSが画面へウィンドウや部品を表示する

ライブラリによって内部の仕組みは異なりますが、プログラマーはライブラリが用意した関数を通してGUIを操作します。

Windows APIを利用する方法

WindowsでGUIアプリを作成する代表的な方法の1つが、Windows APIを直接利用する方法です。

Windows APIは、Windowsがアプリケーション向けに提供している機能の集まりです。以前からWin32 APIという名前でも広く知られています。Microsoftは、Windows APIをWindowsデスクトップアプリやサーバーアプリのためのAPIとして公開しています。

Windows APIには、GUIに関する次のような機能があります。

  • ウィンドウを作成する
  • ボタンや入力欄を作成する
  • メニューを作成する
  • ダイアログを表示する
  • マウスやキーボードの操作を受け取る
  • 文字や図形を描画する
  • アイコンやカーソルを扱う
  • ファイル選択画面を表示する
  • Windowsのシステム機能を利用する

Windows APIを使う仕組み

Windows APIを利用する場合、C言語のプログラムからWindowsが提供する関数を直接呼び出します。

Windowsでは、ユーザーの操作やウィンドウの状態変化がメッセージとしてアプリケーションへ送られます。

たとえば、次のような情報がメッセージとして届きます。

  • ウィンドウを作成した
  • ボタンが押された
  • キーが押された
  • マウスが動いた
  • ウィンドウを再描画する必要がある
  • ウィンドウが閉じられようとしている

プログラムは、受け取ったメッセージの種類を調べ、対応する処理を行います。

Windows APIの長所

Windows APIを直接利用する方法には、次のような長所があります。

  • Windowsの機能を直接利用できる
  • Windows固有の機能へ細かくアクセスできる
  • Windows標準のウィンドウや部品を利用できる
  • GUIの内部動作を深く学べる
  • 外部のGUIライブラリを追加しなくても利用できる
  • Windowsとの連携が重要なアプリに向いている

Microsoftの公式資料では、Win32 APIはWindowsやハードウェアへ直接アクセスする必要があるネイティブアプリの基盤として説明されています。

Windows APIの難しいところ

Windows APIでは、ウィンドウを1つ表示するだけでも、Windows特有の仕組みを理解する必要があります。

  • Windows独自のデータ型
  • ウィンドウクラス
  • ウィンドウを作成するための設定
  • メッセージループ
  • メッセージを処理する関数
  • ウィンドウや部品を識別する値
  • Windowsのリソース
  • 文字コードの扱い
  • エラーを確認する方法

また、Windows APIを使って作成したGUI部分は、基本的にWindows向けです。同じソースコードをそのままLinuxやmacOSで利用することはできません。

C言語そのものの初心者がGUIの基本を学ぶ場合、Windows特有の仕組みを最初から数多く覚える必要があるため、難しく感じることがあります。

図2:Windows APIを利用してGUIを作る流れ

この図から分かること

Windows APIを利用する方法では、C言語のプログラムがWindowsの機能を直接呼び出して、ウィンドウやボタンを作成します。

マウスやキーボードからの操作はWindowsが受け取り、メッセージとしてアプリケーションへ伝えます。アプリケーションはメッセージの内容を調べ、クリックやキー入力などに対応する処理を行います。

Windowsの機能を細かく利用できる一方で、Windows固有の仕組みを理解する必要があります。

GTKを利用する方法

GTKは、GUIアプリケーションを作成するためのGUIライブラリです。

公式ドキュメントでは、GTKはGUIを作成するライブラリであり、Windows、macOS、さまざまなUNIX系環境で動作するCベースの仕組みとして説明されています。

GTKには、次のようなGUI部品が用意されています。

  • ウィンドウ
  • ラベル
  • ボタン
  • 入力欄
  • メニュー
  • リスト
  • 画像
  • ダイアログ
  • スクロール領域
  • レイアウト用の部品

本コンテンツでは、GTKの新しい系列であるGTK 4を使用します。

GTKをC言語から利用する仕組み

GTKは、C言語から直接利用できるように設計されています。

C言語のプログラムからGTKが提供する関数を呼び出し、ウィンドウやウィジェットを作成します。

大まかな流れは次のようになります。

C言語のプログラム
        ↓
GTK 4の関数を呼び出す
        ↓
GTK 4が実行環境とやり取りする
        ↓
ウィンドウやウィジェットを表示する

Windows APIを直接利用する場合、Windows独自のウィンドウ管理をプログラムで扱います。GTKを利用する場合は、GTKが提供する共通の機能を通してウィンドウや部品を扱います。

GTKのイベント処理

GTKで作成したGUIアプリも、ユーザーの操作を待ちながら動作します。

GTKは、ボタンのクリックなどのイベントを監視し、発生したイベントをアプリケーションへ伝えます。

たとえば、ボタンがクリックされたときは、次のような流れになります。

  1. ユーザーがボタンをクリックする
  2. オペレーティングシステムが操作を受け取る
  3. GTKがクリックされたことを確認する
  4. GTKが対応する処理を呼び出す
  5. C言語で作成した処理が実行される
  6. 必要に応じて画面が更新される
  7. GTKが次の操作を待つ

GTKでは、ボタンがクリックされた、入力内容が変更されたなどの出来事をシグナルとして扱います。

シグナルが発生したときに呼び出す関数を登録しておくことで、ユーザーの操作に対応できます。このような関数はコールバック関数と呼ばれます。

GTKの長所

GTKには、次のような長所があります。

  • C言語から利用できる
  • ウィンドウやボタンなどの部品が用意されている
  • レイアウト機能を利用できる
  • イベント処理の仕組みが用意されている
  • Windows以外の環境にも対応している
  • GTK CSSを使って画面の見た目を調整できる
  • GCCを使って開発できる
  • オープンソースで提供されている

同じGTKの機能を利用してプログラムを作成すれば、Windowsだけでなく、LinuxやmacOSへの展開も検討できます。ただし、実際に別のオペレーティングシステムで動かすには、その環境でのビルドや動作確認が必要です。

GTKを利用するときに必要なもの

Windows上でGTK 4を利用するには、C言語のコンパイラだけでなく、GTK 4本体や関連ライブラリも必要です。

本コンテンツでは、次の環境を使用します。

  • Windows
  • MSYS2
  • MSYS2 UCRT64環境
  • GCC
  • GTK 4
  • Visual Studio Code

第2章でこれらをインストールし、GTK 4を利用できる開発環境を準備します。

GTKを利用するときの注意点

GTKを利用して作成した実行ファイルは、GTKの機能を使用します。そのため、Windows向けに配布するときは、実行ファイルだけでなく、必要なDLLや関連ファイルも用意する必要があります。

また、GTKは複数の環境に対応する共通のGUIライブラリであるため、Windows APIで作成した画面と外観や動作が完全に同じになるとは限りません。

配布に必要なファイルについては、第7章で詳しく解説します。

図3:GTK 4が環境の違いを仲介する仕組み

この図から分かること

GTK 4を利用すると、C言語のプログラムからGTK 4の共通した機能を呼び出してGUIを作成できます。

GTK 4は、ウィンドウ、ボタン、入力欄などのウィジェットを提供し、実行環境とのやり取りを担当します。プログラマーは、環境ごとの細かな違いをすべて直接扱わずにGUIを作成できます。

ただし、ソースコードが共通でも、実行ファイルはオペレーティングシステムごとに作成する必要があります。各環境での動作確認も必要です。

Windows APIとGTKの違い

Windows APIとGTKは、どちらもWindows上でGUIアプリを作成するために利用できます。ただし、目的や考え方が異なります。

比較項目Windows APIGTK 4
提供元MicrosoftGTKプロジェクト
主な対象WindowsWindows、Linux、macOSなど
C言語からの利用可能可能
GUI部品Windowsの部品を利用GTKのウィジェットを利用
イベントの受け取り方Windowsメッセージシグナルとコールバック関数
Windows固有機能利用しやすい必要に応じて別の方法を併用
環境への依存Windowsへの依存が大きい複数環境へ対応しやすい
開発環境の準備Windows SDKなどを利用GTK本体と関連ライブラリが必要
配布時の関連ファイルWindows標準機能を利用しやすいGTK関連のDLLなどが必要
初学者が覚える内容Windows独自の仕組みが多いGTK共通のウィジェットを中心に学ぶ

Windowsだけを対象にして、Windows固有の機能を細かく利用したい場合は、Windows APIが候補になります。

C言語でGUIの基本を学び、将来的にWindows以外の環境も視野に入れたい場合は、GTKが有力な候補になります。

Qtを利用する方法

Qtも、GUIアプリケーションを作成するための代表的なフレームワークです。デスクトップ、モバイル、組み込みシステムなど、幅広い環境に対応しています。

Qtには、次のような特徴があります。

  • ウィンドウやボタンなどの豊富なGUI部品
  • 複数のオペレーティングシステムへの対応
  • GUI画面を設計するための開発ツール
  • ファイル、ネットワーク、データベースなどの機能
  • シグナルとスロットによるイベント処理
  • デスクトップ、モバイル、組み込み環境への対応

Qtは非常に高機能ですが、現在のQtでアプリケーションを作成する場合、中心となるプログラミング言語はC++です。Qtの公式資料でも、C++がQtアプリを構築する主要言語として説明されています。

そのため、C言語だけを使ってGUIを学習する本コンテンツでは、Qtを使用しません。

C++も学習し、本格的なクロスプラットフォームアプリを作成したい場合には、有力な選択肢になります。

wxWidgetsを利用する方法

wxWidgetsは、複数のオペレーティングシステムに対応したオープンソースのGUIフレームワークです。

実行する環境のネイティブなGUI部品を利用し、各環境になじみやすい外観のアプリケーションを作成できることが特徴です。

ただし、wxWidgetsも基本的にはC++向けです。公式ドキュメントでも、ネイティブな外観を持つクロスプラットフォームGUIアプリをC++で作成するフレームワークとして紹介されています。

C言語だけでGUIを作成する学習には向きませんが、C++を利用できる場合には選択肢になります。

そのほかのGUIライブラリ

C言語やC++で利用できるGUIライブラリは、GTK、Qt、wxWidgetsだけではありません。

ライブラリやAPI主な言語特徴
Windows APIC、C++Windowsの機能を直接利用できる
GTKCC言語から利用でき、複数環境に対応する
QtC++高機能で、開発ツールも充実している
wxWidgetsC++各環境のネイティブな外観を利用しやすい
FLTKC++比較的軽量なGUIツールキット
IUPCC言語から利用できるクロスプラットフォームGUI
NuklearC組み込みやツール向けにも使われる軽量なGUIライブラリ
Dear ImGuiC++開発ツールやデバッグ画面の作成に向いている

それぞれのライブラリは、対象とする環境、得意な画面、必要なプログラミング言語、配布方法、ライセンスなどが異なります。

有名だから、機能が多いからという理由だけで選ぶのではなく、作成するアプリケーションの目的に合っているかを確認することが大切です。

GUIを作成する方法を選ぶポイント

GUIを作成する方法を選ぶときは、次の点を確認します。

使用するプログラミング言語

C言語だけで作成するのか、C++も利用するのかによって選択肢が変わります。

  • C言語を中心に学ぶ場合はGTKやWindows API
  • C++を利用する場合はQtやwxWidgets
  • ほかの言語を利用する場合は、その言語向けのGUI環境

本コンテンツはC言語の教材であるため、C言語から直接利用しやすいGTK 4を選びます。

対象とするオペレーティングシステム

Windowsだけで動かすのか、LinuxやmacOSにも対応させたいのかを考えます。

  • Windows専用ならWindows API
  • 複数環境への対応を考えるならGTK、Qt、wxWidgetsなど

複数環境に対応するライブラリを使っても、環境ごとのビルドと動作確認は必要です。

作成するアプリケーションの種類

簡単な学習用アプリと、大規模な業務アプリでは、必要になる機能が異なります。

  • 小さな学習用アプリ
  • GUI電卓
  • テキストエディター
  • 業務用入力画面
  • 画像編集アプリ
  • ゲーム
  • 組み込み機器の操作画面

必要なウィジェットや描画機能が、そのライブラリに用意されているかを確認します。

開発環境の準備

GUIライブラリによって、インストール方法、コンパイル方法、関連ツールが異なります。

初心者が学習するときは、必要な環境を準備しやすく、サンプルや資料を確認しやすいことも大切です。

配布方法

開発したパソコンで動くだけでなく、別のパソコンへ配布する方法も考える必要があります。

確認する内容には、次のようなものがあります。

  • 実行ファイル以外に必要なファイル
  • DLLなどの共有ライブラリ
  • 画像やCSSなどの外部ファイル
  • ライセンス情報
  • ZIP形式やインストーラーへの対応
  • 対象となるオペレーティングシステム

本コンテンツでGTK 4を使用する理由

本コンテンツでは、Windows上でC言語によるGUIアプリ開発を学ぶためにGTK 4を使用します。

主な理由は次のとおりです。

  • C言語から直接利用できる
  • ウィンドウやボタンなどの基本部品がそろっている
  • イベント駆動型プログラミングを学べる
  • ウィジェットとレイアウトの考え方を学べる
  • GCCを使ってコンパイルできる
  • MSYS2から必要な環境を導入できる
  • GUI電卓や○×ゲームを作成できる
  • Windows以外の環境にも対応している
  • GUIライブラリを使う基本的な流れを学べる

GTK 4で学んだウィンドウ、ウィジェット、レイアウト、イベント、コールバック関数などの考え方は、ほかのGUIライブラリを学ぶときにも役立ちます。

図4:C言語でGUIを作成する方法の選び方

この図から分かること

C言語でGUIを作成する方法は1つではありません。

Windows APIは、Windows固有の機能を直接利用したい場合に向いています。GTK 4はC言語から利用でき、複数の環境に対応したGUIの基本を学べます。QtやwxWidgetsは高機能ですが、主にC++を使って開発します。

本コンテンツでは、C言語を使い続けながらGUIの基本を段階的に学べること、GCCと組み合わせて開発できることからGTK 4を採用します。