MFC设置picture control的大小
CRect rect ;
GetDlgItem(IDC_piCtrl1)->GetWindowRect(&rect); //IDC_WAVE_DRAW为Picture Control的ID
ScreenToClient(&rect);
GetDlgItem(IDC_piCtrl1)->MoveWindow(rect.left, rect.top, 674, 800, true); //固定Picture Control控件的大小
把Mat图像显示到picture control控件
void CAnnotationDlg::ShowMatImage(Mat& src,int ID)
{
try
{
if (src.empty())//没有图像时推出
{
return;
}
BITMAPINFO *pBmpInfo1 = NULL;
if (src.channels() == 1)//灰度图像显示
{
pBmpInfo1 = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];bmp图信息头
pBmpInfo1->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pBmpInfo1->bmiHeader.biWidth = src.cols;//src_rec.Width();
pBmpInfo1->bmiHeader.biHeight = -src.rows; //-src_rec.Height();//为负值
pBmpInfo1->bmiHeader.biPlanes = 1;
pBmpInfo1->bmiHeader.biBitCount = 8;//八位
pBmpInfo1->bmiHeader.biCompression = BI_RGB;
pBmpInfo1->bmiHeader.biSizeImage = 0;
pBmpInfo1->bmiHeader.biXPelsPerMeter = 0;
pBmpInfo1->bmiHeader.biYPelsPerMeter = 0;
pBmpInfo1->bmiHeader.biClrUsed = 0;
pBmpInfo1->bmiHeader.biClrImportant = 0;
for (int i = 0; i < 256; i++)//只有灰度图像需要颜色表
{
pBmpInfo1->bmiColors[i].rgbBlue = pBmpInfo1->bmiColors[i].rgbGreen = pBmpInfo1->bmiColors[i].rgbRed = (BYTE)i;
pBmpInfo1->bmiColors[i].rgbReserved = 0;
}
}
if (src.channels() == 3)
{
pBmpInfo1 = (BITMAPINFO*) new char[sizeof(BITMAPINFOHEADER)];
pBmpInfo1->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pBmpInfo1->bmiHeader.biWidth = src.cols;//src_rec.Width();
pBmpInfo1->bmiHeader.biHeight = -src.rows; //-src_rec.Height();//为负值
pBmpInfo1->bmiHeader.biPlanes = 1;
pBmpInfo1->bmiHeader.biBitCount = 24;//24位
pBmpInfo1->bmiHeader.biCompression = BI_RGB;
pBmpInfo1->bmiHeader.biSizeImage = 0;
pBmpInfo1->bmiHeader.biXPelsPerMeter = 0;
pBmpInfo1->bmiHeader.biYPelsPerMeter = 0;
pBmpInfo1->bmiHeader.biClrUsed = 0;
pBmpInfo1->bmiHeader.biClrImportant = 0;
}
HDC h_dc = GetDlgItem(ID)->GetDC()->GetSafeHdc();
CRect BoxSize;
GetDlgItem(ID)->GetClientRect(&BoxSize);
SetStretchBltMode(
h_dc, // handle to device context
HALFTONE);
int jj = StretchDIBits(h_dc, BoxSize.left, BoxSize.top, BoxSize.Width(), BoxSize.Height(), 0, 0, src.cols, src.rows, (void *)src.data,
(BITMAPINFO*)pBmpInfo1, DIB_RGB_COLORS, SRCCOPY);
delete[]pBmpInfo1;
return;
}
catch (...)
{
return;
}
}
调用举例
ShowMatImage(img, IDC_piCtrl1);
清除picture control控件上的图片
GetDlgItem(IDC_piCtrl1)->ShowWindow(FALSE);