중화사전망 - 구한말 사전 - 이미지 융합 코드는 C를 사용해 주세요. 영웅 여러분 감사합니다.
이미지 융합 코드는 C를 사용해 주세요. 영웅 여러분 감사합니다.
게임은 핵심 작업과 인터페이스에 지나지 않습니다. 인터페이스에는 일반적으로 전경과 배경이 있으며 배경은 대개 큰 비트맵을 표시하며 전경은 대개 사람이 조작하는 부분(또는 컴퓨터가 사람의 조작을 시뮬레이션하는 부분)입니다. 배경 비트맵은 일반적으로 인터페이스 전체를 덮고 있으며, 그려서 추가하면 주변이 깔끔합니다. 전경 비트맵은 비행기, 동물, 사람 등과 같이 일반적으로 불규칙합니다. 하지만 위의 예처럼 사자 비트맵이 배경색이 아닌 원본 비트맵의 색상으로 둘러싸여 있어 보기에 좋지 않습니다.
그럼 배경 비트맵이 보이도록 전경 비트맵의 배경색을 제거하는 방법은 무엇일까요? 이것이 바로 이 섹션입니다. 구현 원칙은 색상을 지정한 다음 해당 색상이 그려지지 않도록 처리하는 것입니다. 위의 사자처럼 투명색을 흰색 RGB(255, 255, 255)로 지정하면 됩니다.
다음은 TransparentBitmap() 함수입니다:
//이 함수는 지정된 색상을 투명 색상으로 바꾸고 크기를 변경할 수 있습니다.
/ /hdc 디스플레이 핸들
//hBitmap 표시할 비트맵
//xStart, xStart가 표시하는 위치
//xadd, yadd가 표시하는 비트맵 크기 변경 : 확대 및 축소
// 예: xadd=3은 비트맵 너비에 3을 추가한다는 의미입니다.
// cTransparentColor는 투명 색상이 됩니다.
void CMy1_6View ::TransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart,
short yStart, short xadd, short yadd, COLORREF cTransparentColor)
{
BITMAP m_bm;
COLORREF cColor;
//임시 DC 생성
HDC hMem, hBack, hObject, hTemp, hBack = CreateCompatibleDC; (hdc);
hObject = CreateCompatibleDC(hdc);
hMem = CreateCompatibleDC(hdc)
hSave = CreateCompatibleDC(hdc);
p>
hTemp = CreateCompatibleDC(hdc);
// 비트맵 선택
SelectObject(hTemp, hBitmap)
GetObject(hBitmap) , sizeof(BITMAP), (LPSTR)&m_bm);
//비트맵 너비 및 높이 표시
POINT ptSize;
//비트맵 너비 가져오기
ptSize.x = m_bm.bmWidth;
// 비트맵의 정도를 가져옵니다.
ptSize.y = m_bm.bmHeight; > // 논리 포인트 값으로 변환
DPtoLP(hTemp, amp; ptSize, 1)
// 임시 비트맵 생성
HBITMAP bmBack , bmObject, bmMem, bmSave;
// 흑백 비트맵
bmBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL)
bmObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
// 장치 호환 비트맵
bmMem = CreateCompatibleBitmap(hdc,
ptSize.x, ptSize.y);
bmSave = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
//생성된 임시 비트맵을 임시 DC Medium으로 선택
HBITMAP OldbmBack, OldbmObject, OldbmMem, OldbmSave;
OldbmBack = (HBITMAP)SelectObject(hBack, bmBack);
OldbmObject = (HBITMAP)SelectObject( hObject , bmObject);
OldbmMem = (HBITMAP)SelectObject(hMem, bmMem);
OldbmSave = (HBITMAP)SelectObject(hSave, bmSave);
/ /매핑 모드 설정
SetMapMode(hTemp, GetMapMode(hdc));
//원본 비트맵을 먼저 유지
BitBlt(hSave, 0, 0 , ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY);
// 배경색을 투명해야 하는 색상으로 설정
cColor = SetBkColor( hTemp, cTransparentColor );
// 대상 마스크 코드 생성
BitBlt(hObject, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY);
// 소스 DC의 원래 배경색을 복원합니다.
SetBkColor(hTemp, cColor)
// 반전된 대상 마스크 생성
BitBlt(hBack, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, NOTSRCCOPY);
//메인 DC의 배경을 대상 DC에 복사
p>BitBlt (hMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY);
// 비트맵 표시 영역 마스크
p>BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, SRCAND);
// 비트맵의 투명 색상을 마스크합니다
BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hBack, 0, 0, SRCAND);
// 비트맵과 대상 DC의 배경 간의 왼쪽 XOR 연산
BitBlt(hMem , 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCPAINT);
// 대상을 화면에 복사합니다
StretchBlt(hdc, xStart, yStart , ptSize.x xadd, ptSize.y yadd
, hMem, 0, 0, ptSize.x, ptSize.y, SRCCOPY);
// 원본 비트맵 복원
BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hSave, 0, 0, SRCCOPY);
//임시 메모리 비트맵 삭제
DeleteObject(SelectObject(hBack, OldbmBack));
DeleteObject(SelectObject(hObject, OldbmObject))
DeleteObject(SelectObject(hMem, OldbmMem))
DeleteObject(SelectObject(hSave, OldbmSave)); >//임시 메모리 DC 삭제
DeleteDC(hMem);
DeleteDC(hBack)
DeleteDC(hObject); DeleteDC(hSave);
DeleteDC(hTemp);
}
사용 시에는 함수 괄호 안에 추가하면 됩니다. 필요에 따라 각 값이 적용됩니다. 예제 1_6을 사용하여 설명하겠습니다.
a. 새 단일 문서 프로젝트 1_6을 만들고 다음과 같이 변수를 추가합니다. (설명은 위에 있음)
short xStart;
짧은 yStart;
짧은 xadd;
CBitmap m_Bitmap;
b. CMy1_6View() 함수에 다음 명령문을 추가합니다:
CMy1_6View::CMy1_6View()
{
// TODO: 구성 추가 여기에 코드를 입력하세요. p>
xStart=30;
xadd=0;
m_Bitmap .LoadBitmap(IDB_BITMAP1);
cTransparentColor=RGB(255, 255, 255)
}
c. .
d. 다음과 같이 OnCreate(LPCREATESTRUCT lpCreateStruct) 및 OnTimer(UINT nIDEvent) 함수를 추가합니다:
int CMy1_6View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 여기에 특수 생성 코드를 추가하세요 p>
SetTimer(1, 150, NULL);
0 반환
}
void CMy1_6View::OnTimer(UINT nIDEvent) p>
p>
{
// TODO: 여기에 메시지 처리기 코드를 추가하거나 기본값을 호출합니다.
//포인터 가져오기 pdc
CDC *pDC =GetDC();
//다시 그리기 위해 OnDraw(pDC) 호출
OnDraw(pDC);
CClientDC dc(this );
//오른쪽 및 아래로 이동
xStart =5;
yStart =5
//에 2를 추가합니다. 비트맵의 너비와 높이
xadd =2;
yadd =2
//표시
TransparentBitmap(dc.GetSafeHdc (), m_Bitmap, xStart, yStart, xadd, yadd, cTransparentColor)
CView::OnTimer(nIDEvent)
}
e. "투명 비트맵" 기능은 아직 정의되지 않았으므로 시작 부분에 기능을 추가해야 합니다.
전체 함수를 1_6View.cpp에 복사한 다음 1_6View.h에 추가합니다.
void TransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart,
short yStart, short xadd, short yadd, COLORREF cTransparentColor);
f. 마지막으로 OnDraw(CDC* pDC) 함수에 배경을 추가합니다:
void CMy1_6View::OnDraw(CDC* pDC)
{
CMy1_6Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: 여기에 네이티브 데이터에 대한 그리기 코드를 추가합니다.
//빨간색 배경 칠하기
CBrush mybrush1;
mybrush1.CreateSolidBrush(RGB(255, 0, 0))
CRect myect1(0, 0, 1200, 800);
pDC-gt; FillRect(myect1, amp; mybrush1)
}
g. ,어때요? 이미지도 커집니다!