#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 ㅣㅈㄴ자 조깥이 어려워서 자살하고싶다
빨간색 윗줄에 HBITMAP 변수 하나 잡고 거기에 LoadBitmap을 넣어주면 된다.