mciGetErrorString()関数


BOOL mciGetErrorString(
 DWORD fdwError,
 LPTSTR lpszErrorText,
 UINT cchErrorText
);

指定されたMCIエラーコードについて説明するストリングを検索します。

fdwErrorError code returned by the mciSendCommand or mciSendString function.
lpszErrorTextPointer to a buffer that receives a null-terminated string describing the specified error.
cchErrorTextLength of the buffer, in characters, pointed to by the lpszErrorText parameter.

エラーコードに対応した文字列の文字数はエラーの内容によって異なりますが
最大で128文字になる可能性があると定められています。
Unicodeへの対応も考えれば256バイト以上のバッファを確保すれば十分でしょう。
Windows > マルチメディア | comments (0) | trackbacks (0)

mciSendCommand()関数


MCIERROR mciSendCommand(
 MCIDEVICEID IDDevice,
 UINT uMsg,
 DWORD fdwCommand,
 DWORD_PTR dwParam
);

IDDeviceコマンドを送信するMCIデバイスの識別子を指定します。アプリケーションは、最初にメディアデバイスを開いてこの識別子を取得する必要があります。
uMsgMCIデバイスに送信するコマンドを表す定数を指定します。
fdwCommandコマンドの追加情報となるフラグ
dwParamコマンドの情報を格納した構造体へのポインタ


MCI_OPENコマンド


static MCI_OPEN_PARMS mop;
(略)
case WM_CREATE:
 mop.dwCallback = ( DWORD )hWnd;
 mop.lpstrDeviceType = ( LPCSTR )MCI_DEVTYPE_WAVEFORM_AUDIO;
 mop.lpstrElementName = "test.wav";

 iErr = mciSendCommand( 0, MCI_OPEN,
  MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,
  ( DWORD )&mop );
 if ( iErr ) {
  mciGetErrorString( iErr, strErr, sizeof( strErr ) );
  MessageBox( hWnd, strErr, NULL, MB_OK | MB_ICONERROR );
  return -1;
 }
 break;


文字列でデバイスの種類を指定する場合は、フラグにMCI_OPEN_TYPEを組み合わさなければなりません。
定数を使ってデバイスの種類を指定する場合は、MCI_OPEN_TYPEに加えてMCI_OPEN_TYPE_IDフラグを組み合わせます。
基本的には、文字列よりも定数の方がオーバーヘッドが少なく高速な動作を期待することができます。
MCI_OPEN_ELEMENTは所定の構造体のlpstrElementNameメンバに、ファイル名が格納されている事を表します。

MCI_PLAYコマンド


case WM_LBUTTONDOWN:
 mciSendCommand( mop.wDeviceID, MCI_PLAY, 0, 0 );
 break;


正しくMCIデバイスをオープンすることができれば、MCI_PLAYコマンドをデバイスに送信する事で、コンテンツを再生する事ができます。
MCI_PLAYコマンドもデバイスの種類でさまざまなフラグや構造体を指定する事ができますが、特殊な再生方法を望まない限りは必要無いでしょう。

MCI_STOP、MCI_PAUSE、MCI_SEEKコマンド


case WM_RBUTTONDOWN:
 PlaySound( NULL, NULL, SND_PURGE );
 mciSendCommand( mop.wDeviceID, MCI_STOP, 0, 0 );
 mciSendCommand( mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0 );
 break;


再生を一時停止するにはMCI_PAUSE
停止するにはMCI_STOPコマンドを送信します。
これらのコマンドは独自のフラグや構造体を持ちません。
MCI_PAUSE、MCI_STOPの意味は対象デバイスによって異なります。
コンテンツの再生位置はMCI_SEEKコマンドで変更する事ができます。
フラグにMCI_SEEK_TO_STARTを指定すればコンテンツの先頭に移動します。
フラグと専用の構造体を指定すれば任意の位置も指定できます。

※WAVEの再生で試してみると、PlaySound関数では再生後、先頭に自動で巻き戻されるようですが
MCIコマンドでは再生後巻き戻らない(もしくは再生しっぱなし)のようで、
MCI_SEEKで再生位置を設定し直す必要があるようです。


MCI_CLOSEコマンド


case WM_DESTROY:
 mciSendCommand( mop.wDeviceID, MCI_CLOSE, 0, 0 );
 PostQuitMessage(0);
 break;


MCIデバイスの利用が終了し、デバイスが不要になれば解放しなければなりません。
デバイスを解放するにはMCI_CLOSEコマンドを送信して下さい。
MCI_CLOSEコマンドは独自のフラグや構造体を持ちません。

MCI_NOTIFYフラグ

MCI_NOTIFYフラグを使用すると、
デバイスはアクションを完了すると親ウィンドウに
MM_MCINOTIFYメッセージをポストします。
このメッセージは、コマンドが処理を終了した時に送られてきます。

MCI_PLAYコマンドにMCI_NOTIFYフラグを指定すれば、
MCIはトラックの再生が終了すると親ウィンドウに
MM_MCINOTIFYコマンドをポストするので、
このタイミングで再びトラックの先頭から再生するようにすれば
ループ再生ができます。


static MCI_OPEN_PARMS mop;
static MCI_PLAY_PARMS mpp;
(略)
case WM_CREATE:
 (デバイスのオープンの記述。上記参照)
 mpp.dwCallback = ( DWORD )hWnd;
 mpp.dwFrom = 0; // 演奏開始位置の設定、0ならば曲の先頭からになる
case WM_LBUTTONDOWN:
 mciSendCommand( mop.wDeviceID, MCI_PLAY, MCI_FROM | MCI_NOTIFY, ( DWORD )&mpp );
 break;
