概要

ドラッグ&ドロップされたWMAファイルのタイトル及びアルバムアートの表示を行い、タイトルの変更、画像の変更・保存を行います。

テスト環境

コンパイラ

Visual C++ 2008/2013 Express 32/64bit UNICODE

実行環境

Windows XP Professional Service Pack 3 32bit(Virtual Box上の仮想マシーン)
Windows 7 Enterprise Service Pack 1 64bit

動作例


画像にモザイクを掛けています。

プログラムソースの概要

gwmaimg3.cpp

_tWinMain

GdiplusStartupによりGDI+の初期化をします。
その後ダイアログを表示します。
ダイアログが閉じられたら、GdiplusShutdownにより終了処理を実行します。

DlgProc1

ダイアログボックスの初期化時にDlgProc1関数にWM_INITDIALOGメッセージが発生するので、ドラッグ&ドロップを許可します。
ドラッグ&ドロップ
WMAファイルがドラッグ&ドロップされるとDlgProc1関数にWM_DROPFILESメッセージが発生するので、ファイル名を取得します。
ファイル名よりWMAファイルよりWM/Pictureプロパティを取得しそのアドレスとサイズからJpegイメージをメモリに取得します。
ファイルサイズ分のメモリをGlobalAlloc APIで確保しハンドルを取得します。その後メモリをロックし先頭のアドレスを取得します。
そのアドレスに先ほど読み込んだJpegイメージをコピーします。
メモリをストリームとして扱うため、CreateStreamOnHGlobal を実行しメモリストリームのハンドルを得ます。
Imageオブジェクトを作成し、それをDrawImageにより描画します。
WMAファイルにアルバムアートがない場合は、スタティックウィンドウを消去します。
画像保存ボタン
ボタンがクリックされると、DlgProc1関数にWM_COMMANDメッセージが発生するので、画像保存ボタンのメッセージの場合、保存ファイル名を取得するコモンダイアログボックスを表示します。ファイル名が取得できたらファイルを開き、メモリ上に保存されたWM_PICTUREを保存します。
画像変更ボタン
ボタンがクリックされると、DlgProc1関数にWM_COMMANDメッセージが発生するので、画像変更ボタンのメッセージの場合、Jpegファイル名を取得するコモンダイアログボックスを表示します。ファイル名が取得できたらファイルを開き、ドラッグ&ドロップと同様にメモリ上にJpegイメージを展開します。
OKボタン
ボタンがクリックされると、DlgProc1関数にWM_COMMANDメッセージが発生するので、OKボタンのメッセージの場合、WMAファイルのタイトル等及び画像を変更し終了します。

ソースコード

gwmaimg3.cpp

// ドラッグ&ドロップされたWMAファイルのタイトル等・画像の表示・変更・保存をする。

#include <windows.h>
#include <gdiplus.h>
#include <tchar.h>
#include <wmsdk.h>
#include <iostream>
#include "resource.h"

#pragma comment(lib,"wmvcore.lib")
#pragma comment(lib,"gdiplus.lib")


// 読込ファイル名の取得
BOOL GetFileName(TCHAR* fname,int sz);

// ダイアログボックスのプロシージャー
LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);	// ダイアログボックスのプロシージャー

//	メモリストリームを作成する
bool jpg_stream(IStream** pIStream,BYTE** jpg_mem,int sz,HGLOBAL* hBuf);

//	メモリストリームより画像を表示
void jpg_mem_draw(HWND hS,HDC hdc,IStream* pIStream,int sz);

//	ウィンドウクリア
void win_clear(HWND hS,HDC hdc);

// WMAファイルのタイトル・画像等を取得する
bool wma_title_get(IWMMetadataEditor* pEditor,TCHAR* fname,WM_PICTURE** pP,int* sz);

// WMAファイルのタイトル・画像等を変更する
bool wma_title_chg(IWMMetadataEditor* pEditor,TCHAR* fname);

BOOL InitApp(HINSTANCE, WNDPROC, TCHAR*);
BOOL InitInstance(HINSTANCE, TCHAR*, int);

using namespace	Gdiplus;
GdiplusStartupInput	gdiSI;
ULONG_PTR	gdiToken;
HWND hDlg;
BYTE* jpg_mem=0;
int sz;


int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInst,TCHAR* lpszCmdLine, int nCmdShow){
	GdiplusStartup(&gdiToken, &gdiSI, NULL);
	DialogBox(hInstance, TEXT("DLG1"), 0, (DLGPROC)DlgProc1);
	GdiplusShutdown(gdiToken);
	return 0;
}

