// // 抜き色によるスプライト // // 1998/ 8/19 宍戸 輝光 // #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LPBYTE lpBuf,lpBMP,bgBMP,bufBMP,partBMP; LPBITMAPINFO bufDIB; LPRGBQUAD lpRGB; int x,y; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ HWND hwnd; MSG msg; WNDCLASSEX wndclass ; int i,j; wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "Test Window"; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); RegisterClassEx (&wndclass); hwnd = CreateWindow ("Test Window", "スプライト", WS_OVERLAPPEDWINDOW, 32,32, 288,288, NULL, NULL, hInstance, NULL); lpBuf=GlobalAlloc // 表示DIB用メモリ確保 (GPTR,sizeof(BITMAPINFO)+255*sizeof(RGBQUAD)+256*256); lpBMP=GlobalAlloc(GPTR,256*256+32*32); // ビットマップ用メモリ bgBMP=lpBMP; // 背景用ビットマップ partBMP=lpBMP+256*256; // キャラクタ用ビットマップ bufDIB=(LPBITMAPINFO)lpBuf; // 表示DIB用メモリを分配 lpRGB=(RGBQUAD*)(lpBuf+sizeof(BITMAPINFOHEADER)); bufBMP=(BYTE*)(lpBuf+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)); bufDIB->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); // BITMAPINFO構造体 bufDIB->bmiHeader.biWidth=256; bufDIB->bmiHeader.biHeight=256; bufDIB->bmiHeader.biPlanes=1; bufDIB->bmiHeader.biBitCount=8; bufDIB->bmiHeader.biCompression=BI_RGB; bufDIB->bmiHeader.biSizeImage=0; bufDIB->bmiHeader.biXPelsPerMeter=0; bufDIB->bmiHeader.biYPelsPerMeter=0; bufDIB->bmiHeader.biClrUsed=0; bufDIB->bmiHeader.biClrImportant=0; bufDIB->bmiColors[0]=lpRGB[0]; // カラーテーブルの先頭 for (i=0;i<64;i++) // カラーテーブル作成 lpRGB[i].rgbRed=lpRGB[i].rgbGreen=lpRGB[i].rgbBlue=192+i; lpRGB[128].rgbRed=255; lpRGB[128].rgbGreen=0; lpRGB[128].rgbBlue=96; lpRGB[129].rgbRed=0; lpRGB[129].rgbGreen=0; lpRGB[129].rgbBlue=255; for (i=0;i<256;i++) // 背景作成 for (j=0;j<256;j++) bgBMP[j+i*256]=rand() % 64; for (i=0;i<32;i++) // キャラクタ作成 for (j=0;j<32;j++) partBMP[j+i*32]=255; for (i=0;i<32;i++) { partBMP[16+i*32]=128; partBMP[i+16*32]=128; } for (i=0;i<8;i++) for (j=i;j<16-i;j++) partBMP[j+9+(i+24)*32]=129; x=112; y=112; ShowWindow (hwnd,iCmdShow); // ウインドウを表示 UpdateWindow (hwnd); // 再描画 while (GetMessage (&msg,NULL,0,0)) { // メッセージ処理 TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; int i,j; switch (iMsg) { case WM_DESTROY : GlobalFree(lpBuf); // メモリを解放 GlobalFree(lpBMP); PostQuitMessage(0); return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); CopyMemory(bufBMP,bgBMP,256*256); for (i=0;i<32;i++) // キャラクタの透過処理 for (j=0;j<32;j++) if (partBMP[j+i*32]!=255) // 抜き色でなければ描く bufBMP[x+j+(y+i)*256]=partBMP[j+i*32]; StretchDIBits(hdc,0,0,256,256,0,0,256,256,bufBMP,bufDIB, DIB_RGB_COLORS,SRCCOPY); EndPaint(hwnd,&ps); return 0; case WM_KEYDOWN: if (wParam==VK_UP && y<224) y=y+2; if (wParam==VK_RIGHT && x<224) x=x+2; if (wParam==VK_DOWN && y>0) y=y-2; if (wParam==VK_LEFT && x>0) x=x-2; InvalidateRgn(hwnd,NULL,FALSE); UpdateWindow (hwnd); // 再描画 return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }