BCC インラインアセンブラ tasm32

Borland C++ 5.5.1ではc言語ソースの中にアセンブラ表記を含ませアセンブルコンパイルする事が出来ます。
tasm」のダウンロードでファイルを落とし、「tasm32.exe」を[borland]->[bcc55]->[bin]のフォルダに配置すると、以下のように記述すればインラインアセンブラが使用できます。

例:

int func(int x)
{
	int y,r;

	y=16;

	_asm{
		mov	eax,	x
		mov	ebx,	y
		mov	ecx,	0
		xor	edx,	edx

		add	eax,	ebx
		mov	r,	eax
	}

	return r;
}

ウィンドウのちらつきを抑える拡張スタイル

まず宣言します。

#define	WS_EX_COMPOSITED	0x2000000

CreateWindowEx時に拡張ウィンドウスタイルに加えるだけです。

CreateWindowEx(
	WS_EX_COMPOSITED,0,0,WS_OVERLAPPEDWINDOW,
	CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
	0,0,0,0);

これでちらつきを無くせる場合があります。

BCC exeサイズを小さくするには

まずCW32TINY.zipをダウンロードします。
コンパイルしたいソースファイルのある同じフォルダにダウンロードして落としてきた3つのファイルをコピーします。後は、

bcc32 /c -x- (名前).c
ilink32 /aa c032win.obj (名前).obj, (名前).exe,,cw32tiny.lib import32.lib

でコンパイルするとexeファイルが小さくなります。

例外処理を使用したい場合は-x-オプションを省いてください。

VC++(2013)でGDI+のHBITMAP画像読込

ファイルパス名からマルチバイト文字をワイド文字に変更し、画像を読込んだ後、HBITMAPハンドルを取得する関数です。この関数ではファイル名のみを指定した場合、VC++2013から直接デバッグ実行は出来ません。

HBITMAP img(char*s)
{
	HBITMAP b = 0;	WCHAR t[256] = { 0 };

	MultiByteToWideChar(CP_THREAD_ACP, MB_PRECOMPOSED, s,-1,t,sizeof(t));
	Gdiplus::Bitmap m(t);
	m.GetHBITMAP(0, &b);
	return b;
}

exeを実行するには、エクスプローラから
[ドキュメント]→[Visual Studio 2013]→[Projects]→[(プロジェクト名)]→[Debug]or[Release]の(プロジェクト名).exeがある同じフォルダに画像ファイル等を置けば、ビルド後、[Debug]or[Release]フォルダの(プロジェクト名).exeをクリックすれば、実行し、ちゃんと画像ファイル等を読込んでくれます。

VC++ unicodeをマルチ文字セットに設定

VC++2013で(LPCSTR)や(LPCWSTR)や(LPWSTR)を使うのが面倒臭いので、VC++2013のメニューから

[プロジェクト]→[(名前)のプロパティ]→[構成プロパティ]→[全般]→[文字セット]→[マルチ バイト文字セットを使用する]→[適用]

で変更すると、いちいち文字列型型名を宣言せずに、マルチバイト文字セットでビルドやコンパイルができます。

C言語で指定範囲に納まるように画像を均等倍コピー

指定された大きさに納まるように、元デバイスコンテキストから均等倍して画像を縮小コピーする関数です。

void stc(HDC d,int w,int h,HDC f)
{
	BITMAP b;	float x,y,i;

	GetObject((HBITMAP)GetCurrentObject(f,OBJ_BITMAP),sizeof(BITMAP),&b);

	x=b.bmWidth;	y=b.bmHeight;

	if(x>w){	i=w/(x/100);	x=(x/100)*i;	y=(y/100)*i;	}
	if(y>h){	i=h/(y/100);	x=(x/100)*i;	y=(y/100)*i;	}
	SetStretchBltMode(d,COLORONCOLOR);
	StretchBlt(d,0,0,x,y,f,0,0,b.bmWidth,b.bmHeight,SRCCOPY);
}

CreateDIBSectionの作り方

DIBセクション作成関数です。

BYTE*dib(HDC d,int x,int y)
{
	HBITMAP b;	LPBITMAPINFO o;	BYTE*e;

	x=((x>>2)+((x&3)>0))<<2;

	o=(LPBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFO));
	o->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
	o->bmiHeader.biWidth=x;
	o->bmiHeader.biHeight=-y;
	o->bmiHeader.biPlanes=1;
	o->bmiHeader.biBitCount=32;

	SelectObject(d,b=CreateDIBSection(0,o,DIB_RGB_COLORS,(void**)&e,0,0));
	DeleteObject(b);

	LocalFree(o);
	return e;
}

C言語 音楽ループ再生

まずヘッダファイルをインクルードして

#include<digitalv.h>

デバイスのタイプを指定します。

openParam.lpstrDeviceType = TEXT("MPEGVideo");

MCI_PLAY時にmciSendCommandの3番目の引数にMCI_DGV_PLAY_REPEATを加えるだけです。

mciSendCommand( openParam.wDeviceID, MCI_PLAY, MCI_DGV_PLAY_REPEAT, (DWORD_PTR)&playParam );

VC++の場合

#define MCI_DGV_PLAY_REPEAT   0x10000

で設定できます。