Nanashi-softプログラマ専用Windows gcc SDL


◇Windowsでgcc+SDL -Eclipseで開発してみる(2-

前回ビルドに成功して、Consoleに !!!Hello World!!!と表示されるようになった
……で?
ウィンドウが表示されないと話が始まらないので方法を探してみる
てか、雛形でウィンドウ表示とメッセージループができているものだと思っていた

雛形に main関数があるので、そこに素直に書き足してみます
Windows Mobileでゴリゴリ書いたやつを貼り付けてみる
ghWnd= CreateWindow(szClassNme, "test", WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
そうだよね。WinMainから始まらないから、引数が足りないよね

msdnサイトのリファレンスを見たところ、
>hInstance
> Windows 95/98:ウィンドウに関連付けられたモジュールのインスタンスハンドルを指定します。
> Windows NT/2000:このパラメータは無視されます。  ←え?
無視されるならNULLでいいよね。NULLにしちゃうよ(*'-')
ShowWindow(ghWnd, nCmdShow);
nCmdShow変数も未定義エラーになるので調べたところ
SW_SHOWNORMALでもいいらしいので書き換える

その他はそのままいけそうでした

ビルドして実行されるが何も表示されない
('-'*)?
タスクマネージャを起動してプロセスを見ると、きちんと起動していたので……おもむろにプロセス終了(ぉ

色々調べてみると、きちんとWNDCLASSを生成していないせいだとわかった
Windows Mobileじゃ作らなくても良かったのに(いいことは無いと思う)

よくあるサンプルをパクって来て貼り付ける
hInstanceプロパティは NULLに変更
hbrBackgroundプロパティのGetStockObjectがエラーになったので、WHITE_BRUSHを指定してみると透明になった(なんでやねん!)
(HBRUSH)COLOR_BACKGROUNDにすると表示された。どうせ画像を表示するのでこれでいいだろう

てか、どこにもサンプルっぽいのが見当たらないのだが
そもそも、WinMainで始まっていない時点で既に何か間違えているような気がする(汗

ソースはこんな感じ
//============================================================================
// Name : test2.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
using namespace std;

#include <windows.h>
HWND ghWnd;
char szClassNme[] = "test2";
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int main()
{
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!

WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbWndExtra = 0;
wc.cbClsExtra = 0;
wc.hInstance = NULL;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassNme;

RegisterClass(&wc);

ghWnd= CreateWindow(szClassNme, "test", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, NULL, NULL, NULL, NULL);
ShowWindow(ghWnd, SW_SHOWNORMAL);
UpdateWindow(ghWnd);

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;
}

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


TOPプログラマ専用Windows gcc SDL