« 2005年07月 | メイン | 2005年09月 »

2005年08月28日

みふでもわかるWIN32API講座 - 簡単な描画編

単純な描画

(現時点での理解の仕方を平たく書いているので数多くの間違いがある筈です)

GDIは、ハードウェアを直接ドライバ経由で弄ると効率が悪いので、それを隠蔽するための関数群です。
APIの中における描画に特化した部分と考えておきます。

HDC

HDC(handle of device context)は、描画対象の情報を記録した構造体です?

ウィンドウ描画用のデバイスコンテキストを操作するには、

HDC GetDC(HWND hWnd); //HWNDに対応するHDCを取得
int ReleaseDC(HWND hWnd, HDC hDC); //HWND,HDCに対応するHDCを解放。HWNDも必要な点に注意

単調描画

単に取得しておいたHDCを関数に渡して描画させるだけです。
後で出てくるメモリ上のイメージを用いた一括描画でも基本は同じです。渡すHDCが直接的では無いだけで。

//LPCSTR(LONG POINTER TO STRING)は文字列へのポインタ、cbStringは文字列の長さ(lstrlenを使うべし)
BOOL TextOut(HDC hdc, int nXStart, int nYStart, LPCSTR lpString, int cbString);


描画補足

ウィンドウの再描画

無効状態を再描画する時のWM_PAINTメッセージをフックする。
ただし、この場合にはGetDCによるデバイスコンテキストは使えない。
恐らく、GetDCはウィンドウ全体のデバイスコンテキストを得る為の物であり、
再描画の時に必要なのは無効領域のデバイスコンテキストのみが必要だからではないだろうか。

//
HDC BeginPaint(HWND hWnd,LPPAINTSTRUCT lpPaint);

//無効領域描画用なのかな?メンバ変数的にはそんなイメージの構造体
typedef struct tagPAINTSTRUCT {
HDC hdc; //デバイスコンテキスト。無効領域大元のDC
BOOL fErase; //無効領域塗りつぶしフラグ
RECT rcPaint; //無効領域の座標
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgReserved[32];
} PAINTSTRUCT;

//とっても便利な四角形指定構造体
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;

//BeginPaintがあれば当然EndPaintも……
BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint);

流れとしては、

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
//hdcを使った何らかの描画処理
EndPaint(hWnd,&ps);

をWM_PAINTの処理の中で行うわけです。
ゲームの場合、大体がデータのアップデート、そして再描画となるので、
この間に描画処理をまとめておくわけですね。

メモリ上ビットマップとの連携

ビットブロックの転送

BOOL BitBlt(
//コピー先デバイスの情報
HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight,
//コピー元デバイスの情報
HDC hdcSrc, int nXSrc, int nYSrc,
//ラスタオペレーションの識別(普通に転送するならSRCCOPY)
DWORD dwRop
);

メモリデバイスの構築

最終的に描画したい対象のデバイスコンテキストを渡すと、メモリ上に構築された仮想デバイスのデバイスコンテキストを返す
HDC CreateCompatibleDC(HDC hdc);
DeleteDC(hdc);

仮想デバイス上にビットマップを生成
HBITMAP CreateCompatibleBitmap(HDC hdc, int nWidth, int nHeight);
DeleteObject(hBitmap);

ここで、仮想デバイスコンテキストに仮想ビットマップを

SelectObject(hdc,hbitmap);
といった感じでセットすると、メモリ上の仮想デバイスに描画する事ができるようになるのです。

流れとしては、

WM_CREATE
HDC hdc = GetDC(hWnd);
hMemDC = CreateCompatibleDC(hdc);
hBitmap = CreateCompatibleBitmap(hdc, BMP_WIDTH,BMP_HEIGHT);
ReleaseDC(hWnd,hdc); //この時点で直に参照するデバイスコンテキストは不要に

SelectObject(hMemDC,hBitmap);

WM_PAINT
PAINTSTRUCT ps;

//仮想デバイス上への描画はどのタイミングで行っても大丈夫(スコープの注意はあるけど)
Rectangle(hMemDC,0,0,BMP_WIDTH,BMP_HEIGHT);

//で、BeginPaintで得たデバイスコンテキストへ転送するわけです
HDC hdc = BeginPaint(hWnd,&ps);
BitBlt(hdc,0,0,BMP_WIDTH,BMP_HEIGHT,
hMemDC<0,0,SRCCOPY);
EndPaint(hWnd,&ps);

WM_DESTROY
DeleteDC(hMemDC);
DeleteObject(hBitmap);
PostQuitMessage(0);

こんなイメージで行けると思います。

投稿者 miff : 22:10

みふでもわかるWIN32API講座

講座じゃなくて覚書ですけどね。

Windowの作成

ウィドウクラス