case WM_RBUTTONDOWN:
 mciSendCommand( mop.wDeviceID, MCI_STOP, 0, 0 );
 //mciSendCommand( mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0 );
 break;
case MM_MCINOTIFY:
 if ( wParam == MCI_NOTIFY_SUCCESSFUL )
  mciSendCommand( mop.wDeviceID, MCI_PLAY, MCI_FROM | MCI_NOTIFY, ( DWORD )&mpp );
 break;
(略)


※最初から再生開始位置を指定して再生してやれば
MCI_SEEKコマンドを使う必要も無さそうです。
Windows > マルチメディア | comments (0) | trackbacks (0)

MCI_PLAY_PARMS構造体


typedef struct {
 DWORD_PTR dwCallback;
 DWORD dwFrom;
 DWORD dwTo;
} MCI_PLAY_PARMS;

MCI_PLAY_PARMS構造体は、MCI_PLAYコマンドのための位置情報を含んでいます。

dwCallbackThe low-order word specifies a window handle used for the MCI_NOTIFY flag.
dwFromPosition to play from.
dwToPosition to play to.
Windows > マルチメディア | comments (0) | trackbacks (0)

MCI_OPEN_PARMS構造体


typedef struct {
 DWORD_PTR dwCallback;
 MCIDEVICEID wDeviceID;
 LPCSTR lpstrDeviceType;
 LPCSTR lpstrElementName;
 LPCSTR lpstrAlias;
} MCI_OPEN_PARMS;


wDeviceID開いたMCIデバイスの識別子が格納されます。開いたデバイスにMCIコマンドを送信するには、このデバイス識別子を利用します。
lpstrDeviceTypeデバイスのタイプ名を保存した文字列へのポインタ、または定数を指定します。
lpstrElementName開くMCIデバイスのコンテンツを参照するパスを指定します。
lpstrAlias開くデバイスに割り当てる別名を指定します。(任意)

MCI Device Types
MCI_ALL_DEVICE_IDAny device
MCI_DEVTYPE_ANIMATIONAnimation-playback device
MCI_DEVTYPE_CD_AUDIOCD audio device
MCI_DEVTYPE_DATDigital-audio tape device
MCI_DEVTYPE_DIGITAL_VIDEODigital-video playback device
MCI_DEVTYPE_OTHERUndefined device
MCI_DEVTYPE_OVERLAYVideo-overlay device
MCI_DEVTYPE_SCANNERScanner device
MCI_DEVTYPE_SEQUENCERMIDI sequencer device
MCI_DEVTYPE_VCRVideo-cassette recorder
MCI_DEVTYPE_VIDEODISCVideodisc player
MCI_DEVTYPE_WAVEFORM_AUDIOWaveform-audio device
Windows > マルチメディア | comments (0) | trackbacks (0)

PlaySound()関数


BOOL PlaySound(
 LPCSTR pszSound,
 HMODULE hmod,
 DWORD fdwSound
);

WAVEフォームサウンドを再生します。

pszSound再生するサウンドをNULLで終わる文字列で指定します。ただしfdwSoundパラメータでSND_MEMORYを指定した時は、メモリ内に読み込まれたサウンドイメージへのポインタを指定します。NULLを指定すると、現在再生中のWAVEフォームサウンドが停止します。
hmodfdwSoundパラメータでSND_RESOURCEを指定した場合は、ロードするリソースが入った実行可能ファイルのインスタンスハンドルを指定します。そうでない場合は、NULLを指定します。
fdwSound再生フラグヲ指定します。

フラグ抜粋
SND_ASYNCサウンドを非同期的に再生します。PlaySound関数は即座に制御を返します。非同期的に再生されているサウンドを止めるには、pszSoundパラメータにNULLを指定してPlaySound関数を呼び出します。
SND_FILENAMEpszSoundパラメータは、ファイル名です。
SND_LOOPサウンドを繰り返し再生します。SND_ASYNCと同時に指定します。サウンドの再生を止めるにはpszSoundパラメータにNULLを指定してPlaySound関数を呼び出します。
SND_MEMORYpszSoundパラメータは、メモリ内に読み込まれたサウンドイメージへのポインタです。
SND_NODEFAULT指定されたサウンドが見つからなかった場合、PlaySound関数はデフォルトのサウンド(一般の警告音)を再生することなく無音で制御を返します。
SND_NOSTOP既にほかのサウンドが再生されていた場合、指定されたサウンドを再生することなく即座に制御を返します。
SND_NOWAITドライバがビジー状態であれば、サウンドを再生することなく即座に制御を返します。
SND_PURGEサウンドの再生を停止します。pszSoundパラメータがNULL以外のときは、指定したサウンドの全てのインスタンスが停止します。pszSoundパラメータがNULLの時は、呼び出し側タスクのすべてのサウンドが停止します。SND_RESOURCE指定時は、インスタンスハンドルも指定します。
SND_RESOURCEpszSoundパラメータはリソースIDです。hmodパラメータには、リソースが入った実行可能ファイルのインスタンスハンドルを指定します。
SND_SYNCサウンドを同期的に再生します。PlaySound関数は、サウンドの再生が完了した後に制御を返します。



case WM_LBUTTONDOWN:
 PlaySound( "test.wav", NULL, SND_ASYNC | SND_FILENAME );
 break;
case WM_RBUTTONDOWN:
 PlaySound( NULL, NULL, SND_PURGE );
 break;


この関数で音声データを再生するには必ずその音声データを保存できるだけの物理メモリが必要になります。
Windows > マルチメディア | comments (0) | trackbacks (0)

パフォーマンスカウンタ


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)