第3章 Windowsのプログラムを作ってみる


bccでWindowsのプログラムを作ってみましょう。ここでいうWindowsのプログラムとは、 (コンソール・アプリケーションではなく)GUIのプログラムという意味です。



まず、MyProjectBCCフォルダの中にwin01というフォルダを作ります。その中にReleaseというフォルダを作っておきます。できあがったプログラム(win01.exe)はReleaseフォルダの中に作られるようにします。

win01フォルダの中に、ソースファイルをメモ帳などで作っておきます。 名前は、win01.cppとします。(C++特有の文法は使わないので、拡張子は.cでも良いのですがcppにしておくと便利なこともあります。)

ソースファイルの中身は次のようにしておきます。

// win01.cpp

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

char szClassName[] = "win01";    //ウィンドウクラス


int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
                   LPSTR lpsCmdLine, int nCmdShow)
{
    MSG msg;
    BOOL bRet;
    
    if (!InitApp(hCurInst))
        return FALSE;
    if (!InitInstance(hCurInst, nCmdShow)) 
        return FALSE;
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
        if (bRet == -1) {
            break;
        } else {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (int)msg.wParam;
}

//ウィンドウ・クラスの登録

ATOM InitApp(HINSTANCE hInst)
{
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;    //プロシージャ名
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInst;//インスタンス
    wc.hIcon = (HICON)LoadImage(NULL,
        MAKEINTRESOURCE(IDI_APPLICATION),
        IMAGE_ICON,
        0,
        0,
        LR_DEFAULTSIZE | LR_SHARED);
    wc.hCursor = (HCURSOR)LoadImage(NULL,
        MAKEINTRESOURCE(IDC_ARROW),
        IMAGE_CURSOR,
        0,
        0,
        LR_DEFAULTSIZE | LR_SHARED);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;    //メニュー名
    wc.lpszClassName = (LPCSTR)szClassName;
    wc.hIconSm = (HICON)LoadImage(NULL,
        MAKEINTRESOURCE(IDI_APPLICATION),
        IMAGE_ICON,
        0,
        0,
        LR_DEFAULTSIZE | LR_SHARED);

    return (RegisterClassEx(&wc));
}

//ウィンドウの生成

BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
    HWND hWnd;

    hWnd = CreateWindow(szClassName,
            "猫でもわかるWindowsプログラミング", //タイトルバーにこの名前が表示されます
            WS_OVERLAPPEDWINDOW, //ウィンドウの種類
            CW_USEDEFAULT,    //X座標
            CW_USEDEFAULT,    //Y座標
            CW_USEDEFAULT,    //幅
            CW_USEDEFAULT,    //高さ
            NULL, //親ウィンドウのハンドル、親を作るときはNULL
            NULL, //メニューハンドル、クラスメニューを使うときはNULL
            hInst, //インスタンスハンドル
            NULL);
    if (!hWnd)
        return FALSE;
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    return TRUE;
}

//ウィンドウプロシージャ

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    int id;

    switch (msg) {
        case WM_CLOSE:
            id = MessageBox(hWnd,
                "終了してもよろしいですか",
                "確認",
                MB_YESNO | MB_ICONQUESTION);
            if (id == IDYES)
                DestroyWindow(hWnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return (DefWindowProc(hWnd, msg, wp, lp));
    }
    return 0;
}


コマンドラインでカレントディレクトリをwin01.cppのあるディレクトリにしておきます。そこで、
bcc32 -W -eRelease\win01.exe win01.cpp
と打ち込みます。

すると、どうでしょうか。なにやら「警告」が出てきましたね。これは、エラーではないけど、ちょっとまずいことがあるので注意してください、という意味です。

WinMain関数の引数でhPrevInst, lpsCmdLineが使われていませんよ、という意味です。 WinMan関数の引数は4つと決まっており、引数からもらったものを必ずしもすべて使うとは限りません。これは、プログラム的には正しいのです。

でも、コンパイルするたびにいちいち警告が出ていてはうっとおしいですね。

警告番号はW8057ですね。そこでこの番号の警告は 出ないようにすることも可能です。コマンドライン・オプションに

-w-8057
を加えてください。これで「警告」はでなくなります。

それにしても、コマンドラインでタイプするのが面倒くさい!!!!

はい、対策はいくつかあります。

F3」キーを押してみてください。

あら、不思議!

以前にタイプした内容がそのまま表示されますね。

これで、カーソルキーを移動して、「-w8057」を挿入してください。

ともあれ、できたwin01.exeを起動してみてください。

コンソール・アプリケーションの時と違って、今度はReleaseフォルダの中のwin01.exeのアイコンをクリックしても大丈夫です。

何にもしないプログラムですが、サイズを変えたり、移動したり、いろいろな基本機能はそなわっている、立派なアプリケーションです。

閉じるボタン(バツ印ボタン)を押すと、いきなり終了するのではなく、「終了してもよろしいですか」と確認のメッセージボックスが出ます。



[Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 04/Nov/2003 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。