// ダイアログボックスのプロシージャー

LRESULT CALLBACK DlgProc1(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
	TCHAR buf[MAX_PATH];
	HDROP hDrop;
	UINT fmax;
	HRESULT hr;
	IWMMetadataEditor* pEditor=NULL;
	static HGLOBAL hBuf=0;
	static IStream* pIStream=0;
	static WM_PICTURE* pP;
	HDC hdc;
	FILE* fp;
	int	i;
	switch (msg) {
		case WM_INITDIALOG:
			::hDlg=hDlg;
			DragAcceptFiles(hDlg, TRUE);
			return TRUE;
		case WM_DROPFILES:
			if(jpg_mem){
				jpg_mem=0;
				pIStream->Release();
				GlobalFree(hBuf);
				hBuf=0;
				sz=0;
				pIStream=0;
				pP=0;
			}
			hDrop = (HDROP)wParam;
			fmax = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
			i=fmax-1;
			DragQueryFile(hDrop, i, buf, sizeof(buf)/sizeof(TCHAR));
			SetWindowText(hDlg,buf);
			DragFinish(hDrop);
			hr=WMCreateEditor(&pEditor);	// オブジェクトを作成
			if(wma_title_get(pEditor,buf,&pP,&sz)==true){
				if(jpg_stream(&pIStream,&jpg_mem,sz,&hBuf)==false)
					MessageBox(hDlg,_TEXT("メモリ確保に失敗しました。"),_TEXT("エラー"),MB_OK);
				CopyMemory(jpg_mem,pP->pbData,sz);
				delete [] pP;
				if(jpg_mem){
					HWND hS=GetDlgItem(hDlg,IDC_STATIC100);
					hdc = GetDC(hS);
					win_clear(hS,hdc);
					jpg_mem_draw(hS,hdc,pIStream,sz);
					ReleaseDC(hS, hdc);
				}
			}else{	//	アルバムアートがない場合
				SetWindowText(GetDlgItem(hDlg,IDC_LABEL2),_TEXT(""));
				SetWindowText(GetDlgItem(hDlg,IDC_LABEL3),_TEXT(""));

				HWND hS=GetDlgItem(hDlg,IDC_STATIC100);
				hdc = GetDC(hS);
				win_clear(hS,hdc);
				ReleaseDC(hS, hdc);
			}
		case WM_COMMAND:
			switch (LOWORD(wParam)) {
				case IDOK:
					GetWindowText(hDlg,buf,sizeof(buf)/sizeof(TCHAR));
					hr=WMCreateEditor(&pEditor);	// オブジェクトを作成
					wma_title_chg(pEditor,buf);
					EndDialog(hDlg,FALSE);
					return TRUE;
				case IDCANCEL:
					EndDialog(hDlg,FALSE);
					return TRUE;
				case IDC_CHG:
					if(GetFileName(buf,sizeof(buf)/sizeof(TCHAR)))
						if(_tfopen_s(&fp,buf,_TEXT("rb"))==0){
							fseek(fp,0,SEEK_END);
							sz=ftell(fp);
							fseek(fp,0,SEEK_SET);
							if(jpg_stream(&pIStream,&jpg_mem,sz,&hBuf)==false){
								MessageBox(hDlg,_TEXT("メモリ確保に失敗しました。"),_TEXT("エラー"),MB_OK);
								EndDialog(hDlg,FALSE);
							}
							fread(jpg_mem,sizeof(BYTE),sz,fp);
							fclose(fp);
							if(jpg_mem){
								HWND hS=GetDlgItem(hDlg,IDC_STATIC100);
								hdc = GetDC(hS);
								win_clear(hS,hdc);
								jpg_mem_draw(hS,hdc,pIStream,sz);
								ReleaseDC(hS, hdc);
							}
						}
					return TRUE;
				case IDC_SAVE:
					if(jpg_mem){
						if(GetFileName(buf,sizeof(buf)/sizeof(TCHAR))){
							if(_tfopen_s(&fp,buf,_TEXT("wb"))==0){
								fwrite(jpg_mem,sizeof(BYTE),sz,fp);
								fclose(fp);
							}
						}
					}
					return TRUE;
				default:
					return FALSE;
			}
			default:
				return FALSE;
	}
	return TRUE;
}

//	メモリストリームを作成する

