パフォーマンスカウンタ


BOOL QueryPerformanceFrequency(
 LARGE_INTEGER *lpFrequency
);

高分解能パフォーマンスカウンタの周波数を取得します。
パフォーマンスカウンタをサポートしていない時は、0が返ります。

lpFrequencyカウンタの周波数(カウント毎秒)を受け取る64ビット整数へのポインタ


BOOL QueryPerformanceCounter(
 LARGE_INTEGER *lpPerformanceCount
);

高分解能パフォーマンスカウンタの現在値を取得します。

lpPerformanceCount現在のカウントを受け取る64ビット整数へのポインタ

このタイマは、すべてのマシンで利用できるわけではありません。
また、現在製造されているすべてのプロセッサでサポートされていますが、
古いプロセッサの中にはサポートしないものもあります。
このため、プログラムではこのタイマが存在するかどうかをテストし、
利用できない場合はtimeGetTime()を使うようにしなければなりません。


#define UPDATE_TICKS_MS 100

_int64 start, end, freq, update_ticks_pc
MSG msg;

if ( !QueryPerformanceFrequency( ( LARGE_INTEGER* )&freq ) )
 return -1;

update_ticks_pc = UPDATE_TICKS_MS * freq / 1000;

QueryPerformanceCounter( ( LARGE_INTEGER* )&start );

while ( GetMessage( &msg, NULL, 0, 0 ) ) {
 TranslateMessage( &msg );
 DispatchMessage( &msg );
 QueryPerformanceCounter( ( LARGE_INTEGER* )&end );
 while ( ( end - start ) >= update_ticks_pc ) {
  UpdateWorld();
  start += update_ticks_pc;
 }
}

 return msg.wParam;


あまり良いサンプルじゃない。
Windows > メッセージループ | comments (0) | trackbacks (0)

StretchBlt()関数


BOOL StretchBlt(
 HDC hdcDest,
 int nXOriginDest,
 int nYOriginDest,
 int nWidthDest,
 int nHeightDest,
 HDC hdcSrc,
 int nXOriginSrc,
 int nYOriginSrc,
 int nWidthSrc,
 int nHeightSrc,
 DWORD dwRop
);


ビットマップを転送元四角形から転送先四角形にコピーします。
このとき、必要に応じて、転送先四角形の寸法に合うように、ビットマップを拡大、縮小します。

hdcSrc転送先デバイスコンテキストへのハンドル。
xDest転送先四角形の左上隅のx座標。
yDest転送先四角形の左上隅のy座標。
nDestWidth転送先四角形の幅。
nDestHeight転送先四角形の高さ。
hdcSrc転送元デバイスコンテキストへのハンドル。
xSrc転送元四角形のx座標。
ySrc転送元四角形のy座標。
nSrcWidth転送元四角形の幅。
nSrcHeight転送元四角形の高さ。
dwRop実行するラスタ オペレーション。



StretchBlt( hdc, 50, 0, 250, 200, hdc, 0, 0, 32, 32, SRCCOPY );
StretchBlt( hdc, 50, 0, -250, -200, hdc, 0, 0, 32, 32, SRCCOPY );

Windows > グラフィック | comments (0) | trackbacks (0)

AlphaBlend()関数


BOOL AlphaBlend(
 HDC hdcDest,
 int nXOriginDest,
 int nYOriginDest,
 int nWidthDest,
 int nHeightDest,
 HDC hdcSrc,
 int nXOriginSrc,
 int nYOriginSrc,
 int nWidthSrc,
 int nHeightSrc,
 BLENDFUNCTION blendFunction
);


透明または半透明のピクセルがあるビットマップを表示します。

hdcSrc転送先デバイスコンテキストへのハンドル。
xDest転送先四角形の左上隅のx座標。
yDest転送先四角形の左上隅のy座標。
nDestWidth転送先四角形の幅。
nDestHeight転送先四角形の高さ。
hdcSrc転送元デバイスコンテキストへのハンドル。
xSrc転送元四角形のx座標。
ySrc転送元四角形のy座標。
nSrcWidth転送元四角形の幅。
nSrcHeight転送元四角形の高さ。
blendFunctionBLENDFUNCTION 構造体を指定します。



