8.1 マウス・カーソルの変更 (1) マウスカーソルの動的な変更 #include "myWin.h" HCURSOR hc; LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CREATE :hc=LoadCursor(NULL,IDC_ARROW); SetCursor(hc); return 0; case WM_LBUTTONUP:hc=LoadCursor(NULL,IDC_CROSS); SetCursor(hc); break; case WM_RBUTTONUP:hc=LoadCursor(NULL,IDC_ARROW); SetCursor(hc); return 0; case WM_SETCURSOR: SetCursor(hc); return 0; } return DefWindowProc(hw,msg,wp,lp); } ? (2) マウスカーソルの表示と消去 #include "myWin.h" LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0); return 0; case WM_LBUTTONUP : ShowCursor(FALSE) ; break; case WM_RBUTTONUP : ShowCursor(TRUE) ; return 0; } return DefWindowProc(hw,msg,wp,lp); } (3) カスタムマウスカーソル 【リソースファイル】mycur.rc MYCUR CURSOR "mycur.cur" 【ソースプログラム】 #include "myWin.h" LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; } return DefWindowProc(hw,msg,wp,lp); } 【myWin.h】initInstのみ変更 BOOL initApp(HINSTANCE hCurI){ WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS; wc.lpfnWndProc = WndProc; wc.cbClsExtra = wc.cbWndExtra=0; wc.hInstance = hCurI; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(hCurI,TEXT("MYCUR")); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("クラス名"); return RegisterClass(&wc); } 8.2 クリップボード (3) クリップボードにデータを書き込む #include "myWin.h" static HGLOBAL hg; static PTSTR strMem; static TCHAR strDT[]=TEXT("ふいに世界がふりかえり\r\n") TEXT("光のなかで こちらを向く\r\n") TEXT("\r\n 村野四郎『新年』より\r\n"); void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ if(!OpenClipboard(hw)){ MessageBox(hw,TEXT("他のプロセスがクリップボードを使用中です"), TEXT("エラー"), MB_OK); return; } EmptyClipboard(); hg=GlobalAlloc(GHND|GMEM_SHARE,128); strMem=(PTSTR)GlobalLock(hg); lstrcpy(strMem,strDT); GlobalUnlock(hg); SetClipboardData(CF_UNICODETEXT, hg); CloseClipboard(); MessageBox(hw,TEXT("転送しました"),TEXT("正常"), MB_OK); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_LBUTTONUP: procLButtonUp(hw, wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); } (4) クリップボードからデータを取得 #include "myWin.h" static HGLOBAL hg; static PTSTR strDT, strClip; void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ if(OpenClipboard(hw)){ if(hg = GetClipboardData(CF_UNICODETEXT)){ strDT =(PTSTR) malloc(GlobalSize(hg)); strClip=(PTSTR)GlobalLock(hg); lstrcpy(strDT,strClip);GlobalUnlock(hg); CloseClipboard(); MessageBox(hw,strDT,TEXT("クリップボード"),MB_OK); } else CloseClipboard(); } } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; ret urn 0; case WM_LBUTTONUP: procLButtonUp(hw, wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); } (5) クリップボードのBMPを表示する #include "myWin.h" static HBITMAP hB; void procCreate(HWND hw, WPARAM wp,LPARAM lp){ if(OpenClipboard(hw))hB = (HBITMAP)GetClipboardData(CF_BITMAP); CloseClipboard(); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw,&ps); HDC hBuff=CreateCompatibleDC(hdc); SelectObject(hBuff,hB); BitBlt(hdc,10,10,1366,768,hBuff,0,0,SRCCOPY); DeleteDC(hBuff); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate (hw, wp,lp); return 0; case WM_PAINT : procPaint (hw, wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); } 8.3 ファイルダンプ (2) ファイルダンププログラム例 #include "myWin.h" #define ED_1 1 static HWND edit;HANDLE hF; static OPENFILENAME CC;unsigned char dtBuff[16]; static TCHAR strFile[1024],strFileTitle[128];TCHAR msg[4200]; static TCHAR sFilter[]=TEXT("Bmp Files\0*.bmp\0All Files\0*.*\0"); void fileDump(HANDLE hF){ DWORD wReadSize; TCHAR dt[10]; lstrcpy(msg, TEXT(" Address +0 +1 +2 +3 +4 +5 +6 +7") TEXT(" +8 +9 +A +B +C +D +E +F")); int Add=0,k=lstrlen(msg); while(ReadFile(hF,dtBuff,16,&wReadSize,NULL)){ if(wReadSize==0) break; msg[k++]=TCHAR('\r');msg[k++]=TCHAR('\n');//改行 wsprintf(dt,TEXT("%08X"),Add); //アドレス表示 for(int j=0;j<8;j++)msg[k++]=dt[j]; msg[k++]=TCHAR(' '); for(int i=0;i<(int)wReadSize;i++){ //読込みデータ表示 wsprintf(dt,TEXT("%02X"),dtBuff[i]); msg[k++]=dt[0];msg[k++]=dt[1];msg[k++]=TCHAR(' '); Add++; } msg[k++]=TCHAR('*'); for(int i=0;i<(int)wReadSize;i++){ //ASCII表示可能文字を右に表示 if(dtBuff[i]>=0x20 && dtBuff[i]<=0x7E) msg[k++]=dtBuff[i]; else msg[k++]=TCHAR('.'); } if(k>=4096) break;//2048バイトまで表示 } msg[k++]=0; SetWindowText(edit,msg); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ //コントロール設定 edit=CreateWindow(TEXT("EDIT"),NULL, WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL| ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_LEFT|ES_MULTILINE, 0,0,800,200,hw,(HMENU)ED_1,hInstance,NULL); //ファイルを開くダイアログ CC.lStructSize =sizeof(OPENFILENAME); CC.hwndOwner =hw ; CC.hInstance =hInstance; CC.lpstrFilter =sFilter ; CC.nFilterIndex =1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile =strFile ; CC.nMaxFile =1024; CC.lpstrFileTitle =strFileTitle; CC.nMaxFileTitle =128; CC.lpstrInitialDir =TEXT("D:\\"); CC.lpstrTitle =TEXT("ファイルダンプ"); CC.lpstrDefExt =TEXT("bmp") ; CC.FlagsEx =0; CC.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_DONTADDTORECENT | OFN_NOTESTFILECREATE; if(GetOpenFileName(&CC)){ hF=CreateFile(CC.lpstrFile,GENERIC_READ, 0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); if(hF==INVALID_HANDLE_VALUE){ MessageBox(hw,TEXT("ファイルオープンエラー"), TEXT("エラー"),MB_OK); return; } fileDump(hF);CloseHandle(hF); } } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } 8.4 BMPファイル (4) DIB情報ヘッダ #include "myWin.h" static OPENFILENAME CC;HANDLE hF; static BITMAPFILEHEADER bH;static BITMAPINFOHEADER bI; static TCHAR strFile[2048],strFileTitle[128]; static TCHAR sFilter[]=TEXT("BMP Files\0*.bmp\0All Files\0*.*\0"); void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize=sizeof(OPENFILENAME); CC.hwndOwner=hw ; CC.hInstance=hInstance; CC.lpstrFilter=sFilter ; CC.nFilterIndex=1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile=strFile ; CC.nMaxFile=2048; CC.lpstrFileTitle=strFileTitle ; CC.nMaxFileTitle=128; CC.lpstrInitialDir=TEXT("D:\\"); CC.lpstrTitle=TEXT("テストだよ") ; CC.lpstrDefExt=TEXT("bmp") ; CC.Flags=0; } void bcDump(unsigned char DT[],int N){ TCHAR str[10],buff[256];int j=0; for(int i=0;irgbRed, (pClr+i)->rgbGreen, (pClr+i)->rgbBlue))); Rectangle(hdc,X,Y,X+90,Y+20); X+=100;if(X>500){Y+=30; X=10;} DeleteObject(SelectObject(hdc,GetStockObject(WHITE_BRUSH))); } EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : free(pClr); PostQuitMessage(0);return 0; case WM_CREATE : procCreate (hw,wp,lp);return 0; case WM_LBUTTONUP : procLButtonDown(hw,wp,lp);break; case WM_PAINT : procPaint (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (6) ピクセルデータとして表示 #include "myWin.h" static OPENFILENAME CC;HANDLE hF; static BITMAPFILEHEADER bH;static BITMAPINFOHEADER bI; static RGBQUAD *pClr; char *chPxBit; static TCHAR strFile[2048],strFileTitle[128]; static TCHAR sFilter[]=TEXT("BMP Files\0*.bmp\0All Files\0*.*\0"); static int icTabLen; void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize=sizeof(OPENFILENAME); CC.hwndOwner=hw ; CC.hInstance=hInstance; CC.lpstrFilter=sFilter ; CC.nFilterIndex=1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile=strFile ; CC.nMaxFile=2048; CC.lpstrFileTitle=strFileTitle ; CC.nMaxFileTitle=128; CC.lpstrInitialDir=TEXT("D:\\"); CC.lpstrTitle=TEXT("テストだよ") ; CC.lpstrDefExt=TEXT("bmp") ; CC.FlagsEx=0; CC.Flags=0; } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ DWORD dwBytes; if(GetOpenFileName(&CC)){ hF=CreateFile(strFile,GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hF==INVALID_HANDLE_VALUE) { MessageBox(hw,TEXT("ファイルオープンエラー"), TEXT("エラー"),MB_OK); return; } ReadFile(hF,&bH,sizeof(BITMAPFILEHEADER),&dwBytes,NULL); if(bH.bfType!=0x4D42){ MessageBox(hw,TEXT("BMPファイルではありません"),NULL,MB_OK); CloseHandle (hF); return; } ReadFile(hF,&bI,sizeof(BITMAPINFOHEADER),&dwBytes,NULL); if(bI.biBitCount>=24) { icTabLen=0;pClr=NULL; } else{ icTabLen=sizeof(RGBQUAD)*(1<=0 ;Y--){ for(int X=0; X < NX; X++){ SetPixel(hdc,X,Y, RGB(chPxBit[i+2],chPxBit[i+1],chPxBit[i])); i +=3; } i = iLine * widthByte; iLine++;//行×1行のバイト数 } EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : free(pClr); PostQuitMessage(0);return 0; case WM_CREATE : procCreate (hw,wp,lp);return 0; case WM_LBUTTONUP : procLButtonDown(hw,wp,lp);break; case WM_PAINT : procPaint (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (7) デバイスに表示 #include "myWin.h" static BITMAPFILEHEADER bH;static BITMAPINFO bI;//構造体を変更 static RGBQUAD *pClr; BYTE *bPxBit; //charをBYTEに変更 static TCHAR strFile[2048],strFileTitle[128]; static TCHAR sFilter[]=TEXT("BMP Files\0*.bmp\0All Files\0*.*\0"); static int icTabLen; void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize=sizeof(OPENFILENAME); CC.hwndOwner=hw ; CC.hInstance=hInstance; CC.lpstrFilter=sFilter ; CC.nFilterIndex=1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile=strFile ; CC.nMaxFile=2048; CC.lpstrFileTitle=strFileTitle ; CC.nMaxFileTitle=128; CC.lpstrInitialDir=TEXT("D:\\"); CC.lpstrTitle=TEXT("テストだよ") ; CC.lpstrDefExt=TEXT("bmp") ; CC.FlagsEx=0; CC.Flags=0; } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ DWORD dwBytes; if(GetOpenFileName(&CC)){ hF=CreateFile(strFile,GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hF==INVALID_HANDLE_VALUE) { MessageBox(hw,TEXT("ファイルオープンエラー"),TEXT("エラー"),MB_OK); return; } ReadFile(hF,&bH,sizeof(BITMAPFILEHEADER),&dwBytes,NULL); if(bH.bfType!=0x4D42){ MessageBox(hw,TEXT("BMPファイルではありません"),NULL,MB_OK); CloseHandle (hF); return; } ReadFile(hF,&bI,sizeof(BITMAPINFOHEADER),&dwBytes,NULL); // 24 bitsのみを対象とする bPxBit=(BYTE *)malloc(bH.bfSize-bH.bfOffBits); ReadFile(hF,bPxBit,bH.bfSize-bH.bfOffBits,&dwBytes,NULL); CloseHandle (hF); InvalidateRect(hw,NULL,FALSE); } } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; DWORD w=bI.bmiHeader.biWidth, h=bI.bmiHeader.biHeight; HDC hdc=BeginPaint(hw,&ps); SetDIBitsToDevice(hdc, 0, 0, w, h, 0, 0, 0, h, bPxBit, &bI, DIB_RGB_COLORS); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : free(pClr); PostQuitMessage(0);return 0; case WM_CREATE : procCreate (hw,wp,lp);return 0; case WM_LBUTTONUP : procLButtonDown(hw,wp,lp);break; case WM_PAINT : procPaint (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (8) 逐次表示 #include "myWin.h" static OPENFILENAME CC;HANDLE hF; static BITMAPFILEHEADER bH;static BITMAPINFO bI; static BYTE *bPxBit=NULL; static TCHAR strFile[2048],strFileTitle[128]; static TCHAR sFilter[]=TEXT("BMP Files\0*.bmp\0All Files\0*.*\0"); static int icTabLen, WIDTH; void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize=sizeof(OPENFILENAME); CC.hwndOwner=hw ; CC.hInstance=hInstance; CC.lpstrFilter=sFilter ; CC.nFilterIndex=1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile=strFile ; CC.nMaxFile=2048; CC.lpstrFileTitle=strFileTitle ; CC.nMaxFileTitle=128; CC.lpstrInitialDir=TEXT("D:\\"); CC.lpstrTitle=TEXT("テストだよ") ; CC.lpstrDefExt=TEXT("bmp") ; CC.FlagsEx=0; CC.Flags=0; DWORD dwBytes; if(GetOpenFileName(&CC)){ hF=CreateFile(strFile,GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hF==INVALID_HANDLE_VALUE) { MessageBox(hw,TEXT("ファイルオープンエラー"),TEXT("エラー"),MB_OK); return; } ReadFile(hF,&bH,sizeof(BITMAPFILEHEADER),&dwBytes,NULL); if(bH.bfType!=0x4D42){ MessageBox(hw,TEXT("BMPファイルではありません"),NULL,MB_OK); return; } ReadFile(hF,&bI,sizeof(BITMAPINFOHEADER),&dwBytes,NULL); free(bPxBit);int w=bI.bmiHeader.biWidth, b=bI.bmiHeader.biBitCount; WIDTH=4 *( ( w * b + 31)/32); bPxBit=(BYTE *) malloc(WIDTH); } } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps;DWORD dwBytes; int w=bI.bmiHeader.biWidth, h=bI.bmiHeader.biHeight; HDC hdc=BeginPaint(hw,&ps); for(int i=1; i<=h; i++){ ReadFile(hF, bPxBit,WIDTH, &dwBytes,NULL); SetDIBitsToDevice(hdc, 0, 0, w, h, 0, 0, i, 1, bPxBit, &bI, DIB_RGB_COLORS); }//CloseHandleはWM_DESTROY時に行う。 SetFilePointer(hF,sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER), NULL,FILE_BEGIN); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : free(bPxBit); CloseHandle(hF); PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate (hw,wp,lp);return 0; case WM_PAINT : procPaint (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (9) DIBからDDBへの変換 #include "myWin.h" static OPENFILENAME CC;HANDLE hF; static BITMAPFILEHEADER bH;static BITMAPINFO *bI; static BYTE *bPxBit=NULL;DWORD bfSize, bfOffset; static DWORD dwBytes;static HDC hdc; static BITMAP bitmap; static HBITMAP hBitmap; static HDC hBuff; static TCHAR strFile[2048],strFileTitle[128]; static TCHAR sFilter[]=TEXT("BMP Files\0*.bmp\0All Files\0*.*\0"); void procGIBtoDevice(HWND hw){ hdc = GetDC(hw); hBitmap = CreateDIBitmap(hdc, &bI->bmiHeader, CBM_INIT,bPxBit, bI, DIB_RGB_COLORS); hBuff = CreateCompatibleDC(hdc); SelectObject(hBuff,hBitmap); GetObject(hBitmap,sizeof(BITMAP), &bitmap); ReleaseDC(hw,hdc); } void procReadBMP(HWND hw){ hF=CreateFile(strFile,GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hF==INVALID_HANDLE_VALUE) { MessageBox(hw,TEXT("ファイルオープンエラー"),TEXT("エラー"),MB_OK); return; } ReadFile(hF,&bH,sizeof(BITMAPFILEHEADER),&dwBytes,NULL);//ヘッダ読込み if(bH.bfType!=0x4D42){ MessageBox(hw,TEXT("BMPファイルではありません"),NULL,MB_OK); CloseHandle(hF); return; } bfSize=bH.bfSize; bfOffset=bH.bfOffBits; bI=(BITMAPINFO*) malloc(sizeof(BITMAPINFOHEADER)); //情報ヘッダ読込み ReadFile(hF,bI,sizeof(BITMAPINFOHEADER),&dwBytes,NULL); bPxBit=(BYTE *) malloc(bfSize-bfOffset); //ピクセルデータ読込み ReadFile(hF, bPxBit,bfSize-bfOffset, &dwBytes,NULL); CloseHandle(hF); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize=sizeof(OPENFILENAME); CC.hwndOwner=hw ; CC.hInstance=hInstance; CC.lpstrFilter=sFilter ; CC.nFilterIndex=1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile=strFile ; CC.nMaxFile=2048; CC.lpstrFileTitle=strFileTitle ; CC.nMaxFileTitle=128; CC.lpstrInitialDir=TEXT("D:\\"); CC.lpstrTitle=TEXT("テストだよ") ; CC.lpstrDefExt=TEXT("bmp") ; CC.FlagsEx=0; CC.Flags=0; if(GetOpenFileName(&CC)){procReadBMP(hw); procGIBtoDevice(hw);} } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw,&ps); BitBlt(hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hBuff,0,0,SRCCOPY); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY: free(bPxBit); free(bI); DeleteDC(hBuff); DeleteObject(hBitmap); ostQuitMessage(0); return 0; case WM_CREATE : procCreate(hw,wp,lp); return 0; case WM_PAINT : procPaint (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (10) クリップボードの画像データをBMPファイルとして出力 #include "myWin.h" #define IMAGE_WIDTH 1920 #define IMAGE_HEIGHT 1080 static HANDLE hF; static HBITMAP hB; static OPENFILENAME CC; static TCHAR strFile[2048],strFileTitle[128]; static TCHAR sFilter[]=TEXT("BMP Files\0*.bmp\0All Files\0*.*\0"); static BITMAPFILEHEADER bmpFileHeader;static HDC hBuff, hdc; static BITMAP bitmap; static BYTE *pbPixBit; static BITMAPINFO *pBmpInfo; static long width, height, imageSize, mCtab,nBmi,nImage; void procDIBCreate(HWND hw){ int nBit=GetObject(hB,sizeof(bitmap),(PVOID) &bitmap); switch(bitmap.bmBitsPixel){ case 1: mCtab= 2; break; case 4: mCtab= 16; break; case 8: mCtab=256; break; case 24: case 32: mCtab= 0; break;// DDBが32ビットのときもある } nBmi=sizeof(RGBQUAD)*mCtab; nImage=(((bitmap.bmWidth*bitmap.bmBitsPixel)+31)/8)*bitmap.bmHeight; pBmpInfo=(BITMAPINFO *)malloc(nBmi+nImage); pbPixBit=((BYTE *)pBmpInfo+nBmi); // BMPファイルヘッダ bmpFileHeader.bfType = 0x4D42; bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER)+nBmi+nImage + sizeof(BITMAPINFOHEADER); bmpFileHeader.bfReserved1 = bmpFileHeader.bfReserved2 = 0; bmpFileHeader.bfOffBits = nBmi+sizeof(BITMAPINFOHEADER); // BMP情報ヘッダ pBmpInfo->bmiHeader.biSize= sizeof(BITMAPINFOHEADER); pBmpInfo->bmiHeader.biWidth= bitmap.bmWidth; pBmpInfo->bmiHeader.biHeight= bitmap.bmHeight; pBmpInfo->bmiHeader.biPlanes = 1; pBmpInfo->bmiHeader.biBitCount = //DDBが32ビットのとき24ビットに bitmap.bmBitsPixel==32 ? 24 : bitmap.bmBitsPixel; pBmpInfo->bmiHeader.biCompression = BI_RGB; pBmpInfo->bmiHeader.biSizeImage = 0; pBmpInfo->bmiHeader.biXPelsPerMeter= 0; pBmpInfo->bmiHeader.biYPelsPerMeter= 0; pBmpInfo->bmiHeader.biClrUsed = mCtab; pBmpInfo->bmiHeader.biClrImportant = mCtab; // ピクセルデータおよび色テーブル取得 pbPixBit=(BYTE *)malloc(nImage+nBmi); hdc=GetWindowDC(hw); GetDIBits(hdc, hB, 0, bitmap.bmHeight, (LPVOID)pbPixBit ,pBmpInfo, DIB_RGB_COLORS); ReleaseDC(hw,hdc); } void procWrite(BYTE *DT, DWORD N){ DWORD dwWriteSize; WriteFile(hF,DT,N,&dwWriteSize,NULL); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ if(OpenClipboard(hw))hB = (HBITMAP)GetClipboardData(CF_BITMAP); CloseClipboard(); CC.lStructSize=sizeof(OPENFILENAME); CC.hwndOwner=hw ; CC.hInstance=hInstance; CC.lpstrFilter=sFilter ; CC.nFilterIndex=1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile=strFile ; CC.nMaxFile=2048; CC.lpstrFileTitle=strFileTitle ; CC.nMaxFileTitle=128; CC.lpstrInitialDir=TEXT("D:\\"); CC.lpstrTitle=TEXT("テストだよ") ; CC.lpstrDefExt=TEXT("bmp") ; CC.Flags=0; InvalidateRect(hw,NULL,TRUE) ; } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ if(GetSaveFileName(&CC)){ hF=CreateFile(strFile,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hF==INVALID_HANDLE_VALUE) MessageBox(hw,TEXT("ファイルオープンエラー"),TEXT("エラー"),MB_OK); else{ procDIBCreate(hw); procWrite((BYTE *)&bmpFileHeader,sizeof(BITMAPFILEHEADER)); procWrite((BYTE *)pBmpInfo ,sizeof(BITMAPINFOHEADER)); procWrite((BYTE *)pbPixBit ,nBmi+nImage); FlushFileBuffers(hF); CloseHandle(hF); free(pbPixBit); free(pBmpInfo); } } InvalidateRect(hw,NULL,TRUE); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ POINT pt[1]; PAINTSTRUCT ps;TCHAR str[255]; hdc=BeginPaint(hw,&ps); hBuff=CreateCompatibleDC(hdc); SelectObject(hBuff,hB); BitBlt(hdc,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,hBuff,0,0,SRCCOPY); DeleteDC(hBuff); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate (hw, wp,lp); return 0; case WM_LBUTTONUP: procLButtonUp(hw, wp,lp); return 0; case WM_PAINT : procPaint (hw, wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); } 8.5 ビープ音を鳴らす (2) プログラム例 #include "myWin.h" #include "math.h" static double Fr=280, Whl, Hlf;int Count=6; void procCreate(HWND hw, WPARAM wp,LPARAM lp){ Hlf=pow(2.0,1.0/12.0); Whl=Hlf * Hlf; } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ if(Count==2 || Count==6) Fr *= Hlf;// 2のときミ,6のときシ else Fr *= Whl; Beep((int)Fr,500); Count++;if(Count==7)Count=0; } void procRButtonDown(HWND hw, WPARAM wp,LPARAM lp){ if(Count==3 || Count==0) Fr /= Hlf;// 3のときファ,0のときド else Fr /= Whl; Beep((int)Fr,500); Count--;if(Count<0)Count=6; } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate (hw, wp,lp); return 0; case WM_LBUTTONDOWN: procLButtonDown(hw, wp,lp); return 0; case WM_RBUTTONDOWN: procRButtonDown(hw, wp,lp); return 0; } (3) 音のパターン #include "myWin.h" #include "math.h" typedef struct { int Oct; // オクターブ int V ; // 音程 int Len; // 音の長さ }SCALE; // 0 1 2 3 4 5 6 7 8 9 10 11 // ド # レ # ミ ファ# ソ # ラ # シ static double scale[12]; SCALE sakura[]={ {0, 9, 2},{0, 9, 2}, {0,11, 4}, //ララシ {0, 9, 2},{0, 9, 2}, {0,11, 4}, //ララシ {0, 9, 2},{0, 11, 2}, {1, 0, 2}, {0, 11, 2}, //ラシドシ {0, 9, 2},{0, 11, 1}, {0, 9, 1}, {0, 5, 4}} ;//ラシラファ void procCreate(HWND hw, WPARAM wp,LPARAM lp){ double Hlf=pow(2.0,1.0/12.0); scale[0]=500; for(int i=1;i<12;i++)scale[i]=scale[i-1]*Hlf; } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ for(int i=0;i<14;i++){ double Fre=scale[sakura[i].V]*pow(2.0,(int)sakura[i].Oct); Beep((int)Fre, sakura[i].Len*300); } } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate (hw, wp,lp); return 0; case WM_LBUTTONDOWN: procLButtonDown(hw, wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); } 8.6 プリンタ等への出力 (2) プログラム例 #include "myWin.h void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ HDC hdc=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); SelectObject(hdc, CreateSolidBrush(0xFFFF)); Rectangle(hdc,100,100,400,400); DeleteObject(SelectObject(hdc, CreateSolidBrush(0xFF))); Ellipse(hdc,200,200,300,300); DeleteObject(SelectObject(hdc,GetStockObject(WHITE_BRUSH))); DeleteDC(hdc); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_LBUTTONUP : procLButtonUp(hw, wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); } (3) プリンタへの出力 #include "myWin.h" static PRINTDLG pd; static BCHAR *strName;TCHAR str[256]; void procCreate(HWND hw, WPARAM wp,LPARAM lp){ pd.lStructSize =sizeof(PRINTDLG); pd.hwndOwner=hw; pd.Flags=PD_RETURNDC; } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ if(PrintDlg(&pd)){ if(pd.hDevMode){ strName=(BCHAR *)GlobalLock(pd.hDevMode); GlobalUnlock(pd.hDevMode); DOCINFO diInfo={0}; diInfo.cbSize=sizeof(DOCINFO); diInfo.lpszDocName=TEXT("テスト印刷"); HDC hdc=CreateDC(NULL,strName,NULL,NULL); if(!hdc){ MessageBox(NULL,TEXT("DCが得られません"),strName, MB_OK); return; } if(StartDoc(hdc, &diInfo)>0 && StartPage(hdc)>0){ SetMapMode(hdc,MM_LOMETRIC); Ellipse(hdc,0,0,500,-500); TextOut(hdc,0,0,strName,lstrlen(strName)); EndPage(hdc); EndDoc(hdc); } DeleteDC(hdc); } } } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate (hw,wp,lp);return 0; case WM_LBUTTONUP: procLButtonDown(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } 8.7 文字列のリソース (1) 文字列のリソース 【ヘッダファイル】tabstr.h #define SINSAKU 1 【リソースファイル】restest.rc #include "tabstr.h" STRINGTABLE { SINSAKU "詩酒愛すべし\012美人憐れむべし\012高杉晋作『煙管自賛』より" } 【ソースプログラム】 #include "myWin.h" #include "tabstr.h" static HINSTANCE hInstance; void procCreate(HWND hw, WPARAM wp,LPARAM lp){ TCHAR str[2048]; HWND label=CreateWindow(TEXT("STATIC"),NULL,WS_CHILD|WS_VISIBLE, 0,0,200,100,hw,(HMENU) 1,hInstance,NULL); LoadString(hInstance,SINSAKU,str,2048); SetWindowText(label,str); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate(hw, wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); } 8.8 BMP以外の画像ファイル (1) JPEG・GIFなど 【ソースプログラム】 #include "myWin.h" #include #define APP_NAME TEXT("Jpeg Test") static HBITMAP hBitmap=NULL;static HDC hMain=NULL, hdc; static BITMAP bitmap; static TCHAR str[255];static HANDLE hF; static OPENFILENAME CC;BYTE dtBuff[16]; static TCHAR strFile[1024],strFileTitle[128];TCHAR msg[4200]; static TCHAR sFilter[]=TEXT("Jpeg Files\0*.jpg\0GIF Files\0*.gif\0") TEXT("BMP Files\0*.bmp\0All Files\0*.*\0"); static HGLOBAL hMem; static DWORD nFileSize; static IStream *iStream=NULL; void getHandle(HWND hw){ DWORD nReadByte; short type; OLE_HANDLE hOle; IPicture *iPicture; nFileSize=GetFileSize(hF,NULL); hMem=GlobalAlloc(GMEM_MOVEABLE,nFileSize);//移動可能グローバル領域 LPVOID pvData=GlobalLock(hMem); ReadFile(hF,pvData, nFileSize, &nReadByte, NULL); GlobalUnlock(hMem); CloseHandle(hF); CreateStreamOnHGlobal(hMem,TRUE,&iStream);//ストリーム生成と変換 OleLoadPicture(iStream,nFileSize,FALSE,IID_IPicture,(LPVOID*)&iPicture); iStream->Release(); iPicture->get_Type(&type); if(type==PICTYPE_BITMAP)iPicture->get_Handle(&hOle); hBitmap=(HBITMAP)hOle; SelectObject(hMain,hBitmap);//ビットマット取得 GetObject(hBitmap,sizeof(BITMAP),&bitmap); GlobalFree(hMem); } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ if(GetOpenFileName(&CC)){ hF=CreateFile(CC.lpstrFile,GENERIC_READ, 0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); if(hF==INVALID_HANDLE_VALUE) MessageBox(hw,TEXT("オープンエラー"),TEXT("エラー"),MB_OK); else{ hdc=GetDC(hw); hMain=CreateCompatibleDC(NULL); getHandle(hw); CloseHandle(hF); } } InvalidateRect(hw,NULL,FALSE); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize =sizeof(OPENFILENAME); CC.hwndOwner =hw ; CC.hInstance =hInstance; CC.lpstrFilter =sFilter ; CC.nFilterIndex =1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile =strFile ; CC.nMaxFile =1024; CC.lpstrFileTitle =strFileTitle; CC.nMaxFileTitle =128; CC.lpstrInitialDir =TEXT("D:\\"); CC.lpstrTitle =TEXT("Jpeg,GIF入力"); CC.lpstrDefExt =TEXT("jpg") ; CC.FlagsEx =0; CC.Flags =OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_DONTADDTORECENT |OFN_NOTESTFILECREATE; procLButtonUp(hw, wp, lp); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; hdc=BeginPaint(hw,&ps); BitBlt(hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hMain,0,0,SRCCOPY); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : DeleteDC(hMain);DeleteObject(hBitmap); PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate(hw,wp,lp) ;return 0; case WM_LBUTTONUP: procLButtonUp(hw,wp,lp);return 0; case WM_PAINT : procPaint (hw,wp,lp) ;return 0; } return DefWindowProc(hw,msg,wp,lp); } (2) GDI+を使う 【ソースプログラム】 #include "myWin.h" // GDI+用宣言 #include #include #include using namespace Gdiplus; // GDI+用領域宣言 static ULONG_PTR gdiToken ; static GdiplusStartupInput gdiStIn; static EncoderParameters* encParam ; static ULONG clDpth, quality, trans; static Status stat ; static CLSID encClsID; static Image *image ; static Bitmap *pBitmap; static UINT width,height ; static ImageType type; static PixelFormat pxForm ; static REAL hor, ver; static BOOL notFirst=FALSE ; //image,pBitmapを解放するためのフラグ // 一般領域宣言 static HDC hdc; static TCHAR str[255];static HANDLE hF; static OPENFILENAME CC;BYTE dtBuff[16]; static TCHAR strFile[1024],strFileTitle[128]; static TCHAR sFilter[]=TEXT("Jpeg Files\0*.jpg\0PNG Files\0*.png\0") TEXT("GIF Files\0*.gif\0BMP Files\0*.bmp\0") TEXT("TIFF Files\0*.tif\0All Files\0*.*\0"); //エンコーダクラスIDの設定 int getEncoderClassID(const WCHAR *format,CLSID * pClsid){ int R=-1;UINT N=0, Msize=0;// 失敗のとき-1 ImageCodecInfo * pImgCdIn=NULL; GetImageEncodersSize(&N, &Msize); if(Msize==0) return R ; if((pImgCdIn=(ImageCodecInfo*)malloc(Msize))==NULL) return R; GetImageEncoders(N, Msize,pImgCdIn); for(UINT j=0;jGetRawFormat(&guid); //画像書式 width =image->GetWidth(); height=image->GetHeight();//サイズ hor =image->GetHorizontalResolution(); //解像度 ver =image->GetVerticalResolution(); type =image->GetType(); //ファイル型 pxForm =image->GetPixelFormat(); //色書式 notFirst=TRUE; dspImgFormat(guid, type, pxForm, width, height, hor, ver); InvalidateRect(hw,NULL,TRUE); } } void setFormat(TCHAR *str,TCHAR format[]){//拡張子から int L=lstrlen(str),ID, i; //ファイル形式を生成 for(ID=L-1;ID>=0 && str[ID]!=TCHAR('.');ID--); if(ID<0 || ID==(L-1)) lstrcpy(format,TEXT("image/bmp")); else{ lstrcpy(format,TEXT("image/")); for( ID++,i=6 ; IDCount = 3;//パラメータ数指定 encParam->Parameter[0].Guid = EncoderTransformation; //回転 encParam->Parameter[0].Type = EncoderParameterValueTypeLong; encParam->Parameter[0].NumberOfValues = 1; encParam->Parameter[0].Value = &trans; encParam->Parameter[1].Guid = EncoderQuality; //クオリティ encParam->Parameter[1].Type = EncoderParameterValueTypeLong; encParam->Parameter[1].NumberOfValues = 1; encParam->Parameter[1].Value = &quality; encParam->Parameter[2].Guid = EncoderColorDepth; //色深度 encParam->Parameter[2].Type = EncoderParameterValueTypeLong; encParam->Parameter[2].NumberOfValues = 1; encParam->Parameter[2].Value = &clDpth; } void procRButtonUp(HWND hw, WPARAM wp,LPARAM lp){//ファイル出力 if(GetSaveFileName(&CC)){ TCHAR format[128]; setFormat(strFile,format); if(getEncoderClassID(format,&encClsID)<0) MessageBox(hw,TEXT("この形式はサポートしていません"), TEXT("エラー"),MB_OK); else{ setEncoderParam();//パラーメータ設定。変換なしのときedcParam=NULL if((stat = image->Save(strFile,&encClsID,encParam))==Ok) MessageBox(hw,TEXT("成功"),TEXT("正常終了"),MB_OK); else MessageBox(hw,TEXT("失敗"),TEXT("エラー" ),MB_OK); } } InvalidateRect(hw,NULL,TRUE); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize =sizeof(OPENFILENAME); CC.hwndOwner =hw ; CC.hInstance =hInstance; CC.lpstrFilter =sFilter ; CC.nFilterIndex =1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile =strFile ; CC.nMaxFile =1024; CC.lpstrFileTitle =strFileTitle; CC.nMaxFileTitle =128; CC.lpstrInitialDir =TEXT("D:\\"); CC.lpstrTitle =TEXT("GDI+で表示"); CC.lpstrDefExt =TEXT("jpg") ; CC.FlagsEx =0; CC.Flags = OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_DONTADDTORECENT| OFN_NOTESTFILECREATE; GdiplusStartup(&gdiToken,&gdiStIn,NULL);//GDI++開始 encParam=(EncoderParameters*)malloc(sizeof(EncoderParameters)+ 4*sizeof(EncoderParameter)); procLButtonUp(hw,wp,lp); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){//再描画処理 PAINTSTRUCT ps; hdc=BeginPaint(hw,&ps); Graphics graphics(hdc);graphics.DrawImage(pBitmap,(int)0,(int)0); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : if(notFirst){delete image; delete pBitmap;} GdiplusShutdown(gdiToken); PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate(hw,wp,lp);return 0; case WM_LBUTTONUP: procLButtonUp(hw,wp,lp);return 0; case WM_RBUTTONUP: procRButtonUp(hw,wp,lp);return 0; case WM_PAINT : procPaint (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } 8.9 音声とビデオの再生 (1) PlaySound関数によるWAVEファイルの再生 【ソースプログラム】 #include "myWin.h" #include #pragma comment(lib,"winmm.lib") static OPENFILENAME CC;BYTE dtBuff[16]; static TCHAR strFile[1024],strFileTitle[128];TCHAR msg[4200]; static TCHAR sFilter[]=TEXT("Wave Files\0*.wav\0All Files\0*.*\0"); void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ if(GetOpenFileName(&CC)) PlaySound(strFile,NULL,SND_FILENAME|SND_ASYNC|SND_LOOP); } void procRButtonUp(HWND hw, WPARAM wp,LPARAM lp){ PlaySound(NULL,NULL,0); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize =sizeof(OPENFILENAME); CC.hwndOwner =hw ; CC.hInstance =hInstance; CC.lpstrFilter =sFilter ; CC.nFilterIndex =1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile =strFile ; CC.nMaxFile =1024; CC.lpstrFileTitle =strFileTitle; CC.nMaxFileTitle =128; CC.lpstrInitialDir =TEXT("D:\\"); CC.lpstrTitle =TEXT("wav再生"); CC.lpstrDefExt =TEXT("wav") ; CC.FlagsEx =0; CC.Flags =OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_DONTADDTORECENT |OFN_NOTESTFILECREATE; procLButtonUp(hw, wp, lp); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate(hw,wp,lp) ;return 0; case WM_LBUTTONUP: procLButtonUp(hw,wp,lp);return 0; case WM_RBUTTONUP: procRButtonUp(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (2) WAVEファイルをメモリに読み込んで再生 ? 【ソースプログラム】 #include "myWin.h" #include #pragma comment(lib,"winmm.lib") static BOOL Readed=FALSE; static HANDLE hF; static DWORD dwFSize, dwRSize; static LPCWSTR lpS; static OPENFILENAME CC;BYTE dtBuff[16]; static TCHAR strFile[1024],strFileTitle[128];TCHAR msg[4200]; static TCHAR sFilter[]=TEXT("Wave Files\0*.wav\0All Files\0*.*\0"); void inputMemory(HWND hw){ if(GetOpenFileName(&CC)) hF=CreateFile(strFile,GENERIC_READ,0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); if(hF==INVALID_HANDLE_VALUE) MessageBox(hw,TEXT("ファイルオープンエラー"),TEXT("Wave"),MB_OK); else{ dwFSize=GetFileSize(hF,NULL); lpS=(LPCWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwFSize); ReadFile(hF,(LPVOID)lpS,dwFSize,&dwRSize,NULL); CloseHandle(hF);Readed=TRUE; } } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ if(!Readed) inputMemory(hw); if(Readed) PlaySound(lpS,NULL,SND_MEMORY|SND_ASYNC|SND_LOOP); } void procRButtonUp(HWND hw, WPARAM wp,LPARAM lp){ PlaySound(NULL,NULL,0); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize =sizeof(OPENFILENAME); CC.hwndOwner =hw ; CC.hInstance =hInstance; CC.lpstrFilter =sFilter ; CC.nFilterIndex =1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile =strFile ; CC.nMaxFile =1024; CC.lpstrFileTitle =strFileTitle; CC.nMaxFileTitle =128; CC.lpstrInitialDir =TEXT("D:\\"); CC.lpstrTitle =TEXT("wav再生"); CC.lpstrDefExt =TEXT("wav") ; CC.FlagsEx =0; CC.Flags =OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_DONTADDTORECENT |OFN_NOTESTFILECREATE; inputMemory(hw); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate(hw,wp,lp) ;return 0; case WM_LBUTTONUP: procLButtonUp(hw,wp,lp);return 0; case WM_RBUTTONUP: procRButtonUp(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (3) MCIコマンドによる再生 【ソースプログラム】 #include "myWin.h" #pragma comment(lib,"winmm.lib") static MCI_OPEN_PARMS opnPar;static MCI_PLAY_PARMS plyPar; static MCI_GENERIC_PARMS genPar; static OPENFILENAME CC;BYTE dtBuff[16]; static TCHAR strFile[1024],strFileTitle[128];TCHAR msg[4200]; static TCHAR sFilter[]=TEXT("MPeg3 Files\0*.mp3\0All Files\0*.*\0"); void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ if(GetOpenFileName(&CC)){ opnPar.lpstrDeviceType=TEXT("MPEGVideo"); opnPar.lpstrElementName=strFile; if(mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, (DWORD_PTR) &opnPar)!=0) MessageBox(hw,TEXT("オープンエラー"),TEXT("MP3"),MB_OK); else mciSendCommand(opnPar.wDeviceID,MCI_PLAY,0, (DWORD_PTR) &plyPar); } } void procRButtonUp(HWND hw, WPARAM wp,LPARAM lp){ mciSendCommand(opnPar.wDeviceID,MCI_CLOSE,0, (DWORD_PTR) &genPar); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize =sizeof(OPENFILENAME); CC.hwndOwner =hw ; CC.hInstance =hInstance; CC.lpstrFilter =sFilter ; CC.nFilterIndex =1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile =strFile ; CC.nMaxFile =1024; CC.lpstrFileTitle =strFileTitle; CC.nMaxFileTitle =128; CC.lpstrInitialDir =TEXT("D:\\"); CC.lpstrTitle =TEXT("MPEG再生"); CC.lpstrDefExt =TEXT("mp3") ; CC.FlagsEx =0; CC.Flags =OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_DONTADDTORECENT |OFN_NOTESTFILECREATE; procLButtonUp(hw, wp, lp); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate(hw,wp,lp) ;return 0; case WM_LBUTTONUP: procLButtonUp(hw,wp,lp);return 0; case WM_RBUTTONUP: procRButtonUp(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (5) MIDIファイルの再生プログラム例 【ソースプログラム】 #include "myWin.h" #pragma comment(lib,"winmm.lib") static MCI_OPEN_PARMS opnPar;static MCI_PLAY_PARMS plyPar; static MCI_GENERIC_PARMS genPar; static OPENFILENAME CC;BYTE dtBuff[16]; static TCHAR strFile[1024],strFileTitle[128];TCHAR msg[4200]; static TCHAR sFilter[]=TEXT("Wave Files\0*.mid\0All Files\0*.*\0"); void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ if(GetOpenFileName(&CC)){ opnPar.lpstrDeviceType=TEXT("sequencer"); opnPar.lpstrElementName=strFile; if(mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, (DWORD_PTR) &opnPar)!=0) MessageBox(hw,TEXT("オープンエラー"),TEXT("MIDI"),MB_OK); else mciSendCommand(opnPar.wDeviceID,MCI_PLAY,0, (DWORD_PTR) &plyPar); } } void procRButtonUp(HWND hw, WPARAM wp,LPARAM lp){ mciSendCommand(opnPar.wDeviceID,MCI_CLOSE,0, (DWORD_PTR) &genPar); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize =sizeof(OPENFILENAME); CC.hwndOwner =hw ; CC.hInstance =hInstance; CC.lpstrFilter =sFilter ; CC.nFilterIndex =1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile =strFile ; CC.nMaxFile =1024; CC.lpstrFileTitle =strFileTitle; CC.nMaxFileTitle =128; CC.lpstrInitialDir =TEXT("D:\\"); CC.lpstrTitle =TEXT("MIDI再生"); CC.lpstrDefExt =TEXT("mid") ; CC.FlagsEx =0; CC.Flags =OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_DONTADDTORECENT |OFN_NOTESTFILECREATE; procLButtonUp(hw, wp, lp); } (6) MIDI音源を操作する 【ソースプログラム】 #include "myWin.h" #pragma comment(lib,"winmm.lib") #define SMSG(st, ch,d1,d2)((DWORD)(st<<4)|ch|(d1<<8)|(d2<<16)) static HMIDIOUT hM; static BYTE note=0x3C, vel=0x40,prog=0; void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ midiOutShortMsg(hM,SMSG(0x9,0,note,vel)); } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ midiOutShortMsg(hM,SMSG(0x9,0,note,0)); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ midiOutOpen(&hM,MIDIMAPPER,NULL,0,CALLBACK_NULL); } void procKeyDown(HWND hw, WPARAM wp,LPARAM lp){ switch(wp){ case'Z': if(prog>0) prog--; midiOutShortMsg(hM,SMSG(0xC,0,prog,0)); break; case'X': if(prog<0x7F) prog++; midiOutShortMsg(hM,SMSG(0xC,0,prog,0)); break; case'A': if(note>0 ) note--; break; case'S': if(note<0x7F) note++; break; case'Q': if(vel >0 ) vel-- ; break; case'W': if(vel <0x7F) vel++ ; break; } InvalidateRect(NULL,NULL,TRUE); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps;TCHAR str[128]; HDC hdc=BeginPaint(hw,&ps); wsprintf(str,TEXT("音色 0x%02X, 音階 0x%02X, 強さ 0x%02X"), prog,note,vel); TextOut(hdc,0,0,str,lstrlen(str)); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : midiOutReset(hM); midiOutClose(hM); PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate (hw,wp,lp);return 0; case WM_LBUTTONDOWN: procLButtonDown(hw,wp,lp);return 0; case WM_LBUTTONUP : procLButtonUp (hw,wp,lp);return 0; case WM_KEYDOWN : procKeyDown (hw,wp,lp);return 0; case WM_PAINT : procPaint (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (7) AVIファイルの再生 #include "myWin.h" #pragma comment(lib,"winmm.lib") static HWND hM; static MCI_ANIM_OPEN_PARMS openP; static MCI_PLAY_PARMS playP; static MCI_GENERIC_PARMS geneP; static OPENFILENAME CC;BYTE dtBuff[16]; static TCHAR strFile[1024],strFileTitle[128];TCHAR msg[4200]; static TCHAR sFilter[]=TEXT("AVI Files\0*.avi\0All Files\0*.*\0"); void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ TCHAR str[1024]; if(GetOpenFileName(&CC)){ openP.dwCallback=(DWORD)hw; openP.lpstrDeviceType=TEXT("avivideo"); openP.lpstrElementName=strFile; TEXT("D:\\test.avi"); int iErr=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, (DWORD_PTR)&openP); if(iErr){ mciGetErrorString(iErr,str,1024); MessageBox(hw,str,NULL,MB_OK); } else{ playP.dwCallback=(DWORD)hw; mciSendCommand(openP.wDeviceID,MCI_PLAY,0,(DWORD)&playP); } } } void procRButtonUp(HWND hw, WPARAM wp,LPARAM lp){ mciSendCommand(openP.wDeviceID,MCI_STOP,0,(DWORD_PTR)&geneP); mciSendCommand(openP.wDeviceID,MCI_CLOSE,0,(DWORD_PTR)&geneP); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize =sizeof(OPENFILENAME); CC.hwndOwner =hw ; CC.hInstance =hInstance; CC.lpstrFilter =sFilter ; CC.nFilterIndex =1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile =strFile ; CC.nMaxFile =1024; CC.lpstrFileTitle =strFileTitle; CC.nMaxFileTitle =128; CC.lpstrInitialDir =TEXT("D:\\"); CC.lpstrTitle =TEXT("AVI再生"); CC.lpstrDefExt =TEXT("AVI") ; CC.FlagsEx =0; CC.Flags =OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_DONTADDTORECENT |OFN_NOTESTFILECREATE; procLButtonUp(hw, wp, lp); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate(hw,wp,lp) ;return 0; case WM_LBUTTONUP: procLButtonUp(hw,wp,lp);return 0; case WM_RBUTTONUP: procRButtonUp(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); }