bool jpg_stream(IStream** pIStream,BYTE** jpg_mem,int sz,HGLOBAL* hBuf){
	*hBuf=GlobalAlloc(GMEM_MOVEABLE,sz);
	if(*hBuf==0){
		MessageBox(0,_TEXT("GlobalAlloc APIでのメモリの確保に失敗しました"),_TEXT("エラー"),MB_OK);
		return false;
	}
	*jpg_mem=(BYTE*)GlobalLock(*hBuf);
	if(*jpg_mem==0){
		MessageBox(0,_TEXT("GlobalLock APIでのメモリのロックに失敗しました"),_TEXT("エラー"),MB_OK);
		GlobalFree(*hBuf);
		return false;
	}
	*pIStream=0;
	if(CreateStreamOnHGlobal(*hBuf,FALSE,pIStream)!=S_OK){
		MessageBox(0,_TEXT("CreateStreamOnHGlobal APIでのメモリストリームの作成に失敗しました"),_TEXT("エラー"),MB_OK);
		GlobalFree(*hBuf);
		return false;
	}
	return true;
}

//	メモリストリームより画像を表示

void jpg_mem_draw(HWND hS,HDC hdc,IStream* pIStream,int sz){
	TCHAR buf[32];
	RECT rect;
	GetWindowRect(hS,&rect);
	int sx=rect.right-rect.left;
	int sy=rect.bottom-rect.top;
	float sa=float(sx)/float(sy);
	Graphics MyGraphics(hdc);
	Image myImage(pIStream);

	_stprintf_s(buf,sizeof(buf)/sizeof(TCHAR),_TEXT("%i*%i"),myImage.GetWidth(),myImage.GetHeight());
	SetWindowText(GetDlgItem(hDlg,IDC_LABEL2),buf);

	_stprintf_s(buf,sizeof(buf)/sizeof(TCHAR),_TEXT("%iBytes"),sz);
	SetWindowText(GetDlgItem(hDlg,IDC_LABEL3),buf);

	float pas=float(myImage.GetWidth())/float(myImage.GetHeight());
	if(sa>pas){	//	ウィンドウのほうが横長の場合
		float ssx=sy*pas;
		MyGraphics.DrawImage(&myImage, int((sx-ssx)/2), 0,int(ssx),sy);
	}else{
		float ssy=sx/pas;
		MyGraphics.DrawImage(&myImage, 0, int((sy-ssy)/2),sx,int(ssy));
	}
}

//	ウィンドウクリア

void win_clear(HWND hS,HDC hdc){
	RECT rect;
	GetWindowRect(hS,&rect);
	int sx=rect.right-rect.left;
	int sy=rect.bottom-rect.top;
	HPEN hPen, hOldPen;
	HBRUSH hBrush, hOldBrush;
	hPen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
	hOldPen = (HPEN)SelectObject(hdc, hPen);
	hBrush = CreateHatchBrush(BS_SOLID, RGB(255, 255, 255));
	hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
	Rectangle(hdc, 0, 0, sx, sy);
	SelectObject(hdc, hOldPen);
	SelectObject(hdc, hOldBrush);
	DeleteObject(hPen);
	DeleteObject(hBrush);
}

// 読込ファイル名の取得

BOOL GetFileName(TCHAR* fname,int sz){
	OPENFILENAME o;
	fname[0]=_T('\0');
	ZeroMemory(&o,sizeof(o));
	o.lStructSize=sizeof(o);
	o.Flags=0;
	o.lpstrFile=fname;
	o.nMaxFile=sz;
	o.lpstrFilter=_TEXT("JPEG(*.JPG)\0");
	o.nFilterIndex=1;
	return GetOpenFileName(&o);
}

// WMAファイルのタイトル・画像等を取得する