typedef struct _BLENDFUNCTION {
 BYTE BlendOp;
 BYTE BlendFlags;
 BYTE SourceConstantAlpha;
 BYTE AlphaFormat;
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;


BlendOp現時点ではAC_SRC_OVER以外の操作は定義されていない為、常にこの値を指定します。
BlendFlags常に0を指定します。
SourceConstantAlphaコピー元の画像をどの程度の割合で透明にするかを表す値で、0だと完全な透明で255が完全な上書きとなる不透明度を表します。
AlphaFormat32ビットマップを生成し、ビットマップがアルファ値を持つ場合は指定しますが、RGBカラーで構成される通常のビットマップであれば0を指定します。



static BLENDFUNCTION blendfunc = { AC_SRC_OVER, 0, 32, 0 };

AlphaBlend( hmdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight,
hbitdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, blendfunc );

Windows > グラフィック | comments (0) | trackbacks (0)

TransparentBlt()関数


BOOL TransparentBlt(
 HDC hdcDest,
 int nXOriginDest,
 int nYOriginDest,
 int nWidthDest,
 int hHeightDest,
 HDC hdcSrc,
 int nXOriginSrc,
 int nYOriginSrc,
 int nWidthSrc,
 int nHeightSrc,
 UINT crTransparent
);

TransparentBltでは透明さを考慮しています。
clrTransparentで示されるRGBカラーは転送で透明に表示されます。
反転することはできません。
開発環境の設定によってはmsimg32.libファイルをリンカにインポートする必要があります。

hdcSrc転送先デバイスコンテキストへのハンドル。
xDest転送先四角形の左上隅のx座標。
yDest転送先四角形の左上隅のy座標。
nDestWidth転送先四角形の幅。
nDestHeight転送先四角形の高さ。
hdcSrc転送元デバイスコンテキストへのハンドル。
xSrc転送元四角形のx座標。
ySrc転送元四角形のy座標。
nSrcWidth転送元四角形の幅。
nSrcHeight転送元四角形の高さ。
clrTransparent透明なビットマップとして扱うための転送元ビットマップのRGBカラー。



TransparentBlt( hmdc, x, y, bitmap.bmWidth, bitmap.bmHeight,
hbitdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, RGB( 0, 255, 0 ) );

Windows > グラフィック | comments (0) | trackbacks (0)

DrawText()関数


int DrawText(
 HDC hDC,
 LPCTSTR lpString,
 int nCount,
 LPRECT lpRect,
 UINT uFormat
);

テキストは、デバイスコンテキストで選択されているフォント、色、背景色で描画されます。
DrawText()関数は文字列を整形して描画するため、TextOut関数に比べて速度は遅くなります。

hDCデバイスコンテキストのハンドル
lpString描画する文字列へのポインタを指定します。
nCountが-1の場合は、NULLで終わる文字列へのポインタを指定する必要があります。
nCount文字列の文字数。
lpStringパラメータでNULLで終わる文字列を指定している時は、-1が指定できます。この場合、文字列の長さは自動的に計算されます。
lpRect長方形の論理座標が入ったRECT構造体へのポインタを指定。テキストは、この長方形内でフォーマットされます。(DT_NOCLIP指定時を除く)
uFormatテキストのフォーマット方法を指定します。次表の値を組み合わせて指定します。


ValueDescription
DT_BOTTOM長方形の下辺にテキストを揃えます。DT_SINGLELINEと同時に指定しなければなりません。
DT_CALCRECTRECT構造体で指定した長方形の幅と高さを、実際にテキストを表示する為に必要な大きさに変更します。テキストは描画しません。
DT_CENTERテキストを水平方向に中央揃えで表示します。
DT_EDITCONTROL複数行エディットコントロールが持つ属性と同じ特性で描画します。部分的に見えている最後の行は表示しません。
DT_END_ELLIPSIS指定した長方形に収まるよう、必要に応じてテキストの最後を省略符号(...)に置き換えます。
DT_PATH_ELLIPSIS指定した長方形に収まるよう、必要に応じてテキストの途中を省略符号(...)に置き換えます。パス名の描画に適しています。
DT_EXPANDTABSタブ文字を展開します。デフォルトのタブ間隔は8文字です。
DT_EXTERNALLEADING行の高さに、外部レディングの高さ(テキストの行間として適切な高さ)を加算します。通常外部レディングはテキスト行の高さに加えられません。
DT_LEFTテキストを左揃えにします。
DT_MODIFYSTRINGlpStringパラメータが指すバッファに、表示された文字列を格納します。DT_END_ELLIPSISかDT_PATH_ELLIPSISを指定した時にしか意味を持ちません。
DT_NOCLIPクリッピングをしません。描画が多少速くなります。
DT_RIGHTテキストを右揃えにします。
DT_SINGLELINEテキストを単一行で表示します。たとえ、テキストがキャリッジリターンやラインフィードを含んでいても、改行されません。
DT_TABSTOPタブ間隔を設定します。この値を指定した時は、uFormatパラメータの15ビットから8ビット(下位ワードの上位バイト)で、タブ間隔の文字数を指定します。デフォルトの文字間隔は8文字です。
DT_TOP長方形の上辺にテキストを揃えます。(単一行の時のみ)
DT_VCENTERテキストを垂直方向に中央揃えで表示します。DT_SINGLELINEと同時に指定しなければなりません。
DT_WORDBREAKテキストを複数行で表示します。折り返しは自動的に行われます。キャリッジリターンやラインフィードの組み合わせによっても折り返されます。
Windows > グラフィック | comments (0) | trackbacks (0)

AdjustWindowRect()関数


BOOL AdjustWindowRect(
 LPRECT lpRect,
 DWORD dwStyle,
 BOOL bMenu
);

クライアント領域の位置とサイズの指定から、その条件を満たす為に必要なウィンドウの位置とサイズを計算します。
得られたウィンドウの座標は、通常、CreateWindow関数でウィンドウを作成する時に使われます。

lpRectクライアント領域の座標が入ったRECT構造体へのポインタ。この構造体に指定したクライアント領域に対応するウィンドウの座標が格納される。
dwStyleウィンドウスタイルを指定します。
bMenuウィンドウがメニューを持つかどうかを指定します。メニューを持つ時はTRUEを、持たない時はFALSEを指定します。


#define SIZE_SCREEN_W 640
#define SIZE_SCREEN_H 480

RECT rcAdjWndRect; // ウィンドウサイズ修正用
SetRect( &rcAdjWndRect, 0, 0, SIZE_SCREEN_W, SIZE_SCREEN_H );
AdjustWindowRect( &rcAdjWndRect, WS_OVERLAPPEDWINDOW, FALSE );

Windows > ウィンドウの作成 | comments (0) | trackbacks (0)

LoadImage()関数


HANDLE LoadImage(
 HINSTANCE hinst,
 LPCTSTR lpszName,
 UINT uType,
 int cxDesired,
 int cyDesired,
 UINT fuLoad
);

uTypeの指定
IMAGE_BITMAPLoads a bitmap.
IMAGE_CURSORLoads a cursor.
IMAGE_ICONLoads an icon.

fuLoadの指定
LR_DEFAULTCOLORデフォルトのフラグです。
LR_CREATEDIBSECTIONDIB形式のファイルとして扱います。
LR_DEFAULTSIZEこのフラグを指定し、cxDesired(cyDesired)パラメータに0を指定すると、アイコンやカーソルのためのシステムメトリック値がイメージの幅(高さ)になります。
この値を指定せず、cxDesired(cyDesired)パラメータに0を指定すると、実際のリソースのサイズがイメージの幅(高さ)になります。
LR_LOADFROMFILElpszNameパラメータが指定するファイルからイメージをロードします。このフラグが指定されていない場合、lpszNameはリソースの名前になります。



HBITMAP hBitmap;

// リソースからロードする場合の例
hBitmap = ( HBITMAP )LoadImage(
 GetModuleHandle( NULL ) // ロードするイメージが入ったモジュールのインスタンスハンドルを指定
, MAKEINTRESOURCE( IDB_BITMAP1 ) // リソース名
, IMAGE_BITMAP // 属性
, 0 // 0かつLR_DEFAULTSIZEを含んでいない時は実際のリソースの幅
, 0 // 0かつLR_DEFAULTSIZEを含んでいない時は実際のリソースの高さ
, LR_DEFAULTCOLOR // デフォルトのフラグ
);

// ファイルからロードする場合の例
hBitmap = ( HBITMAP )LoadImage(
 NULL // ファイルをロードするときはNULLを指定
, BITMAPNAME // ファイル名
, IMAGE_BITMAP // 属性
, 0 // 幅
, 0 // 高さ
, LR_LOADFROMFILE // このフラグが指定されていない場合lpszNameはリソースの名前になる
);

if ( !hBitmap ) {
 MessageBox( hWnd, "画像のローディングに失敗しました", NULL, MB_OK | MB_ICONSTOP );
 return FALSE;
}

Windows > グラフィック | comments (0) | trackbacks (0)

メモリデバイスコンテキスト

アプリケーションがスクリーン表面にビットマップを表示する場合、
ウィンドウのデバイスコンテキストに直接ビットマップオブジェクトを
設定することはできません。
ビットマップオブジェクトは、メモリデバイスコンテキストのオブジェクトに
一度設定した後、
デバイスコンテキスト間のコピーを行う事でウィンドウへ描画されます。
CreateCompatibleDC()関数は、指定されたデバイスと
互換性のあるメモリデバイスコンテキストを作成します。

HDC CreateCompatibleDC(
 HDC hdc
);

メモリデバイスコンテキストは仮想デバイスなので、
このデバイスが扱うビットマップが必要になります。
CreateCompatibleBitmap()関数は、指定されたデバイスと
互換性のあるビットマップを作成します。

HBITMAP CreateCompatibleBitmap(
 HDC hdc,
 int nWidth,
 int nHeight
);

このビットマップを互換性のあるメモリデバイスコンテキストに
SelectObject()関数を使って設定すれば、
この仮想画面に通常のグラフィック描画関数を使って描画できます。

CreateCompatibleBitmapは使用しなくても表示は可能ですが、
いくつも画像を重ねる場合は仮想画面にまとめて描画してから
転送した方がちらつきが抑えられると言われています。


かなり抜粋

HDC hdc;
static HDC hMemDC;
static HBITMAP hBitmap;

hdc = GetDC( hWnd );
// ウィンドウと同じ仮想画面を作る
hMemDC = CreateCompatibleDC( hdc );
hBitmap = CreateCompatibleBitmap( hdc, 640, 480 );
SelectObject( hMemDC, hBitmap );
ReleaseDC( hWnd, hdc );


※デバイスコンテキストに対するオブジェクトの設定は、
そのデバイスコンテキストが解放されるまで有効です。
※オブジェクトの設定はデバイスの取得ごとに行う必要があります。
※任意に生成したカスタムオブジェクト自体は、
DeleteObject()関数によってオブジェクトが消去されるまで有効です。
カスタムオブジェクトはアプリケーションの終了時には
すべて消去していないといけません。
※デバイスコンテキストは不要になったらDeleteDC()関数を呼び出して
デバイスコンテキストを解放しなければいけません。


DeleteDC( hMemDC ); // メモリデバイスコンテキストの消去
DeleteObject( hBitmap ); // ビットマップオブジェクトの消去

Windows > グラフィック | comments (0) | trackbacks (0)

BitBlt()関数


BOOL BitBlt(
 HDC hdcDest,
 int nXDest,
 int nYDest,
 int nWidth,
 int nHeight,
 HDC hdcSrc,
 int nXSrc,
 int nYSrc,
 DWORD dwRop
);


hdcDest転送先となるデバイスコンテキスト
nXDest転送先の左上隅のx座標
nYDest転送先の左上隅のy座標
nWidth転送先の幅
nHeight転送先の高さ
hdcSrc転送元のビットマップを保持するデバイスコンテキスト
nXSrc転送元の左上隅のx座標
nYSrc転送元の左上隅のy座標
dwRop実行するラスタオペレーションを示す定数


ラスタオペレーション
BLACKNESS物理パレットのインデックス0に対応する色(デフォルトは黒)でコピー先の長方形を塗りつぶす
SRCANDコピー元の色とコピー先の色を論理AND演算子で結合する
SRCCOPYコピー元をコピー先にそのままコピーする
SRCERASEコピー先の色を反転した色とコピー元の色を論理AND演算子で結合する
SRCINVERTコピー元の色とコピー先の色を論理XOR演算子で結合する
SRCPAINTコピー元の色とコピー先の色を論理OR演算子で結合する
WHITENESS物理パレットのインデックス1に対応する色(デフォルトは白)でコピー先の長方形を塗りつぶす
Windows > グラフィック | comments (0) | trackbacks (0)

MessageBox()関数


int MessageBox(
 HWND hWnd,
 LPCTSTR lpszText,
 LPCTSTR lpszCaption,
 UINT nType
);


hWnd表示するメッセージボックスが持つ親ウィンドウを第1引数に指定します。親ウィンドウを持たない場合はNULLを渡します。
lpszTextNULLで終わる文字列へのポインタを渡します。
lpszCaptionNULLで終わる文字列へのポインタ。lpszCaptionがNULLの場合は、既定のキャプションである"エラー"が使われます。
nTypeメッセージ ボックスの内容と動作を指定します。


アイコンの指定
MB_ICONSTOP.bmpMB_ICONHAND、MB_ICONSTOP、MB_ICONERROR
MB_ICONQUESTION.bmpMB_ICONQUESTION
MB_ICONEXCLAMATION.bmpMB_ICONEXCLAMATION、MB_ICONWARNING
MB_ICONINFORMATION.bmpMB_ICONASTERISK、MB_ICONINFORMATION

基本的なスタイルの指定
MB_ABORTRETRYIGNORE[中止]、[再試行]、[無視]
MB_OK[OK](デフォルト)
MB_OKCANCEL[OK]、[キャンセル]
MB_RETRYCANCEL[再試行]、[キャンセル]
MB_YESNO[はい]、[いいえ]
MB_YESNOCANCEL[はい]、[いいえ]、[キャンセル]

戻り値
IDABORT[中止]が押された
IDCANCEL[キャンセル]が押された
IDIGNORE[無視]が押された
IDNO[いいえ]が押された
IDOK[OK]が押された
IDRETRY[再試行]が押された
IDYES[はい]が押された
Windows > ウィンドウの作成 | comments (0) | trackbacks (0)

文字列の表示


LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
 PAINTSTRUCT ps;
 HDC hdc;
 wchar_t wstr[256];
 int x=10, y=10;

 switch ( message )
 {
 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  // TODO: 描画コードをここに追加してください...
  SetTextColor( hdc, RGB( 128, 128, 128 ) ); // 文字色の色
  SetBkMode( hdc, TRANSPARENT ); // 文字の背景を透明にする
  wsprintf( wstr, L"x=%d y=%d", x, y ); // 数値の文字列化
  TextOut( hdc, 10, 10, wstr, ( int )wcslen( wstr ) ); // 文字列を表示
  EndPaint( hWnd, &ps );
  break;
 }
 return 0;
}