作りたいウィンドウの情報を"ウィンドウクラス"に納め、windowsに登録しなければならない。
WNDCLASSEX構造体を使い、RegisterClassEx(const WNDCLASSEX *)で登録する。

wcex.cbSize = sizeof(WNDCLASSEX); //構造体のサイズ
wcex.style = CS_HREDRAW | CS_VREDRAW; //スタイル
wcex.lpfnWndProc = MainWindowProc; //ウィンドウプロシージャ
wcex.cbClsExtra = 0; //追加領域
wcex.cbWndExtra = 0; // 々
wcex.hInstance = hInstance; //今となっては不必要?
wcex.hIcon = NULL; //アイコンを使うなら
wcex.hCursor = NULL; //カーソルの形を変えるなら
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //背景色を変えるなら
wcex.lpszMenuName = NULL; //メニューを使うなら
wcex.lpszClassName = WNC_NAME; //このウィンドウクラスの名前
wcex.hIconSm = NULL; //小さいアイコンを別途使用するなら

作り出す

HWND CreateWindow(
LPCTSTR lpClassName, //ウィンドウクラスの名前
LPCTSTR lpWindowName, //ウィンドウの名前(タイトルバー)
DWORD dwStyle, //スタイルの選択
int x, int y, int nWidth, int nHeight, //座標とサイズ
HWND hWndParent, //親ウィンドウがあるなら
HMENU hMenu, //メニューがあるなら
HANDLE hInstance, //インスタンスハンドルはいらないかもしれない
LPVOID lpParam //基本的にNULL
);

表示する

ShowWindow(hWnd,SW_SHOW);
最初にWM_PAINTを送信する・・・であってたっけっかなあ。

破棄する

BOOL DestroyWindow(HWND hWnd);
BOOL UnregisterClassEX(LPCSTR lpClassName, HINSTANCE hInstance);

制御

メッセージループ

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

TranslateMessageで文字列を読めるようにする……んだっけっか。違う気がする。
DispatchMessageは、受け取ったメッセージを対象のプロシージャに中継する為の物。

ウィンドウプロシージャ

