#include <windows.h>

#define WIDTH 800

#define HEIGHT 600

BITMAPINFO bmpInfo;

LPDWORD lpPixel;

HBITMAP hBitmap;

HDC hMemDC;

 

LPBITMAPINFO lpBitmapInfo;


HBITMAP hDib;

 

HBITMAP LoadBMP(void)

{

HWND hwnd = GetDesktopWindow();

LPVOID lpDIBits = 0;

HANDLE hFile;

hFile = CreateFile("bmpimage.bmp", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

if(hFile == INVALID_HANDLE_VALUE) return NULL;

 

BITMAPFILEHEADER bmFileHeader;

LPBYTE pByte = 0;

DWORD dwReadBytes;

 

ReadFile(hFile, &bmFileHeader, sizeof(BITMAPFILEHEADER), &dwReadBytes, NULL);

int iBitmapInfoSize = bmFileHeader.bfOffBits - sizeof(BITMAPFILEHEADER);

pByte = new BYTE[iBitmapInfoSize];

ReadFile(hFile, pByte, iBitmapInfoSize, &dwReadBytes, NULL);

 

HDC hdc = GetDC(hwnd);

lpBitmapInfo = (LPBITMAPINFO) pByte;

 

hDib = CreateDIBSection(hdc, lpBitmapInfo, DIB_RGB_COLORS, &lpDIBits, NULL, 0);

ReadFile(hFile, lpDIBits, lpBitmapInfo->bmiHeader.biSizeImage, &dwReadBytes, NULL);

/*

BYTE* pColor;

pColor = pByte;

BYTE* pTemp = (BYTE*)lpDIBits;

BYTE* pGray = pTemp;

 

BYTE R;

BYTE G;

BYTE B;

BYTE gray;

 

for(int i=0; i<lpBitmapInfo->bmiHeader.biSizeImage;)

{

R = *pTemp; pTemp ++;i++;

B = *pTemp; pTemp ++;i++;

G = *pTemp; pTemp ++;i++;

gray = 0.2999 * R + 0.5870 * G + 0.1140 * B;

*pGray = gray; pGray++;

*pGray = gray; pGray++;

*pGray = gray; pGray++;

}

*/

 

ReleaseDC(hwnd, hdc);

 

if(pByte){delete[]pByte; pByte = 0;}

if(hFile){CloseHandle(hFile); hFile = 0;}

 

return hDib;

}

 

void SetDib(HWND _hwnd)

{

bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bmpInfo.bmiHeader.biWidth = WIDTH;

bmpInfo.bmiHeader.biWidth = HEIGHT;

 

bmpInfo.bmiHeader.biPlanes = 1;

bmpInfo.bmiHeader.biBitCount = 32;

bmpInfo.bmiHeader.biCompression = BI_RGB;

 

HDC hdc = GetDC(_hwnd);

hBitmap = CreateDIBSection(hdc, &bmpInfo, DIB_RGB_COLORS, (void**)&lpPixel, NULL, 0);

hMemDC = CreateCompatibleDC(hdc);


SelectObject(hMemDC, LoadBMP());

ReleaseDC(_hwnd, hdc);

}

 

void DestroyDib(void)

{

DeleteDC(hMemDC);

DeleteObject(hBitmap);

}

 

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow)

{

HWND hwnd;

MSG msg;

 

WNDCLASS WndClass;

 

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 = "WindowsFirst";

 

RegisterClass(&WndClass);

 

hwnd = CreateWindow("WindowsFirst", "WindowsFirst Title",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

NULL,

hInstance,

NULL);

 

ShowWindow(hwnd, nCmdShow);

UpdateWindow(hwnd);

 

while(GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

 

}

 

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps;

    HDC         hdc;

 

    switch (iMsg)

    {

    case WM_CREATE:

SetDib(hwnd);

        break;

    case WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

BitBlt(hdc, 0, 0, WIDTH, HEIGHT, hMemDC, 0, 0, SRCCOPY);

EndPaint(hwnd, &ps);

        break;

    case WM_DESTROY:

DestroyDib();

        PostQuitMessage(0);

        break;

    }

 

    return DefWindowProc(hwnd, iMsg, wParam, lParam);

}


bmp 파일 로드해와서 출력하는 코드인데

나는 빡대가리라 LoadBMP 함수를 통채로 SetDib함수의 ObjectSelect에다가 집어넣었음.

근데 함수 통채로 집어넣으면 destroy가 안된대서 뭐 다르게 해보라는데

우째해야하누..?

빨간줄이 핵심

아 api ㅣㅈㄴ자 조깥이 어려워서 자살하고싶다