Windows > グラフィック | comments (0) | trackbacks (0)

BeginPaint()関数とGetDC()関数

BeginPaint()で取得されたデバイスコンテキストを用いて描画する場合は、
そのウィンドウに設定されている背景色で背景を再描画したあとグラフィックが描かれ、
さらにコントロールがある場合、それも再描画されます。
これらの描画はウィンドウ全体に対して行われるのでなく、
Windowsで設定される無効領域にだけ行われます。

これに対し、GetDC()で取得したデバイスコンテキストを用いた場合、
背景色やコントロール、無効領域に関係無く、
ウィンドウ全面にグラフィックスのみが重ね書きで描画されます。

一般に、WM_PAINTが送られた場合はBeginPaint()、
その他の場合はGetDC()といった使い分けが行われます。
Windows > グラフィック | comments (0) | trackbacks (0)

InvalidateRect()関数


BOOL InvalidateRect(
 HWND hWnd,
 CONST RECT* lpRect,
 BOOL bErase
);


hWnd更新リージョンが変更されたウィンドウを識別する。
lpRect更新リージョンに追加される長方形のクライアント座標を含むRECT構造体を指すポインタ。
NULLを設定すると、クライアント領域全体を更新リージョンに追加する。
bErase更新リージョンを処理する時に更新リージョンの背景を消去するかどうかを指定する。
TRUEならば、BeginPaint関数が呼び出された時に背景は消去される。
FALSEならば、背景はそのまま残る。


