#include //背景 #define BW 640 #define BH 480 //前景 #define FW 500 #define FH 150 //半透明にする色 #define ALPHA 0x00000000 LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; //DIB 背景 前景 static LPDWORD lpPixelB,lpPixelF; //DIBSection 完成画像 static BITMAPINFO bmpInfo; static LPDWORD lpPixel; static HBITMAP hBitmap; static HDC hMemDC; //その他 static BYTE a=50; //不透明度(0〜100) static POINT pt={100,100}; //表示座標 int x,y; BYTE r,g,b; RGBQUAD color,colorF; char str[64]; switch(uMsg) { case WM_CREATE: //DIB作成 lpPixelB=(LPDWORD)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(BW*BH*4)+(FW*FH*4)); lpPixelF=lpPixelB+BW*BH; //DIB(Section)の情報を設定する 完成画像 bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth=BW; bmpInfo.bmiHeader.biHeight=-BH; //注意 bmpInfo.bmiHeader.biPlanes=1; bmpInfo.bmiHeader.biBitCount=32; bmpInfo.bmiHeader.biCompression=BI_RGB; //DIBSection作成 hBitmap=CreateDIBSection(NULL,&bmpInfo,DIB_RGB_COLORS,(void**)&lpPixel,NULL,0); hMemDC=CreateCompatibleDC(NULL); SelectObject(hMemDC,hBitmap); //テキストの設定を変更する SetTextColor(hMemDC,RGB(255,255,255)); SetBkMode(hMemDC,TRANSPARENT); //画像作成 背景 for(y=0;y0){a--;} break; default: return 0; } InvalidateRect(hWnd,NULL,FALSE); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); //背景の描画 CopyMemory(lpPixel,lpPixelB,BW*BH*4); //合成 前景×不透明度+完成画像×(100−不透明度) for(y=0;y=BH) continue; for(x=0;x=BW) continue; if(lpPixelF[x+y*FW]==ALPHA){ //半透明処理 CopyMemory(&colorF,&lpPixelF[x+y*FW],sizeof(RGBQUAD)); CopyMemory(&color,&lpPixel[(pt.x+x)+(pt.y+y)*BW],sizeof(RGBQUAD)); r=(BYTE)(colorF.rgbRed*a/100.0 + color.rgbRed*(100-a)/100.0); g=(BYTE)(colorF.rgbGreen*a/100.0 + color.rgbGreen*(100-a)/100.0); b=(BYTE)(colorF.rgbBlue*a/100.0 + color.rgbBlue*(100-a)/100.0); lpPixel[(pt.x+x)+(pt.y+y)*BW]=(r<<16)+(g<<8)+b; }else{ //前景そのまま lpPixel[(pt.x+x)+(pt.y+y)*BW]=lpPixelF[x+y*FW]; } } } //文字列描画 wsprintf(str,"現在の不透明度 %d %",a); TextOut(hMemDC,pt.x+20,pt.y+20,str,(int)strlen(str)); //表画面へ転送 BitBlt(hdc,0,0,BW,BH,hMemDC,0,0,SRCCOPY); EndPaint(hWnd,&ps); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = __FILE__; if(!RegisterClass(&wc)) return 0; HWND hWnd=CreateWindow( __FILE__,"半透明処理", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL); if(hWnd==NULL) return 0; BOOL bRet; while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1) break; DispatchMessage(&msg); } return (int)msg.wParam; }