スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MinGWでWindowsプログラミングを行う方法

C言語+Win32 APIでWindowsプログラムを書き、MinGWでコンパイルする手順。

今回の内容のポイントは、以下の3点です。

  • ヘッダファイル「windows.h」をインクルードする
  • エントリポイントは、main関数ではなく「WinMain関数」である
  • gccコマンドによるコンパイル&リンク時に「-mwindowsオプション」を付加する

Windows XP上での作業を前提としています。MinGWのWindows XPにおけるセットアップ方法については、以下の記事をお読みください。

Windows XPにおけるC言語およびC++のセットアップ作業のメモ

サンプルプログラムとコンパイル方法

以下のようなプログラムを作成し、「sample.c」という名前で保存したとします。

#include <windows.h>
#include <tchar.h>

int WINAPI WinMain(
  HINSTANCE hCurInst,
  HINSTANCE hPrevInst,
  LPSTR lpsCmdLine,
  int nCmdShow)
{
  MessageBox(
    NULL,
    _T("Hello, Windows!"),
    _T("sample"),
    MB_OK);

  return 0;
}

これをコンパイルするには、コマンドラインにおいて、cdコマンドでソースファイルのあるディレクトリ(=フォルダ)に移動したのち、gccコマンドを-mwindowsオプション付きで実行します:

> gcc sample.c -o sample -mwindows

そうすると、実行形式のファイル「sample.exe」ができあがります(厳密に言うと、gccコマンドはコンパイルのあとリンクも行います)。

できあがった「sample.exe」をコマンドライン上で実行すると、メッセージボックスが表示されます:

> sample
(メッセージボックスが現れる)

あるいは、sample.exeを直接ダブルクリックして実行することもできます。

なお、-mwindows オプションをつけなくてもコンパイルは可能ですが、できあがったGUIアプリケーションをダブルクリックで実行するとウィンドウの背後にコマンドプロンプトが表示される状態になります。

Windowsプログラムの雛形

以下は、ウィンドウを表示するプログラムの雛形です。

#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

/* エントリポイント */
int WINAPI WinMain(
  HINSTANCE hCurInst, 
  HINSTANCE hPrevInst,
  LPSTR lpsCmdLine,
  int nCmdShow)
{
  HWND hWnd;
  WNDCLASSEX wc;
  MSG msg;
  BOOL bRet;

  /* ウィンドウクラスの定義 */
  wc.cbSize = sizeof(WNDCLASSEX);
  wc.style = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc = WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = hCurInst;
  wc.hIcon = (HICON)LoadImage(
    NULL, 
    IDI_APPLICATION, 
    IMAGE_ICON, 
    0, 
    0, 
    LR_DEFAULTSIZE | LR_SHARED);
  wc.hCursor = (HCURSOR)LoadImage(
    NULL, 
    IDC_ARROW, 
    IMAGE_CURSOR, 
    0, 
    0, 
    LR_DEFAULTSIZE | LR_SHARED);
  wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  wc.lpszMenuName = NULL;
  wc.lpszClassName = _T("SampleClass");
  wc.hIconSm = (HICON)LoadImage(
    NULL, 
    IDI_APPLICATION, 
    IMAGE_ICON, 
    0, 
    0, 
    LR_DEFAULTSIZE | LR_SHARED);

  /* ウィンドウクラスの登録 */
  if(RegisterClassEx(&wc) == 0)
    return FALSE;

  /* ウィンドウの作成 */
  hWnd = CreateWindow(
    wc.lpszClassName,
    _T("Window App Sample"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,
    NULL,
    hCurInst,
    NULL);

  /* ウィンドウの表示 */
  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);

  /* メッセージループ */
  while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
    if (bRet == -1)
      break;
    else {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }

  return (int)msg.wParam;
}

/* ウィンドウプロシージャ */
LRESULT CALLBACK WndProc(
  HWND hWnd,
  UINT msg,
  WPARAM wp,
  LPARAM lp)
{
  switch (msg) {
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    default:
      return DefWindowProc(hWnd, msg, wp, lp);
  }

  return 0;
}

コンパイルおよび実行方法は上記のとおりですが、-mwindowsオプションをつけずにgccコマンドを実行すると、以下のようなエラーメッセージが表示されます:

undefined reference to `GetStockObject@4'
collect2: ld returned 1 exit status

関連記事

MinGWでWindowsプログラミングを行う方法 まとめ

【theme : プログラミング
【genre : コンピュータ

プロフィール

よしいず

Author:よしいず
MATHEMATICS.PDFというウェブサイトを運営しています。

管理の都合上、トラックバックとコメントはオフにしてあります。ブログ経験者なら分かっていただけると思いますが、スパム(アダルトやその他の宣伝)ばかりなのが現実です。

リンクは自由です。当サイトの記事に対する間違いの指摘・意見・感想などを述べた記事からのリンクは歓迎です。ただし、ブログ記事アップ直後はミスが多く、頻繁に修正します。場合によっては削除する可能性もあります。その際、何も断りもなく修正・削除しますがご了承ください。内容を参考にする場合には投稿後一週間ほど様子を見てからにしてください(笑)。

記事の間違いを指摘するときは、その具体的箇所、理由(仕様に反するなど)・根拠(参考にした文献など)、代替案(同じ結果を得るための正しいやり方)も教えてください。そうしないと、(指摘される側および第三者はその時点では無知の状態なので、)どこが間違いなのか分かりませんし、本当に間違っているのかどうかが判断・検証できません。実際、間違いだと指摘されたことが結局は正しかったというケースもありますので。

このブログのタイトル一覧

リンク
月別アーカイブ
カテゴリ
最新記事
検索フォーム
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。