ウィンドウに「無効領域」を追加します。
ウィンドウに無効領域が出来ると、システムはWM_PAINTを送って再描画を促します。
Windows > グラフィック | comments (0) | trackbacks (0)

WM_CREATEメッセージ

CreateWindow()関数を使ってウィンドウを生成する時、
ウィンドウプロシージャにはWM_CREATEメッセージが送信されます。
WM_CREATEメッセージはウィンドウが表示される前に、ウィンドウの生成を続けるかどうかを問い合わせています。
WM_CREATEメッセージに対して0を返せばウィンドウの生成を続け、
-1を返せばウィンドウを破棄することを表します。
ウィンドウがWM_CREATEメッセージによって破棄された場合、
CreateWindow()関数は失敗しNULLを返します。
Windows > ウィンドウプロシージャ | comments (0) | trackbacks (0)

ウィンドウの破棄

ウィンドウの終了ボタンが押されるとWM_CLOSEメッセージが発行される。

DefWindowProc()関数がこのメッセージを受け取るとDestroyWindow()関数を用いてウィンドウを破棄する。

DestroyWindow()関数によってウィンドウが破棄されると
WM_DESTROYメッセージが送られる。

ウィンドウの破棄がWM_DESTROYメッセージによって通知されたら
メッセージループから抜け出してアプリケーションを終了させる為に
PostQuitMessage()関数を呼び出して
アプリケーションの終了を通知する。

PostQuitMessage()関数が呼び出されるとWM_QUITメッセージが
メッセージキューにポストされる。

GetMessage()関数はWM_QUITメッセージを受け取ると0を返すので
それを利用してメッセージループを抜けるようにする。
Windows > ウィンドウの破棄 | comments (0) | trackbacks (0)