/* ウインドウの壁紙 1999/12/13 宍戸 輝光 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK CWndProc (HWND, UINT, WPARAM, LPARAM); BOOL readBMP(char fn[]); HINSTANCE hInst; HWND hwMain; DWORD dwWidth,dwHeight,dwLength; BOOL loaded; LPBYTE lpDIB,lpPixel,lpBG,lpBGPixel; LPBITMAPINFO lpInfo,lpBGInfo; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASS wndclass ; hInst=hInstance; /* プロセスのハンドルを保存 */ lpBG=GlobalAlloc(GPTR,sizeof(BITMAPINFO)+128*64*3); lpBGInfo=(LPBITMAPINFO)lpBG; lpBGPixel=lpBG+sizeof(BITMAPINFO); lpBGInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); // BITMAPINFO構造体 lpBGInfo->bmiHeader.biWidth=128; lpBGInfo->bmiHeader.biHeight=64; lpBGInfo->bmiHeader.biPlanes=1; lpBGInfo->bmiHeader.biBitCount=24; lpBGInfo->bmiHeader.biCompression=BI_RGB; lpBGInfo->bmiHeader.biSizeImage=0; lpBGInfo->bmiHeader.biXPelsPerMeter=0; lpBGInfo->bmiHeader.biYPelsPerMeter=0; lpBGInfo->bmiHeader.biClrUsed=0; lpBGInfo->bmiHeader.biClrImportant=0; 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 = "CWindow"; RegisterClass(&wndclass); hwMain=CreateWindow ("CWindow","ウインドウの壁紙",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,560,480, NULL,NULL,hInstance,NULL); DragAcceptFiles(hwMain,TRUE); /* ドラッグ&ドロップ受入 */ ShowWindow (hwMain,iCmdShow); /* ウインドウを表示 */ UpdateWindow (hwMain); /* 再描画 */ while (GetMessage (&msg,NULL,0,0)) { /* メッセージループ */ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HWND hwC; HDROP hDrop; HDC hdc,hdcMem; HBITMAP hBMP,hOBMP; PAINTSTRUCT ps; RECT rec; static char lpszFn[MAX_PATH+1]; WNDCLASS wc; switch (iMsg) { case WM_CREATE: wc.style =CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc =CWndProc; wc.cbClsExtra =0; wc.cbWndExtra =0; wc.hInstance =hInst; wc.hIcon =NULL; wc.hCursor =LoadCursor(hInst,"NULL_CURSOR"); wc.hbrBackground =(HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName ="CWin"; RegisterClass(&wc); hwC=CreateWindow("CWin",NULL,WS_CHILD | WS_VISIBLE, 16,16,128,64,hwnd,(HMENU)0,hInst,NULL); break; case WM_DROPFILES: /* ファイルがドロップされた時の処理 */ hDrop=(HDROP)wParam; /* HDROPを取得 */ DragQueryFile(hDrop,0,lpszFn,MAX_PATH+1); /* ファイル名を取得 */ DragFinish(hDrop); /* ドロップ終了処理 */ loaded=readBMP(lpszFn); InvalidateRgn(hwnd,NULL,TRUE); UpdateWindow (hwnd); /* 再描画 */ return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); GetClientRect(hwnd,&rec); /* クライアント領域取得 */ if (loaded) { /* ビットマップが読み込まれていれば */ StretchDIBits(hdc,0,0,rec.right,rec.bottom, 0,0,dwWidth,dwHeight,lpPixel,lpInfo, DIB_RGB_COLORS,SRCCOPY); /* DIBを画面に描画 */ } hBMP=CreateCompatibleBitmap(hdc,128,64); /* ビットマップ作成 */ hdcMem=CreateCompatibleDC(hdc); /* ビットマップ描画用DC作成 */ hOBMP=SelectObject(hdcMem,hBMP); /* ビットマップをDCに選択 /* ビットマップに現在のクライアント領域をコピー */ BitBlt(hdcMem,0,0,128,64,hdc,16,16,SRCCOPY); SelectObject(hdcMem,hOBMP); /* ビットマップの選択を解除 */ /* ビットマップをDIBに変換 */ GetDIBits(hdcMem,hBMP,0,64,lpBGPixel,lpBGInfo,DIB_RGB_COLORS); EndPaint(hwnd,&ps); break; case WM_DESTROY : if (loaded) /* DIB解放 */ GlobalFree(lpDIB); GlobalFree(lpBG); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } LRESULT CALLBACK CWndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; DWORD i,j; switch (iMsg) { case WM_PAINT: hdc=BeginPaint(hwnd,&ps); for (i=0;i<64;i++) for (j=0;j<128;j++) lpBGPixel[j*3+i*128*3]=0; StretchDIBits(hdc,0,0,128,64,0,0,128,64,lpBGPixel,lpBGInfo, DIB_RGB_COLORS,SRCCOPY); EndPaint(hwnd,&ps); break; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }; BOOL readBMP(char fn[]) { /* ビットマップ読み込み */ DWORD offset,dummy; HANDLE fh; if (loaded) /* 以前確保したバッファを解放 */ GlobalFree(lpDIB); fh=CreateFile(fn,GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ lpDIB=(LPBYTE)GlobalAlloc (GPTR,GetFileSize(fh,NULL)); /* バッファ確保 */ ReadFile(fh,lpDIB,GetFileSize(fh,NULL),&dummy,NULL); lpInfo=(LPBITMAPINFO)(lpDIB+sizeof(BITMAPFILEHEADER)); offset=*(LPDWORD)(lpDIB+10); lpPixel=lpDIB+offset; /* ビットマップバッファの先頭アドレス */ CloseHandle(fh); /* 24ビットフルカラービットマップでなければ無効 */ if (lpDIB[0]!='B' || lpInfo->bmiHeader.biBitCount!=24) { GlobalFree(lpDIB); return FALSE; } /* ビットマップの大きさ保存 */ dwWidth=lpInfo->bmiHeader.biWidth; dwHeight=lpInfo->bmiHeader.biHeight; if ((dwWidth*3) % 4==0) /* バッファの1ラインの長さを計算 */ dwLength=dwWidth*3; else dwLength=dwWidth*3+(4-(dwWidth*3) % 4); return TRUE; }