대화상자에 동영상뿌리기 - 소스첨부
3. View 클래스 OnDraw(CDC* pDC)
- pDC 화면에 일일이 픽셀 하나씩 점을 찍으니 로드되는 시간이 너무 길다.
그래서 메모리 비트맵을 사용하기로 했다.
// (속도 개선을 위해 비트맵이용해서 비트맵에 그린 후에 화면에 전송하기 이용)
CDC MemDC;
if (MemDC.GetSafeHdc() == NULL)
{
MemDC.CreateCompatibleDC(pDC); //화면 pDC와 호환되는 메모리DC 생성
}
CBitmap bmp;
CBitmap* pOldBmp= NULL;
bmp.CreateCompatibleBitmap(pDC, pDoc->n_OpenImg_Height, pDoc->n_OpenImg_Width);
//화면에 호환되는 비트맵 생성
pOldBmp= (CBitmap*)MemDC.SelectObject(&bmp); //메모리DC에서 bmp 선택
for(int y=0; y<pDoc->n_OpenImg_Height; y++)
{
for(int x=0; x<pDoc->n_OpenImg_Width; x++)
{
MemDC.SetPixel(x,y,
RGB(*(pDoc->m_pDib->m_OpenImg),
*(pDoc->m_pDib->m_OpenImg),
*(pDoc->m_pDib->m_OpenImg))); //MemDC에 픽셀들에 RGB값을 찍는다.
pDoc->m_pDib->m_OpenImg++;
}
}
//화면에 그린다: BufferADC 안에 내용들을 화면에 표현
pDC->BitBlt(0, 0, pDoc->n_OpenImg_Height, pDoc->n_OpenImg_Width,
&MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBmp);
ReleaseDC(&MemDC);
}
{
if(Cam_Start){
CDC MemDC;
{
MemDC.CreateCompatibleDC(&dc); //화면 pDC와 호환되는 메모리DC 생성
CBitmap* pOldBmp= NULL;
bmp.CreateCompatibleBitmap(&dc,Widths,Heights);
//화면에 호환되는 비트맵 생성
pOldBmp= (CBitmap*)MemDC.SelectObject(&bmp); //메모리DC에서 bmp 선택
for(int y=Heights-1; y>=0; y--)
{
y2++;
for(int x=0; x<=Widths-1; x++)
{
MemDC.SetPixel(x,y,RGB(Map2[y2][x].r, Map2[y2][x].g, Map2[y2][x].b)); //MemDC에 픽셀들에 RGB값을 찍는다.
}
//화면에 그린다
dc.BitBlt(200, 20, Widths, Heights,&MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBmp);
ReleaseDC(&MemDC);
}
}
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC DC(this);
draw_cam();
CDialog::OnPaint();
}
}
// 해줘도 실행하는데에는 아직 이상이 없었다..
아마. main에서 계속해서 draw_cam();를 실행하기 떄문에 좀 커버가 되지 않나 싶다.
문제점 : showwindow라는 OpenCV함수를 쓰지 않으면
메인대화상자가 죽어버리고...음..그래도 영상은 계속 뗘있다..ㅡㅡ
* 그리고 리스트박스에다 에러점을 출력하게 하였다..
.