bool wma_title_get(IWMMetadataEditor* pEditor,TCHAR* fname,WM_PICTURE** pP,int* sz){

	bool flag=false;
	HRESULT hr;
	IWMHeaderInfo3* pHeaderInfo=NULL;

	hr=pEditor->Open(fname);
	pEditor->QueryInterface(IID_IWMHeaderInfo3,(void**)&pHeaderInfo);

	WORD wStreamNum = 0;
	WMT_ATTR_DATATYPE Type;
	WORD cbLength=0;

	TCHAR* getname;
	TCHAR pwszTitle[1024];
	*pP=0;


	//	タイトルを取得
	Type=WMT_TYPE_STRING;
	getname=_TEXT("Title");
	hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
	hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
	SetWindowText(GetDlgItem(hDlg,IDC_TITLE),pwszTitle);

//	参加アーティストを取得
	Type=WMT_TYPE_STRING;
	getname=_TEXT("Author");
	pwszTitle[0]=_T('\0');
	hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
	hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
	SetWindowText(GetDlgItem(::hDlg,IDC_AUTHOR),pwszTitle);
	
	//	アルバムアーティストを取得
	Type=WMT_TYPE_STRING;
	getname=_TEXT("WM/AlbumArtist");
	pwszTitle[0]=_T('\0');
	hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
	hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
	SetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_ARTIST),pwszTitle);

	//	アルバムタイトルを取得
	Type=WMT_TYPE_STRING;
	getname=_TEXT("WM/AlbumTitle");
	pwszTitle[0]=_T('\0');
	hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
	hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
	SetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_TITLE),pwszTitle);

	//	トラック番号を取得
	Type=WMT_TYPE_STRING;
	getname=_TEXT("WM/TrackNumber");
	pwszTitle[0]=_T('\0');
	hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
	hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) pwszTitle, &cbLength );
	if (Type == WMT_TYPE_DWORD){
		DWORD v = *((DWORD *)pwszTitle);
		_stprintf_s(pwszTitle, sizeof(pwszTitle) / sizeof(TCHAR), _TEXT("%i"), v);
	}
	SetWindowText(GetDlgItem(::hDlg,IDC_TRACK_NUMBER),pwszTitle);

	//	画像の取得

	Type=WMT_TYPE_BINARY;
	getname=(TCHAR*)g_wszWMPicture;

	hr=pHeaderInfo->GetAttributeByName(&wStreamNum,getname,&Type, NULL, &cbLength );
	*sz=cbLength;
	if( ! FAILED(hr)){
		if( cbLength){
			*pP=(WM_PICTURE*) new BYTE[cbLength];
			hr = pHeaderInfo->GetAttributeByName( &wStreamNum, getname, &Type,(BYTE *) *pP, &cbLength );
			if(! FAILED(hr)){
				flag=true;
			}
		}
	}
	pEditor->Close();
	return flag;
}

TCHAR* errstr(HRESULT v){
	switch(v){
		case S_OK:	return _TEXT("成功");
		case E_INVALIDARG:	return _TEXT("違法なパラメータの組合せ、データ型または属性が、使われました。");
		case E_NOTIMPL:	return _TEXT("実装されません。");
		case E_POINTER:	return _TEXT("ポインターは、有効でありません");
		case NS_E_ATTRIBUTE_READ_ONLY:	return _TEXT("属性は変わることができません。");
		case NS_E_INVALID_REQUEST:	return _TEXT("wStreamNumは有効な番号でありません、または、属性がwIndexにありません");
		default: return _TEXT("不明なエラーです。");
	}
}

// WMAファイルのタイトル・画像等を変更する

