goo blog サービス終了のお知らせ 

VCとDXと日記帳

VCとDXでプログラミング
最近はタクティクスオウガのみです…

Winプログラミング 1.0.3

2005-03-14 22:20:31 | Programming_Win
メッセージループは簡単に言ってしまえばプログラムをすぐに終了させない仕組みです
GetMessage()では何もイベントが起こらない(例えばキーが押されるなどがない)ならば待機し続け処理を行いません

イベントが起こるとメッセージを受け取り処理を行うのですが
それを具体的に処理するのがウインドウプロシージャです
しかし今回はウィンドウを作っただけなので終了のときのみです
ほかキーが押される 最小化などはデフォルト処理にしています


これで基礎の基礎は終了です
今後はコレに手を加えていく形になります

Winプログラミング 1.0.2

2005-03-11 19:03:04 | Programming_Win
続いてウインドウの作成
ウインドウクラス名は登録したものを

ウインドウタイトルはタイトルバーに表示する文字列ですここではタイトルとしました

ウインドウスタイルはWS_OVERLAPPEDWINDOWにしました
WS_OVERLAPPEDWINDOWはWS_OVERLAPPED(タイトルと枠を持つ)WS_CAPTION(タイトルバーを持つ)
WS_SYSMENU(ウィンドウボックスメニューを持つ)WS_THICKFRAME(サイズ変更可能 =WS_SIZEBOX)
WS_MINIMIZEBOX,WS_MAXIMIZEBOX(最小化、最大化のボタンを持つ)
スタイルをあわせ持つスタイルです

表示X座標、表示Y座標はCW_USEDEFAULTにしました
ここを0,0とすれば左上にウィンドウが作られることになります

ウィンドウの幅および高さは640,480としました
コレはあくまでウィンドウの大きさです問題がでる場合がありますがそれは後ほど

親ウインドウはないのでNULLです

ウインドウメニューはメニューがないのでNULL

インスタンスハンドルはWinMain()の引数で受け取ったhInstanceを設定します

WM_CREATE情報はNULL

そしてウインドウハンドルを受け取ります。(HWND hWnd)

次にウインドウの表示
ShowWindow()で表示状態の設定
UpdateWindo()でクライアント領域の更新です

次回に続きます長いですね

Winプログラミング 1.0.1

2005-03-09 07:36:20 | Programming_Win
まずはウインドウクラスの登録の部分から見てみましょう
WNDCLASS wc; はWNDCLASSのオブジェクトwcを作成するという意味です
WNDCLASSは以下のように宣言されています

typedef struct {
    UINT        style;          //スタイル
    WNDPROC     lpfnWndProc;    //ウィンドウプロシージャ
    int         cbClsExtra;     //補助メモリ
    int         cbWndExtra;     //補助メモリ
    HINSTANCE   hInstance;      //インスタンスハンドル
    HICON       hIcon;          //アイコン
    HCURSOR     hCursor;        //カーソル
    HBRUSH      hbrBackground;  //背景ブラシ
    LPCTSTR     lpszMenuName;   //メニュー名
    LPCTSTR     lpszClassName;  //クラス名
} WNDCLASS

次にやっていることはZeroMemory(&wc, sizeof(WNDCLASS));ですね
これはwsのアドレスのポインタ(&ws)からWNDCLASSの大きさだけ(sizeof(WNDCLASS))メモリを0で埋めるということです
アドレスのポインタとはとりあえずメモリの場所と思っていただければよいと思います

そして次はwc.style = CS_HREDRAW | CS_VREDRAW;です
スタイルはウィンドウのサイズが水平方向に変更されたときに再描画する(CS_HREDRAW)
と垂直方向に変更されたときに再描画する(CS_VREDRAW)の論理和です

ウィンドウプロシージャは後に回します

cbClsExtraおよびcbWndExtraは使わないので0です

インスタンスハンドルはWinMain()の引数で受け取ったhInstanceを設定します

アイコンおよびカーソルは標準のものを設定しました

背景ブラシは白(HBRUSH)(COLOR_WINDOW + 1)としました
(HBRUSH)GetStockObject(BLACK_BRUSH)とすれば黒になります

メニュー名は使わないので無し(NULL)にしました

クラス名はとりあえずWindowsとしました

そしてif(!RegisterClass(&wc)) return 0;と出て来ました
RegisterClass(&wc)) はウィンドウクラスを登録します
できなければreturn 0;(0を返すこの場合終了)します

ウインドウクラスの登録が終わりました
説明は次に続きます

Winプログラミング 1.0

2005-03-08 00:24:30 | Programming_Win

#include <windows.h>

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

//==============================================================================================
// Windows メイン処理
//==============================================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    // ウインドウクラスの登録
    WNDCLASS wc;
    ZeroMemory(&wc, sizeof(WNDCLASS));
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = (WNDPROC)WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "Windows";
    if(!RegisterClass(&wc)) return 0;

    // ウインドウの作成
    HWND hWnd = CreateWindow(
        wc.lpszClassName,
        "タイトル",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        640,
        480,
        NULL,
        NULL,
        hInstance,
        NULL);

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

    // メッセージループ
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

//==============================================================================================
// ウインドウプロシージャ
//==============================================================================================
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_DESTROY:
        // 終了メッセージ
        PostQuitMessage(0);

        return 0;

    default:
        // デフォルト処理-
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
}


いきなりかなり多くなってびっくりしたかもしれませんが
していることはそう多くはありません
ウインドウクラスの登録
ウインドウの作成
ウインドウの表示
メッセージループ
の4つと
ウインドウプロシージャ
です解説は次にまわします

Winプログラミング 0.1

2005-03-05 01:43:17 | Programming_Win

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{
    MessageBox(NULL, "ウィンドウアプリを作成しました", "メッセージボックス", MB_OK);
    return 0;
}

実行しても何も起こらないし本当にWinアプリ?ってことで
メッセージボックスを表示します

次はいよいよウィンドウを作成します