공부

20200831 공부

글로벌디노 2020. 9. 1. 00:59

1. 32bit 비트맵파일 읽어서 출력하기

2. 문제만들기

 

 

 

1. 32bit 비트맵파일 읽어서 출력하기

출력결과

 

백버퍼로 사용할 DIB 생성

BITMAPINFO bmi;
SPRITE screen;

void CreateBackBuffer(HWND hWnd, int width, int height)
{
    // dib 만들기
    bmi.bmiHeader =
    {
        sizeof(BITMAPINFOHEADER),
        width,
        -height,
        1,
        32,
        BI_RGB,
        (DWORD)width* height * 4,
        0,0,
        0,0
    };

    screen.width = width;
    screen.height = height;
    screen.image = (BYTE*)malloc(bmi.bmiHeader.biSizeImage);
}

 

 

 

비트맵파일 로드

BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;

typedef struct stSprite
{
    BYTE* image;
    int width;
    int height;
}SPRITE, *PSPRITE;
SPRITE sprite;

void LoadImageFile()
{
    FILE* file;
    if (_wfopen_s(&file, L"E:\\Sprite_Data\\Attack1_L_01.bmp", L"rb") != 0)
    {
        MessageBoxW(NULL, L"file open fail", L"error", MB_OK);
        return;
    }

    // 파일정보헤더
    fread_s(&bmfh, sizeof(bmfh), sizeof(bmfh), 1, file);

    // 비트맵정보헤더
    fread_s(&bmih, sizeof(bmih), sizeof(bmih), 1, file);

    // 스프라이트 정보채우기
    int imgWidth = bmih.biWidth;
    int imgHeight = bmih.biHeight;
    sprite.width = imgWidth;
    sprite.height = imgHeight;

    // 상하로 뒤집힌 이미지 정보를 정방향으로 저장
    int imgSize = imgWidth * imgHeight * 4/*(bmih.biBitCount / 8)*/;
    sprite.image = (BYTE*)malloc(imgSize);
    
    BYTE* temp = (BYTE*)malloc(imgSize);
    fread_s(temp, imgSize, imgSize, 1, file);

    int imgWidthMemSize = imgWidth * 4;
    BYTE* dest = sprite.image;
    BYTE* src = temp + imgSize - imgWidthMemSize;

    for (int i = 0; i < imgHeight; i++)
    {
        memcpy_s(dest, imgWidthMemSize, src, imgWidthMemSize);
        dest += imgWidthMemSize;
        src -= imgWidthMemSize;
    }

    free(temp);
    fclose(file);
}

 

 

1. 배경을 알록달록하게 칠하기

2. 읽어온 비트맵 이미지의 0xFFFFFFFF(하얀색) 부분을 제외하고 백버퍼에 그린다

3. 백버퍼를 메인DC에 복사한다

case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다...

            RGBQUAD* dest = (RGBQUAD*)screen.image;
            RGBQUAD* cur = dest;
            for (int j = 0; j < screen.height; j++)
            {
                for (int i = 0; i < screen.width; i++)
                {
                    *cur = { (BYTE)i, (BYTE)j, 255 };
                    ++cur;
                }
                dest += screen.width;
                cur = dest;
            }

            dest = (RGBQUAD*)screen.image;
            dest += screen.width * posY + posX;
            cur = dest;

            unsigned int* src = (unsigned int*)sprite.image;

            for (int i = 0; i < sprite.height; i++)
            {
                for (int j = 0; j < sprite.width; j++)
                {
                    if (*src != 0xFFFFFFFF)
                        *cur = *((RGBQUAD*)src);
                    ++cur;
                    ++src;
                }
                dest += screen.width;
                cur = dest;
            }
            
            StretchDIBits(hdc, 
                0, 0, screen.width, screen.height, 
                0, 0, screen.width, screen.height, 
                screen.image, &bmi, 
                DIB_RGB_COLORS, SRCCOPY);

            EndPaint(hWnd, &ps);
        }
        break;

 

 


2. 문제만들기

 

1. 음수표현

 

1)

char num1 = -12;

num1값을 16진수로 표현하시오

 

2)

char num2 = 0x88;

num2 값을 정수로 표현하시오

 

 

2. static

main.cpp

#include "test.h"

int main()
{
	++number1;
	++number2;

	return 0;
}

test.h

#pragma once

extern int number1;
extern int number2;

test.cpp

#include "test.h"

static int number1 = 10;
int number2 = 20;

위 코드는 빌드시 에러가 발생한다

이유는?

 

 

3. 연산자 우선순위

unsigned int a = 5;
unsigned int b = 100;
unsigned int c = 0;
c = a + b << 4;

c 에 들어갈 값을 구하시오

 

 

4. 증분링크란?

 

 

5. 패딩비트

class Data
{
	char ch;
	short sh;
	char ch2;
	double db;
	char ch3;
	short sh2;
	char ch4;
	int n2;
};

위 클래스를 sizeof 연산하면 나오는 값은?

 

 

 

 

정답

1.

1) 0xF4,   2) -120

 

2.

static int number1 변수는 test.cpp 파일 안에서만 사용 가능하다

 

3.

1680

 

4.

함수(코드)나 데이터 메모리 구간별로 어느정도 간격을 두어, 수정된 항목이 크지 않다면 해당 위치에 단순히 삽입하는 링크방식

장점 : 빌드시 링크시간 단축

단점 : 실행파일 크기가 커짐

 

5.

32바이트

 

반응형

'공부' 카테고리의 다른 글

20200902 공부  (0) 2020.09.02
20200901 공부  (0) 2020.09.02
24bit BMP 파일 읽어서 윈도우 출력  (0) 2020.08.25
VirtualAlloc 함수를 이용한 Dynamic Array Design  (0) 2020.08.15
쓰레드 동기화 인터락 함수  (0) 2020.08.06