#include <windows.h>
HANDLE hFile;
DWORD dwBytes;
BITMAPFILEHEADER bmpFileHeader;
BITMAPINFO bmpInfo;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
int iScan;
static BYTE *bPixelBits;
static int WIDTH = 0;
switch (msg) {
case WM_DESTROY:
CloseHandle(hFile);
free(bPixelBits);
PostQuitMessage(0);
return 0;
case WM_CREATE:
WIDTH = 4 * ((bmpInfo.bmiHeader.biWidth * bmpInfo.bmiHeader.biBitCount + 31) / 32);
bPixelBits = (BYTE *)malloc(WIDTH);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps); {
for (iScan = 0; iScan < bmpInfo.bmiHeader.biHeight; iScan++) {
ReadFile(hFile, bPixelBits, WIDTH, &dwBytes, NULL);
Sleep(10);
SetDIBitsToDevice(hdc,
0, 0, /* 転送先長方形の左上隅 */
bmpInfo.bmiHeader.biWidth, bmpInfo.bmiHeader.biHeight, /* DIB の幅・高さ */
0, 0, /* DIB の左隅の論理座標 */
iScan, /* DIB 内の開始走査行 */
1, /* pPixelBits が示す配列中に含まれている DIB の走査行の数 */
bPixelBits, &bmpInfo, DIB_RGB_COLORS);
}
SetFilePointer(hFile,
sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER), NULL, FILE_BEGIN);
} EndPaint(hwnd, &ps);
return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
DWORD dwBytes;
hFile = CreateFile(lpCmdLine, GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
MessageBox(NULL, TEXT("failure oppening file"), TEXT("ERROR"), MB_OK);
return -1;
}
ReadFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwBytes, NULL);
if (bmpFileHeader.bfType != 0x4d42) {
MessageBox(NULL, TEXT("This file is not bitmap."), TEXT("ERROR"), MB_OK);
return -1;
}
ReadFile(hFile, &bmpInfo, sizeof(BITMAPINFOHEADER), &dwBytes, NULL);
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = 0;
winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL, IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(TEXT("KITTY"), TEXT("KITTY on your lap"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
if (hwnd == NULL) return 0;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
/* end */
I2luY2x1ZGUgPHdpbmRvd3MuaD4KCkhBTkRMRSBoRmlsZTsKRFdPUkQgZHdCeXRlczsKCkJJVE1BUEZJTEVIRUFERVIgYm1wRmlsZUhlYWRlcjsKQklUTUFQSU5GTyBibXBJbmZvOwoKTFJFU1VMVCBDQUxMQkFDSyBXbmRQcm9jKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3cCwgTFBBUkFNIGxwKSB7CiAgSERDIGhkYzsKICBQQUlOVFNUUlVDVCBwczsKICBpbnQgaVNjYW47CiAgc3RhdGljIEJZVEUgKmJQaXhlbEJpdHM7CiAgc3RhdGljIGludCBXSURUSCA9IDA7CgogIHN3aXRjaCAobXNnKSB7CiAgY2FzZSBXTV9ERVNUUk9ZOgogICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwogICAgZnJlZShiUGl4ZWxCaXRzKTsKICAgIFBvc3RRdWl0TWVzc2FnZSgwKTsKICAgIHJldHVybiAwOwoKICBjYXNlIFdNX0NSRUFURToKICAgIFdJRFRIID0gNCAqICgoYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAqIGJtcEluZm8uYm1pSGVhZGVyLmJpQml0Q291bnQgKyAzMSkgLyAzMik7CiAgICBiUGl4ZWxCaXRzID0gKEJZVEUgKiltYWxsb2MoV0lEVEgpOwogICAgcmV0dXJuIDA7CgogIGNhc2UgV01fUEFJTlQ6CiAgICBoZGMgPSBCZWdpblBhaW50KGh3bmQsICZwcyk7IHsKICAgICAgZm9yIChpU2NhbiA9IDA7IGlTY2FuIDwgYm1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQ7IGlTY2FuKyspIHsKICAgICAgICBSZWFkRmlsZShoRmlsZSwgYlBpeGVsQml0cywgV0lEVEgsICZkd0J5dGVzLCBOVUxMKTsKICAgICAgICBTbGVlcCgxMCk7CiAgICAgICAgU2V0RElCaXRzVG9EZXZpY2UoaGRjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAvKiDou6LpgIHlhYjplbfmlrnlvaLjga7lt6bkuIrpmoUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBibXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoLCBibXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCwgLyogRElCIOOBruW5heODu+mrmOOBlSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIC8qIERJQiDjga7lt6bpmoXjga7oq5bnkIbluqfmqJkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBpU2NhbiwgLyogRElCIOWGheOBrumWi+Wni+i1sOafu+ihjCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qIHBQaXhlbEJpdHMg44GM56S644GZ6YWN5YiX5Lit44Gr5ZCr44G+44KM44Gm44GE44KLIERJQiDjga7otbDmn7vooYzjga7mlbAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBiUGl4ZWxCaXRzLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMpOwoKICAgICAgfQogICAgICBTZXRGaWxlUG9pbnRlcihoRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQklUTUFQRklMRUhFQURFUikgKyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIE5VTEwsIEZJTEVfQkVHSU4pOwogICAgfSBFbmRQYWludChod25kLCAmcHMpOwogICAgcmV0dXJuIDA7CgogIH0KICByZXR1cm4gRGVmV2luZG93UHJvYyhod25kLCBtc2csIHdwLCBscCk7Cn0KCmludCBXSU5BUEkgV2luTWFpbihISU5TVEFOQ0UgaEluc3RhbmNlLCBISU5TVEFOQ0UgaFByZXZJbnN0YW5jZSwgUFNUUiBscENtZExpbmUsIGludCBuQ21kU2hvdykgewogIEhXTkQgaHduZDsKICBNU0cgbXNnOwogIFdORENMQVNTIHdpbmM7CiAgRFdPUkQgZHdCeXRlczsKICBoRmlsZSA9IENyZWF0ZUZpbGUobHBDbWRMaW5lLCBHRU5FUklDX1JFQUQsIDAsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIE9QRU5fRVhJU1RJTkcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CiAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CiAgICBNZXNzYWdlQm94KE5VTEwsIFRFWFQoImZhaWx1cmUgb3BwZW5pbmcgZmlsZSIpLCBURVhUKCJFUlJPUiIpLCBNQl9PSyk7CiAgICByZXR1cm4gLTE7CiAgfQogIFJlYWRGaWxlKGhGaWxlLCAmYm1wRmlsZUhlYWRlciwgc2l6ZW9mKEJJVE1BUEZJTEVIRUFERVIpLCAmZHdCeXRlcywgTlVMTCk7CiAgaWYgKGJtcEZpbGVIZWFkZXIuYmZUeXBlICE9IDB4NGQ0MikgewogICAgTWVzc2FnZUJveChOVUxMLCBURVhUKCJUaGlzIGZpbGUgaXMgbm90IGJpdG1hcC4iKSwgVEVYVCgiRVJST1IiKSwgTUJfT0spOwogICAgcmV0dXJuIC0xOwogIH0KICBSZWFkRmlsZShoRmlsZSwgJmJtcEluZm8sIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSwgJmR3Qnl0ZXMsIE5VTEwpOwogIAogIHdpbmMuc3R5bGUgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKICB3aW5jLmxwZm5XbmRQcm9jID0gV25kUHJvYzsKICB3aW5jLmNiQ2xzRXh0cmEgPSAwOwogIHdpbmMuY2JXbmRFeHRyYSA9IDA7CiAgd2luYy5oSW5zdGFuY2UgPSBoSW5zdGFuY2U7CiAgd2luYy5oSWNvbiA9IExvYWRJY29uKE5VTEwsIElESV9BUFBMSUNBVElPTik7CiAgd2luYy5oQ3Vyc29yID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOwogIHdpbmMuaGJyQmFja2dyb3VuZCA9IChIQlJVU0gpR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOwogIHdpbmMubHBzek1lbnVOYW1lID0gTlVMTDsKICB3aW5jLmxwc3pDbGFzc05hbWUgPSBURVhUKCJLSVRUWSIpOwoKICBpZiAoIVJlZ2lzdGVyQ2xhc3MoJndpbmMpKSByZXR1cm4gLTE7CgogIGh3bmQgPSBDcmVhdGVXaW5kb3coVEVYVCgiS0lUVFkiKSwgVEVYVCgiS0lUVFkgb24geW91ciBsYXAiKSwKICAgICAgICAgICAgICAgICAgICAgIFdTX09WRVJMQVBQRURXSU5ET1cgfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICAgICAgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBoSW5zdGFuY2UsIE5VTEwpOwoKICBpZiAoaHduZCA9PSBOVUxMKSByZXR1cm4gMDsKCiAgd2hpbGUgKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpIHsKICAgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKICAgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwogIH0KICByZXR1cm4gbXNnLndQYXJhbTsKfQovKiBlbmQgKi8K