bool wma_title_chg(IWMMetadataEditor* pEditor,TCHAR* fname){
	bool flag=false;
	HRESULT hr;
	IWMHeaderInfo3* pHeaderInfo=NULL;

	hr=pEditor->Open(fname);
	pEditor->QueryInterface(IID_IWMHeaderInfo3,(void**)&pHeaderInfo);

	WORD wStreamNum = 0;
	WMT_ATTR_DATATYPE Type;
	WORD cbLength=0;

	TCHAR* getname;
	TCHAR pwszTitle[1024];

	//	タイトルを変更
	Type=WMT_TYPE_STRING;
	getname=_TEXT("Title");
	GetWindowText(GetDlgItem(::hDlg,IDC_TITLE),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
	cbLength=(WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
	hr = pHeaderInfo->SetAttribute( wStreamNum, getname, Type,(BYTE *) pwszTitle, cbLength );

	//	参加アーティストを変更
	Type=WMT_TYPE_STRING;
	getname=_TEXT("Author");
	GetWindowText(GetDlgItem(::hDlg,IDC_AUTHOR),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
	cbLength = (WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
	hr = pHeaderInfo->SetAttribute( wStreamNum, getname, Type,(BYTE *) pwszTitle, cbLength );

	//	アルバムアーティストを変更
	Type=WMT_TYPE_STRING;
	getname=_TEXT("WM/AlbumArtist");
	GetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_ARTIST),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
	cbLength = (WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
	hr = pHeaderInfo->SetAttribute( wStreamNum, getname, Type,(BYTE *) pwszTitle, cbLength );

	//	アルバムタイトルを変更
	Type=WMT_TYPE_STRING;
	getname=_TEXT("WM/AlbumTitle");
	GetWindowText(GetDlgItem(::hDlg,IDC_ALBUM_TITLE),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
	cbLength = (WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
	hr = pHeaderInfo->SetAttribute( wStreamNum, getname, Type,(BYTE *) pwszTitle, cbLength );

	//	トラック番号を変更
	Type = WMT_TYPE_STRING;
	getname=_TEXT("WM/TrackNumber");
	GetWindowText(GetDlgItem(::hDlg,IDC_TRACK_NUMBER),pwszTitle,sizeof(pwszTitle)/sizeof(TCHAR));
	cbLength = (WORD)_tcslen(pwszTitle)*sizeof(TCHAR);
	hr = pHeaderInfo->SetAttribute(wStreamNum, getname, Type, (BYTE *)pwszTitle, cbLength);

	//	WM/Pictureを検索
	WORD cAttr=0;
	DWORD cbValue=0;
	int index=-1;
	hr = pHeaderInfo->GetAttributeCountEx(0xffff,&cAttr);
	for(int i=0;i<cAttr;i++){
		cbLength=sizeof(pwszTitle)/sizeof(TCHAR);
		hr=pHeaderInfo->GetAttributeByIndexEx(wStreamNum,i,pwszTitle,&cbLength,&Type,NULL,NULL,&cbValue);
		if(_tcscmp(pwszTitle,g_wszWMPicture)==0){
			index=i;
			break;
		}
	}
	//	画像を変更
	WM_PICTURE pP;
	Type=WMT_TYPE_BINARY;
	getname=(TCHAR*)g_wszWMPicture;
	pP.bPictureType=3;
	pP.dwDataLen=sz;
	pP.pbData=jpg_mem;
	pP.pwszDescription=_TEXT("");
	pP.pwszMIMEType=_TEXT("image/jpeg");
	cbLength = (WORD)(sz+(_tcslen(pP.pwszDescription)+_tcslen(pP.pwszMIMEType)+2)*sizeof(TCHAR)+sizeof(pP));
	WORD d=0;
	if(index<0)
		hr=pHeaderInfo->AddAttribute(wStreamNum, getname,&d,Type,0,(BYTE*)&pP,cbLength);
	else
		hr=pHeaderInfo->ModifyAttribute(wStreamNum, index, Type,0,(BYTE*)&pP,cbLength);
	if(hr!=S_OK){
		MessageBox(0,errstr(hr),_TEXT("Set/Modify Attribute API Error"),MB_OK);

	}
	pHeaderInfo->Release();
	pEditor->Flush();
	return flag;
}

resource.h

#define IDC_STATIC100 2001
#define IDC_CHG 2003
#define IDC_LABEL2 2004
#define IDC_LABEL3 2005
#define IDC_SAVE 2006

#define IDC_TITLE	2011
#define IDC_AUTHOR	2012
#define IDC_ALBUM_ARTIST	2013
#define IDC_ALBUM_TITLE	2014
#define IDC_TRACK_NUMBER	2015

resource.rc

#include <windows.h>
#include "resource.h"


DLG1 DIALOG DISCARDABLE  0, 0, 320, 252
STYLE DS_MODALFRAME | WS_POPUP
CAPTION "WMAファイル画像表示"
FONT 9, "MS Pゴシック"
BEGIN
	CONTROL "タイトル(Title)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 8, 96, 14
	CONTROL "", IDC_TITLE, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 7, 203, 14

	CONTROL "参加アーティスト(Author)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 29, 96, 14
	CONTROL "", IDC_AUTHOR, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 28, 203, 14

	CONTROL "アルバムアーティスト(WM/AlbumArtist)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 50, 96, 28
	CONTROL "", IDC_ALBUM_ARTIST, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 49, 203, 14

	CONTROL "アルバム(WM/AlbumTitle)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 71, 96, 28
	CONTROL "", IDC_ALBUM_TITLE, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 70, 203, 14

	CONTROL "トラック番号(WM/TrackNumber)", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 92, 96, 28
	CONTROL "", IDC_TRACK_NUMBER, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 110, 91, 203, 14

	CONTROL "", IDC_STATIC100, "STATIC", WS_CHILD | WS_VISIBLE | SS_SUNKEN | SS_NOTIFY, 7, 127, 90, 90
	LTEXT	"",IDC_LABEL2,110,127,57,10
	LTEXT	"",IDC_LABEL3,110,144,57,10

	DEFPUSHBUTTON	"OK(&O)",IDOK,4,231,50,14
	PUSHBUTTON	"キャンセル(&C)",IDCANCEL,62,231,50,14

	PUSHBUTTON	"画像保存(&S)",IDC_SAVE,120,231,50,14
	PUSHBUTTON	"画像変更(&M)",IDC_CHG,178,231,50,14
END

実行ファイルとソースファイルのダウンロード