MinGWについて

この文書は、MinGWを使って Windows Programming を行うためのメモである。 Windows Programming については多くの参考資料が入手できるし、 筆者も

にメモを用意してあるので、ここでは MinGW 固有の話に限定する。 また日本語固有の話については以下の別ページに記載する。

なお、Windows Programming の開発に必要なヘッダファイルやマニュアル類は Microsoft が

  • Microsoft Platform SDK for Windows Server 2003 R2

を無償提供している。

環境整備

MinGWの実行環境は、いろいろあるが、ここでは単純に Windows のコマンド プロンプトで行う。

必要な手順は環境変数 PATH に MinGW の bin を加えることである。 例えば MingGWのインストール先が C:\mingw だとすると、

SET PATH=C:\mingw\bin;%PATH%

とでもすればよい。あるいはシステム環境変数やユーザ環境変数で設定しても よい。環境変数の設定は Windows の常識の範囲内なので、これ以上は述べない。

例題その1 単純な Windows の生成

単純な Window を作る例題である。以下に示す二つのソースファイル

  • winmain.c
  • wndproc.c

を使ってみる。

winmain.c は以下のようになっている。 (2007-Feb-15 注:以前は RegisterClass? 関数を 使っていたが RegisterClassEx? 関数に置き換えた。)

#define STRICT
#include <windows.h>

#define MY_CLASS_NAME   "MyClass"
#define MY_WINDOW_TITLE "MyTitle"

/* Prototype */
LRESULT CALLBACK
  WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
  LPSTR lpCmdLine, int nCmdShow )
{
  MSG msg;
  WNDCLASSEX wcex;
  HWND hwnd;

  /* Register the window class for the main window. */
  if( hPrevInstance == NULL )
  {

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = 0;
    wcex.lpszClassName = MY_CLASS_NAME;
    wcex.hIconSm = 0;

    if ( RegisterClassEx( &wcex ) == 0 )
      return 0;
  }
	
  /* Create our window. */
  hwnd = CreateWindow( MY_CLASS_NAME, MY_WINDOW_TITLE, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    (HWND)NULL, (HMENU)NULL, hInstance, (LPVOID)NULL );
  /*
   * If the window cannot be created, terminate
   * the application.
   */
  if( hwnd == NULL )
    return 0;

  /* Show the window and paint its contents. */
  ShowWindow( hwnd, nCmdShow );
  UpdateWindow( hwnd );

  /* Start the message loop. */
  while( GetMessage( &msg, (HWND)NULL, 0, 0 ) )
  {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
  }

  /* Return the exit code to the system. */
  return msg.wParam;
}

また、wndproc.c は以下のようである。

#define STRICT
#include <windows.h>

LRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  switch( uMsg )
  {
  case WM_DESTROY:
    PostQuitMessage( 0 );
    break;
  default:
    return( DefWindowProc( hwnd, uMsg, wParam, lParam ) );
  }
  return 0;
}

これから実行ファイル a.exe を作るには

gcc winmain.c wndproc.c -mwindows

とすればよい。

例題その2 メニューを持たせる

メニューを持たせるために、resource file を使う。resource ID などは C の source file でも(後々)必要となるので、 Cの source file と resource file に共通に使う header file も用意する。ここでは例題1に示したファイルの他に

  • resource.h (header file)
  • myapp.rc (resource file)

を用意するものとしよう。

resource.h の中身は

#define IDM_FILE_EXIT 10001
#define IDM_FILE_OPEN 10002

としてある。 また、myapp.rc の中身は

#include "resource.h"

MyMenu MENU DISCARDABLE
BEGIN
  POPUP "File"
  BEGIN
    MENUITEM "Open",     IDM_FILE_OPEN
    MENUITEM SEPARATOR
    MENUITEM "Exit",     IDM_FILE_EXIT
  END
END

とする。

更に、winmain.c の

  wcex.lpszMenuName = 0;

の行を

  wcex.lpszMenuName = "MyMenu";

に変える。実行イメージを得るには

windres myapp.rc myapp.o
gcc winmain.c wndproc.c myapp.o -mwindows

とすればよい。

なおwindres については

を参考にした。

メニューによる終了

せっかくメニューをを持たせたのであるから、メニューによる終了もしたい。 上述の wndproc.c を以下のように置き換える。

#define STRICT
#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  int wmId, wmEv;
  switch( uMsg )
  {
  case WM_COMMAND:
    wmId = LOWORD(wParam);
    wmEv = HIWORD(wParam);
    switch (wmId)
    {
    case IDM_FILE_EXIT:
      DestroyWindow(hwnd);
      break;
    default:
      return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    break;
  case WM_DESTROY:
    PostQuitMessage( 0 );
    break;
  default:
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
  }
  return 0;
}

resource.h を include するのを忘れないこと。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-02-18 (日) 13:15:59