LRESULT CALLBACK WindowProc (
HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //引数は固定。ハンドル,メッセージ本体,そのパラメータ
{
switch(uMsg) {
case WM_DESTROY: //補足したいメッセージを振り分ける
PostQuitMessage(0); //メッセージループを終了させる
return 0;
}

return DefWindowProc(hWnd, uMsg,wParam, lParam); //必要無いメッセージはデフォルトウィンドウプロシージャに送る
}

投稿者 miff : 18:36

2005年08月27日

忘れてしまった心

某ホラー(サスペンスらしいけれど)ゲームをやっているわけですが、以前にFateをやった時と同じくダルさが全然抜けません。 日常の場面を見るのが苦痛で仕方が無いのです。 無駄!無駄!無駄ぁ! あと、エフェクトが鬱陶しすぎるのです。 Fateの時にも思ったんですが、普通に読ませてくれと切実に思います。 でも、あんまり賛同してくれる人は居なかったりして。 まあ、地味に文字を読むだけなら小説でいいだろうって事なのでしょうけれども。 いや、やっぱりあれはやりすぎでしょう。めっちゃ妨げ。 例えば、めっちゃ悪路を走行しながら走る車の中で小説は読めないでしょう。 手元が震えすぎて時がまともに読めないし、走行音が鬱陶しくて集中しにくいから。 まとめると、 ・どーでもいいシーンをだらだら見せられると本当に鬱陶しい気分になってくる ・エフェクトを多用されると読むのが辛くなってくる キャラ付けってのもあるとは思うんですけどね、だからといって無駄なシーンを大量に付けるの?って。 個人的には最高の文章は最高にシンプルな構成じゃないかなあと。 無駄を一切省いて、キャラ付けの日常シーンも勿論あるけれど、それが単なるだらだらと容量を増やすためだけの物じゃない……って、そんなおかしな事を求めているとは思わないんですけど。

投稿者 miff : 01:13

2005年08月18日

同人結界……かなり嫌な結界だと思う

同人とお金儲け

で、全然関係無い話題なんですけど、ほら私って基本的に冬夏のお祭りに行けないじゃないですか。
いや、行こうと思えば行けるわけですが色々足りなくて……度胸とか。

で、マリグナやってるとこの東方奇闘劇ってのを見る機会があったんですよ。
あそこの物品は高すぎるので買った事無いんですが。
それで、マリグナは好きだったんですけどこれって……正直見た感想が「ジャンルゴロ?」だったんですよね。

ジャンルゴロという言葉は以前どこか(多分東方wiki)で見た言葉なんですが、簡単に言えば「何かあのジャンル流行ってるみたいだし便乗して一儲けすっかー」って感じ。
まあ、これに関しては単にマリグナのノリそのままにスパロボ側に傾きすぎているからそう思ってしまったと思うんですけれども。
とはいえ、全然面白く無かったですが。
FINALに期待ですね。友達は委託されたら買うらしいです。

それで、久しぶりに思い出したそのジャンルゴロという単語を気まぐれで検索してみたところ、

「東方?へぼいキャラ絵のやつでしょ。シューティングだし。やんねーよ。ペッ」って
去年まで言ってた奴が、最近になって「東方って売れるんだね。俺もやろうかなぁ。ハァハァ」
って目こんな感じ”<¥> <¥>”にして言ってるの。

こんな書き込みを見つけたんです。
この書き込み自体に言う事は何も無いんですけど、そこでこのセクションのタイトルに戻るわけです。

同人って儲かるの?

いや何かほら全然儲かってる風に見えないからさ、いやほんと。
そもそもイベントに参加するだけでかなりのお金が飛ぶし、印刷するとかするだけでも色々費用がかかるみたいなんですよね。
その辺の詳細は全然知らないし、ただ一つ言える事なんて入場料が結構高かった気がするってだけです。
人気のあるジャンルだったらまあ、それなりに売れるんだろうけど、でも人気のあるジャンルだったしなあ。

そりゃ東方とか月姫とかひぐらしとかのレベルになると副収入と呼ぶには恐ろしいクラスのお金が入ってくるんでしょうけど……。
そもそも同人誌の相場も知らないから想像すらできないんですけどね。

#まあ、何事もやりようなんでしょうけどね。
#貶すわけじゃないけど、(超有名所しか知らないからってのもあるけど)ひぐらしのところとかかなりお金に貪欲な感じですよね。実際どうかは知らないけれど。

##罪滅ぼし編、渡されてもやらないからね!あまつさえそれを買うなんて事想像できないよ!やめて、ひぐらしの鳴く声を聞かせないで!ひいいい

投稿者 miff : 00:20 | コメント (0)

2005年08月16日

頭が痒い!

けれど、掻いても手ごたえが無い。 何だろう、変な虫でもついたかな……凄く嫌です。 いやほんと。 *せんそうとかげんしりょくばくだんとか 原爆怖いですねーおお怖い。もう放射能怖いから原子力発電所なんて解体してしまえっ。 ついでに放射能を持つ物質は全部この世から抹消だ。 放射線なんて物よくわからないからとっても怖いものね。 とりあえず、「放射能」の意味がわからない人は放射線がどうのとか語るべきではあるまい。 ちょっと調べたらわかる事だけど、そんな事すら調べずに怖い怖いと印象だけで語ってる人が多すぎ。 それで何が残りますか?わかりません。 ちなみに私は詳しくないので語れません。 で、戦争なんですけど。 とりあえず、日本が加害者だから永遠に謝り続けなければいけないって言ってる人って第三次世界大戦を導きたいのですかね。 ま、どうせ後60年もしたら完全に世代が交代して殆どの人がそんな物聞く価値持たない戯言だと思うようになってると思うけど(笑 今でもかなりそうなってきてますしね。 なんて言うんでしたっけ?そうそう、右傾化だ。 まあ、平和のためにもどんどん右傾化すべきだと思いますよ、うん。

投稿者 miff : 13:36

あれやこれ

まあ、一応記念日だしねえ。てかドラゴン桜が家族で流行ってるのが痛くて痛くて。 ありえない。そんな物を見せないでkあそrあqwせdrftgyふじこlp *ドラゴン桜 流行っているらしいです。 本当に流行っているのかどうかはわかりません。 何せ流行を創るメディアからしか情報を得ていませんからね。 とはいえ、ある程度売れているようですし、確かに一定量の支持は得ているようです。 この漫画は、所謂DQNを詰め込み教育で東大に合格させようという話なんですが……。 何でみんなこんな痛い話を読めるんだろう(涙 何が痛いって自分ですよ自分。 やっぱ受験に凄く未練を残しているんだなと再認識です。 今から言うなら当時から勉強しておけばよかったじゃないってそんな事今更言っても仕方の無い事。 また、今からでも受験し直す事はできますが、人生の大きな数年間を無駄にしなければいけない事を考えるとその選択も辛い。 というか、現役でなければ意味が無い。 そんな自分がドラゴン桜を見ると全裸で逆立ちしながら梅田スカイビルの屋上へ駆け上って飛び降りたくなるような辛さを感じてしまいます。 日本人の多くがまともな国立大学にすら入れていない(私含む)のに、あれを正視できるのはきっと十分傷が癒える程時間が経っているのかなあ。 もしくはあまり物事に執着しなくてすむ性分の人。 ああ……国立に行けていたらもっとマシな生活と将来を夢見れたんだろうかなと思うと本当人生やり直すか投げたい気分。 普段は考えないようにしているけれど、やっぱりあーゆーの見たら辛さが耐えられない。 せめて最下層でもいいから国立目指したらよかったのかもしれない。駅弁大学。 下手に将来とか考えてしまったから一応都市圏(違ったけど)で、三流くらいにギリギリ留まっているっぽい関大選んだんだけど……。 こんな今更どうしようもない事考えるなんてほんと夏だなあ。 でも、誰しも将来の不安くらいは抱えてるとは思ってますけどね。 国立行ったとしてもそれはそれで悩みも持つでしょう。 とはいえ、悩む方向が違うと思うんですよねこれ。何か始まる前から負けてる感じ。 いやいやまだ逆転のチャンスは残されていますよ。 その為にも今の学生生活を何とかして充実させなければどうしようも無し。 空元気でもアホみたいな嬉しがりに見えても積極的に嬉しがっていかねば。 *戦後60年 自動的に原爆による大量殺戮から60年という事でもあり。 家では日経新聞を取っているわけです。日本経済新聞。 渡辺恒夫氏に関する下らない話題によって読売から変更したというアホみたいな経緯があるわけですが、それは置いておくとして、 日本経済新聞は、とっても中国様が大好きなのです。 それが良くわかる部分が靖国関連の記事で、未だに合祀がどうのとか参拝問題がどうのとか言ってるのです。 ちょっと恥ずかしいのですが、それにしても気になる部分が、「日本は戦争加害者、周辺国家への賠償がどうのこうの」という所。 もちろん、日本が過去に戦争によって多くの人を殺した事は事実でしょう。 ですが、それをもって日本を加害国家と断罪するのならば、日本の侵攻に反抗して日本人を殺害した多くの人々を抱える国家も加害国家とされるべきではないでしょうか。 もちろん、その論はおかしいです。 元々そんな単純な理論で日本を加害国としようとする事に無理があるのだから当然です。 いやそんな話は少し本論から離れていまして、つまり主張したいとい事は「平和主義と名乗る方々は日本は反省しろ、謝罪しろとおっしゃります」が、それは「平和念仏主義であり何の意味も無い」どころか、その考え方自体が戦争を引き起こす危険な物ではないかという事です。 つまりですね、暗部を抱えまくりの中国やら朝鮮やらに戦争の事で突っつかれるのも、事ある毎にリメンバーパールハーバーとか寝言抜かされたりするのも、結局は戦争に負けた事が悪いのは周知の事と思います。 では、この状態を解決するにはどうしたらいいのか。 一番理想論かつ平和的な方法は、お互いが自らの罪を認め合い(そもそも罪かどうかもわからないけれど)、その事を引き合いに出す事を止める事です。 「戦争はもう過去の事じゃないか、お互い人を殺し合った事には違いが無いし、後ろ暗い部分も抱えているんだからもう終わりにしよう」、といういかにも日本人的な発想ではありますが、お互いにお前が悪いと言い合ってループしているよりはよっぽど良い状態でしょう。 しかし、もう一つの解決方法があります。 つまり「もう一度戦争をして、今度は勝つ」事です。 「戦争を起こしたのだから永遠に謝り続けなければならない」と主張する事は逆に、「永遠に謝り発言権は無いに等しく、金品を様様な難癖を付けられて強奪される現状を何とかしたいのなら、もう一度戦争して勝つしか方法が無い」と言っているような物です。 しかし、それが仮に上手くいったとしても、また同じ繰り返しで戦争が発生し続けてしまいます。 それならば、もう謝罪する事はやめて「水に流す」事が一番平和的な解決方法なのです。 考えてもみてください、謝罪謝罪反省反省日本は加害者と言い続ける事のどこに平和が見えますか? もう一度、過去を振り返り総括する必要を強く感じます。 もっとも、その流れはある程度存在し、マスコミではそれを「右傾化」と呼ぶらしいですが。 でも、どうせ60年もしたら世代が交代しちゃうんですよね。 世代が交代したらどうなるかはまあ、ねえ。基本的に体験しても居ない事に対して想像力を働かせろって言っても限界あるし。 まあ、関係無い所からテロリストの手も迫ってますけどね。 あれは本当救いようの無い人々だと思うけれど。 とは言っても現状じゃどうやっても貧困問題なんて解決できないって(w #正直一回原爆で地球割ったほうがいいんじゃないですか?そんな事考えるのは単なる思考停止だけど。

投稿者 miff : 13:27

2005年08月08日

振り向くな!

気持ちを切り替えて進まないと!
いつまでも引きずっている事を誰が望むというのか!

人間の価値は死んでからわかるというのは本当ですね。
いろんな意味で。
死んでしまったら残るのは骨と思い出だけ。
侘しい世界です。

投稿者 miff : 15:54 | コメント (0)



XREAAD