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

まず宣言します。

#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

で設定できます。

C言語Win32APIだけで乱数

DWORD rnd(DWORD n)
{
	HCRYPTPROV p;	DWORD r;

	//乱数初期化
	CryptAcquireContext(&p, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
	//乱数生成
	CryptGenRandom(p, sizeof(r), (BYTE*)&r);
	//解放
	CryptReleaseContext(p, NULL);

	return r%n;
}