#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;
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);
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) + WIDTH * (iScan + 1),
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;
HANDLE hFile;
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 */
I2luY2x1ZGUgPHdpbmRvd3MuaD4KCkhBTkRMRSBoRmlsZTsKRFdPUkQgZHdCeXRlczsKCkJJVE1BUEZJTEVIRUFERVIgYm1wRmlsZUhlYWRlcjsKQklUTUFQSU5GTyBibXBJbmZvOwoKTFJFU1VMVCBDQUxMQkFDSyBXbmRQcm9jKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3cCwgTFBBUkFNIGxwKSB7CiAgSERDIGhkYzsKICBQQUlOVFNUUlVDVCBwczsKICBpbnQgaVNjYW47CiAgc3RhdGljIEJZVEUgKmJQaXhlbEJpdHM7CiAgaW50IFdJRFRIID0gMDsKCiAgc3dpdGNoIChtc2cpIHsKICBjYXNlIFdNX0RFU1RST1k6CiAgICBDbG9zZUhhbmRsZShoRmlsZSk7CiAgICBmcmVlKGJQaXhlbEJpdHMpOwogICAgUG9zdFF1aXRNZXNzYWdlKDApOwogICAgcmV0dXJuIDA7CgogIGNhc2UgV01fQ1JFQVRFOgogICAgV0lEVEggPSA0ICogKChibXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoICogYm1wSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCkgKyAzMSAvIDMyKTsKICAgIGJQaXhlbEJpdHMgPSAoQllURSAqKW1hbGxvYyhXSURUSCk7CiAgICByZXR1cm4gMDsKCiAgY2FzZSBXTV9QQUlOVDoKICAgIGhkYyA9IEJlZ2luUGFpbnQoaHduZCwgJnBzKTsgewogICAgICBmb3IgKGlTY2FuID0gMDsgaVNjYW4gPCBibXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodDsgaVNjYW4rKykgewogICAgICAgIFJlYWRGaWxlKGhGaWxlLCBiUGl4ZWxCaXRzLCBXSURUSCwgJmR3Qnl0ZXMsIE5VTEwpOwogICAgICAgIFNldERJQml0c1RvRGV2aWNlKGhkYywKICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAvKiDou6LpgIHlhYjplbfmlrnlvaLjga7lt6bkuIrpmoUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBibXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoLCBibXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCwgLyogRElCIOOBruW5heODu+mrmOOBlSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIC8qIERJQiDjga7lt6bpmoXjga7oq5bnkIbluqfmqJkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBpU2NhbiwgLyogRElCIOWGheOBrumWi+Wni+i1sOafu+ihjCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qIHBQaXhlbEJpdHMg44GM56S644GZ6YWN5YiX5Lit44Gr5ZCr44G+44KM44Gm44GE44KLIERJQiDjga7otbDmn7vooYzjga7mlbAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBiUGl4ZWxCaXRzLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMpOwoKICAgICAgICBTZXRGaWxlUG9pbnRlcihoRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQklUTUFQRklMRUhFQURFUikgKyBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyBXSURUSCAqIChpU2NhbiArIDEpLAogICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIEZJTEVfQkVHSU4pOwogICAgICB9CiAgICB9IEVuZFBhaW50KGh3bmQsICZwcyk7CiAgICByZXR1cm4gMDsKCiAgfQogIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIG1zZywgd3AsIGxwKTsKfQoKaW50IFdJTkFQSSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdGFuY2UsIEhJTlNUQU5DRSBoUHJldkluc3RhbmNlLCBQU1RSIGxwQ21kTGluZSwgaW50IG5DbWRTaG93KSB7CiAgSFdORCBod25kOwogIE1TRyBtc2c7CiAgV05EQ0xBU1Mgd2luYzsKICBIQU5ETEUgaEZpbGU7CiAgRFdPUkQgZHdCeXRlczsKICBoRmlsZSA9IENyZWF0ZUZpbGUobHBDbWRMaW5lLCBHRU5FUklDX1JFQUQsIDAsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIE9QRU5fRVhJU1RJTkcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CiAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CiAgICBNZXNzYWdlQm94KE5VTEwsIFRFWFQoImZhaWx1cmUgb3BwZW5pbmcgZmlsZSIpLCBURVhUKCJFUlJPUiIpLCBNQl9PSyk7CiAgICByZXR1cm4gLTE7CiAgfQogIFJlYWRGaWxlKGhGaWxlLCAmYm1wRmlsZUhlYWRlciwgc2l6ZW9mKEJJVE1BUEZJTEVIRUFERVIpLCAmZHdCeXRlcywgTlVMTCk7CiAgaWYgKGJtcEZpbGVIZWFkZXIuYmZUeXBlICE9IDB4NGQ0MikgewogICAgTWVzc2FnZUJveChOVUxMLCBURVhUKCJUaGlzIGZpbGUgaXMgbm90IGJpdG1hcC4iKSwgVEVYVCgiRVJST1IiKSwgTUJfT0spOwogICAgcmV0dXJuIC0xOwogIH0KICBSZWFkRmlsZShoRmlsZSwgJmJtcEluZm8sIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSwgJmR3Qnl0ZXMsIE5VTEwpOwoKICB3aW5jLnN0eWxlID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7CiAgd2luYy5scGZuV25kUHJvYyA9IFduZFByb2M7CiAgd2luYy5jYkNsc0V4dHJhID0gMDsKICB3aW5jLmNiV25kRXh0cmEgPSAwOwogIHdpbmMuaEluc3RhbmNlID0gaEluc3RhbmNlOwogIHdpbmMuaEljb24gPSBMb2FkSWNvbihOVUxMLCBJRElfQVBQTElDQVRJT04pOwogIHdpbmMuaEN1cnNvciA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsKICB3aW5jLmhickJhY2tncm91bmQgPSAoSEJSVVNIKUdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKTsKICB3aW5jLmxwc3pNZW51TmFtZSA9IE5VTEw7CiAgd2luYy5scHN6Q2xhc3NOYW1lID0gVEVYVCgiS0lUVFkiKTsKCiAgaWYgKCFSZWdpc3RlckNsYXNzKCZ3aW5jKSkgcmV0dXJuIC0xOwoKICBod25kID0gQ3JlYXRlV2luZG93KFRFWFQoIktJVFRZIiksIFRFWFQoIktJVFRZIG9uIHlvdXIgbGFwIiksCiAgICAgICAgICAgICAgICAgICAgICBXU19PVkVSTEFQUEVEV0lORE9XIHwgV1NfVklTSUJMRSwKICAgICAgICAgICAgICAgICAgICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgaEluc3RhbmNlLCBOVUxMKTsKCiAgaWYgKGh3bmQgPT0gTlVMTCkgcmV0dXJuIDA7CgogIHdoaWxlIChHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApKSB7CiAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CiAgICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnKTsKICB9CiAgcmV0dXJuIG1zZy53UGFyYW07Cn0KLyogZW5kICovCg==