20140925
146일차
#include <windows.h>
#define BITMAP_MAXSIZE (1024*768*3+10)
#define XOFFSET 280
#define X_WIDTH_SIZE 150
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass=TEXT("First");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while (GetMessage(&Message,NULL,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
unsigned char * BMbuf;
HBITMAP Screen;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
static HDC MemDC;
PAINTSTRUCT ps;
HANDLE hFile;
DWORD dwRead;
TCHAR str[1024];
static BITMAPFILEHEADER * stpBFH;
static BITMAPINFOHEADER * stpBIH;
static unsigned int uiX;
static unsigned int uiY;
unsigned int uiXcount;
unsigned int uiYcount;
unsigned char * ucpPixel;
static unsigned int uiPad;
HBITMAP OldBitmap;
RECT rt;
switch (iMessage)
{
case WM_CREATE:
hFile = CreateFile(TEXT("image.bmp"),
GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
BMbuf = (unsigned char *)malloc(BITMAP_MAXSIZE);
if(0 == BMbuf)
{
MessageBox(hWnd, TEXT("동적할당을 받을 수 없습니다."), TEXT("오류"), MB_OK);
DestroyWindow(hWnd);
}
if(INVALID_HANDLE_VALUE != hFile)
{
ReadFile(hFile, BMbuf, BITMAP_MAXSIZE, &dwRead, NULL);
CloseHandle(hFile);
stpBFH = (BITMAPFILEHEADER *)BMbuf;
stpBIH = (BITMAPINFOHEADER *)(BMbuf + sizeof(BITMAPFILEHEADER));
wsprintf(str, TEXT("[%c][%c]"), BMbuf[0], BMbuf[1]);
CreateWindow(TEXT("static"), TEXT("파일 타입 : "), WS_CHILD | WS_VISIBLE,
20, 20, 90, 20, hWnd, (HMENU)-1, g_hInst, NULL);
CreateWindow(TEXT("static"), str, WS_CHILD | WS_VISIBLE,
110, 20, X_WIDTH_SIZE, 20, hWnd, (HMENU)-1, g_hInst, NULL);
wsprintf(str, TEXT("[%d byte]"), stpBFH->bfSize);
CreateWindow(TEXT("static"), TEXT("파일 크기 : "), WS_CHILD | WS_VISIBLE,
20, 40, 90, 20, hWnd, (HMENU)-1, g_hInst, NULL);
CreateWindow(TEXT("static"), str, WS_CHILD | WS_VISIBLE,
110, 40, X_WIDTH_SIZE, 20, hWnd, (HMENU)-1, g_hInst, NULL);
wsprintf(str, TEXT("[%u]"), stpBIH->biWidth);
CreateWindow(TEXT("static"), TEXT("가로 크기 : "), WS_CHILD | WS_VISIBLE,
20, 60, 90, 20, hWnd, (HMENU)-1, g_hInst, NULL);
CreateWindow(TEXT("static"), str, WS_CHILD | WS_VISIBLE,
110, 60, X_WIDTH_SIZE, 20, hWnd, (HMENU)-1, g_hInst, NULL);
uiX = (unsigned int)(stpBIH->biWidth);
uiPad = uiX%4;
wsprintf(str, TEXT("[%u]"), stpBIH->biHeight);
CreateWindow(TEXT("static"), TEXT("세로 크기 : "), WS_CHILD | WS_VISIBLE,
20, 80, 90, 20, hWnd, (HMENU)-1, g_hInst, NULL);
CreateWindow(TEXT("static"), str, WS_CHILD | WS_VISIBLE,
110, 80, X_WIDTH_SIZE, 20, hWnd, (HMENU)-1, g_hInst, NULL);
uiY = (unsigned int)(stpBIH->biHeight);
wsprintf(str, TEXT("[%08X]"), stpBFH->bfOffBits);
CreateWindow(TEXT("static"), TEXT("bfOffbits : "), WS_CHILD | WS_VISIBLE,
20, 100, 90, 20, hWnd, (HMENU)-1, g_hInst, NULL);
CreateWindow(TEXT("static"), str, WS_CHILD | WS_VISIBLE,
110, 100, X_WIDTH_SIZE, 20, hWnd, (HMENU)-1, g_hInst, NULL);
hdc = GetDC(hWnd);
MemDC = CreateCompatibleDC(hdc);
GetClientRect(hWnd, &rt);
Screen = CreateCompatibleBitmap(hdc, rt.right, rt.bottom);
OldBitmap = (HBITMAP)SelectObject(MemDC, Screen);
ucpPixel = BMbuf + stpBFH->bfOffBits;
for(uiYcount = uiY; 0 < uiYcount; --uiYcount)
{
for(uiXcount = 0; uiX > uiXcount; ++uiXcount)
{
SetPixel(MemDC, uiXcount + XOFFSET, uiYcount-1, RGB(*(ucpPixel+2), *(ucpPixel+1), *ucpPixel));
ucpPixel = ucpPixel + 3;
}
ucpPixel = ucpPixel + uiPad;
}
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
ReleaseDC(hWnd, hdc);
free(BMbuf);
}
else
{
MessageBox(hWnd, TEXT("파일을 열 수 없습니다."), TEXT("오류"), MB_OK);
DestroyWindow(hWnd);
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
MemDC = CreateCompatibleDC(hdc);
OldBitmap = (HBITMAP)SelectObject(MemDC, Screen);
GetClientRect(hWnd, &rt);
BitBlt(hdc, 0, 0, rt.right, rt.bottom, MemDC, 0, 0, SRCCOPY);
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
DeleteObject(Screen);
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}