ぼく用あれこれまとめ

windowsプログラミングの祈り

最終更新:

bokuyo

- view
管理者のみ編集可

カーゴカルトチックWindowsプログラミング


 #define STRICT
 #define WIN32_LEAN_AND_MEAN
  • とりあえずこいつら宣言しとけばバグが出ないと信仰されてる。

STRICT マクロ定義

#ifndef STRICT
#define STRICT
#endif
#include <Windows.h>
  • MSさんによると、「#define STRICT」を定義することで、厳密な型チェックが行われるようになる。
  • マクロだったり、関数ポインタだったり、使いまくりの WindowsAPI だから、出きる限りでいいからコンパイル時の型チェックで安全性を高めたいよね、みたいな?
  • やっておいて損はないと思う。

参考文献



WIN32_LEAN_AND_MEAN マクロ定義

  • 「#include <Windows.h>」をする前に定義しとく
  • 定義することで、
    • 必要最低限のヘッダのみをインクルードするようになる
    • だからコンパイル時間の短縮が行える。
      • でも今の時代CPUがんばってるから、そこまで気にするまでもない時間になってると思われる。
    • 余計なヘッダを読まない代わりに、あとあと必要になるようなヘッダも読み込まないわけなので定義する際は注意してね。
    • WinSock2とか使うなら、WIN32_LEAN_AND_MEAN を定義しといて、別に「#include <WinSock2.h>」インクルードしたほうがよさそう?
      • <Windows.h>内で以下のように定義されてる。
#ifndef WIN32_LEAN_AND_MEAN
  #include <winsock.h>
#endif
      • 「WinSock2.h」をインクルードする前に、「WinSock.h」をインクルードするとコンパイルエラーが起こる。嫌になる量はきだされる。
      • WIN32_LEAN_AND_MEAN マクロ定義 を使わない場合は以下のコードだとエラーは起きない。
#include <WinSock2.h>
#include <Windows.h>

参考文献


Window を作る


ウィンドウサイズを、画面内のサイズが800*480なら、きっちり(800+Alpha)*(480+Beta)になるようする関数

  • つまりクライアントサイズとウィンドウサイズを取得したい
  • 以下に2つの方法のやり方を示す。(ウィンドウサイズにunsigned int 使ってるので適宜キャストいれてくだぱい。)
unsigned int const CLIENT_WIDTH  (640);
unsigned int const CLIENT_HEIGHT (480);
DWORD const WINDOW_STYLE(WS_OVERLAPPEDWINDOW);

AdjustWindowRect 関数を使う方法

RECT rect = {0, 0, CLIENT_WIDTH, CLIENT_HEIGHT};
AdjustWindowRect(&rect, WINDOW_STYLE, FALSE);
unsigned int const WINDOW_WIDTH  (rect.right - rect.left);
unsigned int const WINDOW_HEIGHT (rect.bottom - rect.top);

HWND hWnd = CreateWindow(
		wcex.lpszClassName, 
		WINDOW_TITLE, 
		WINDOW_STYLE, 
		CW_USEDEFAULT, 
		CW_USEDEFAULT, 
		WINDOW_WIDTH, 
		WINDOW_HEIGHT,
		nullptr, 
		nullptr, 
		hInstance, 
		nullptr
	);

GetClientRect 関数を使う方法

HWND hWnd = CreateWindow(
		wcex.lpszClassName, 
		WINDOW_TITLE, 
		WINDOW_STYLE, 
		CW_USEDEFAULT, 
		CW_USEDEFAULT, 
		CLIENT_WIDTH, 
		CLIENT_HEIGHT,
		nullptr, 
		nullptr, 
		hInstance, 
		nullptr
	);
RECT rect;
GetClientRect(hWnd, &rect);
unsigned int const CURRENT_CLIENT_WIDTH  (rect.right - rect.left);
unsigned int const CURRENT_CLIENT_HEIGHT (rect.bottom - rect.top);
GetWindowRect(this->handle, &rect);
unsigned int const CURRENT_WINDOW_WIDTH  (rect.right - rect.left);
unsigned int const CURRENT_WINDOW_HEIGHT (rect.bottom - rect.top);

unsigned int const WINDOW_WIDTH          (CURRENT_WINDOW_WIDTH  + (CLIENT_WIDTH  - CURRENT_CLIENT_WIDTH));
unsigned int const WINDOW_HEIGHT         (CURRENT_WINDOW_HEIGHT + (CLIENT_HEIGHT - CURRENT_CLIENT_HEIGHT));
SetWindowPos(hWnd, HWND_TOP, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, SWP_NOMOVE);

WinMain関数の引数名

"LPTSTR lpCmdLine"と"LPTSTR lpszCmdLine"で変数名迷ってるなら

UTF-8のテキストファイルをはきだしたい


HRESULT型の値

  • trueかfalseか知りたいのにHRESULT型だとなんだか…。
    • SUCCEEDEDマクロ、FAILEDマクロを使うと、その値から成功したかどうかがわかるよ。
    • S_FALSEはマクロで判定するとき注意よ

max, minマクロ

  • <Windows.h>では勝手に「#define max(a,b)」「#define min(a,b)」をしてるわけですが非常にうざったいなり。
  • そこで、<Windows.h>をインクルードする前に「#define NOMINMAX」って定義しちゃうと定義されずに済みます。
  • 一度defineされた定数を未定義にする「#undef」を使って「#undef max」「#undef min」ってするのはやめたがいいと思われ。
  • <Windows.h>っていうよくわからないシステム管理してるヘッダーさんの中で定義されたものをundefするってちょっとやばいよね。


より精度のいい時間の計測



MSDNリンク

記事メニュー
目安箱バナー