2013年11月4日月曜日

C/C++ Hello World ウィンドウ表示(Windows)

コンソールにHello Worldを表示するプログラムを作りましたが、ウィンドウに表示をした方がプログラムを作った気になるかもしれません。そこでウィンドウにHello Worldを表示するプログラムの作成です。

Windowsの場合、多くのライブラリがMicrosoftから提供されており、Win32 API、.NET Framework API、WinRT API、MFC、ATLなど色々とあります。この中で最も原始的なWin32 APIがC言語と相性がいいので、それを使用します。

プログラムは以下です。



以下のようにコンパイルし、実行します。
$ gcc hello2.c -mwindows
$ ./a.exe
すると以下のようなウィンドウが表示されます。


ソースコードはコンソール版とかなり違います。違いを簡単にまとめます。
コンソール版 ウィンドウ版 説明
#include<stdio.h> #include<windows.h> Win32 APIの使用のために、windows.hを組み込みます。
int main() int _tWinMain() ウィンドウでは、最初に実行される関数がmain()では無いです。WinMain()またはwWinMain()となります。一つ目と二つ目の引数は過去に使用していましたが、今は使用していません。 三つ目の引数はコマンドライン引数です。四つ目はウィンドウの表示状態です。
printf() MessageBox() MessageBoxは単純なウィンドウを表示するWin32 APIの関数です。一つ目の引数は親ウィンドウで今回は無いのでNULLです。二つ目の引数はウィンドウ内に表示する文字列、三つめの引数はタイトルの文字列、四つ目の引数はOKボタンを出す事を指定しています。

Win32 APIには、ANSI版とUNICODE版の二つの関数があります。#include<tchar.h>が、その二つの関数の切り替えの仕組みの一つだと考えてください。_T()によって文字列をANSIとUNICODEで切り替えます。_tWinMain()もANSI版のWinMain()とwWinMain()に切り換えられ、MessageBox()もANSI版のMessageBoxA()とMessageBoxW()に切り換えられます。面倒ですが切り替えが出来るように作成した方が将来的に良いかと思われます。

コンパイル時には、-mwindowsというオプションを付けています。これはWindowsの実行形式にはコンソール版とウィンドウ版の二通りがあり、このオプションを付けないとコンソール版となってしまうからです。コンソール版では実行時に必ずコンソールを作成します。エクスプローラからa.exeを実行すると違いがよくわかると思います。

Win32 APIはウィンドウ関係だけでなく、Windowsのほとんどの機能が提供されています。MSDN LibraryのサイトにおいてWindows開発→Windows 2000と辿った所にドキュメントがあるため、Win32 APIの詳細はそれを参照してください。

0 件のコメント:

コメントを投稿