在这个项目中用到了几个GDI的函数,包括CFont CPen CBrush等,一般要和设备上下文DC结合起来使用。
并且创建GDI对象使用完后一定要释放,否则可能会造成资源泄漏
对于CPen CFont CBrush用构造函数定义的GDI对象 和 用 CreateXXX获得的对象在释放时要调用DeleteObject
对于GetXXX获得的对象在释放时要使用ReleaseObject。
1
CDC *pDC0 = GetDlgItem(IDC_VIDEO0)->
GetDC();
2
CFont font;
//
GDI对象
3
font.CreatePointFont(
200
, _T(
"
宋体
"
));
//
CreateXXX
4
CFont *oldFont = pDC0->SelectObject(&
font);
5
pDC0->TextOut(
20
,
20
, CString(_T(
"
1
"
)));
6
pDC0->
SelectObject(oldFont);
7
8
GetDlgItem(IDC_VIDEO0)->
ReleaseDC(pDC0);
9
10
font.DeleteObject();
//
释放GDI对象资源
下面的例子是画一个矩形的边框,矩形是一个Picture控件,当点击该控件时给这个控件的边缘画颜色
1
CRect rect;
2
CDC* pDC = GetDlgItem(m_nCurrentPicture)->
GetDC();
3
GetDlgItem(m_nCurrentPicture)->GetClientRect(&
rect);
4
5
CPen pen(PS_SOLID,
10
, RGB(
0x99
,
0x32
,
0xcc
));
6
CPen *oldPen =
NULL;
7
oldPen = pDC->SelectObject(&
pen);
8
9
//
上边框;
10
pDC->
MoveTo(rect.TopLeft());
11
pDC->LineTo(CPoint(rect.TopLeft().x + rect.Width(),
//
x
12
rect.TopLeft().y
//
y
13
) );
14
15
//
右边框;
16
pDC->MoveTo(CPoint(rect.TopLeft().x + rect.Width(),
//
x
17
rect.TopLeft().y
//
y
18
));
19
pDC->
LineTo(rect.BottomRight());
20
21
//
下边框;
22
pDC->
MoveTo(rect.BottomRight());
23
pDC->LineTo(rect.TopLeft().x,
//
x
24
rect.BottomRight().y
//
y
25
);
26
27
//
左边框;
28
pDC->MoveTo(rect.TopLeft().x,
//
x
29
rect.BottomRight().y
//
y
30
);
31
pDC->
LineTo(rect.TopLeft());
32
33
34
pDC->
SelectObject(oldPen);
35
36
int
ret = GetDlgItem(m_nCurrentPicture)->
ReleaseDC(pDC);
37
pDC =
NULL;
38
39
pen.DeleteObject();
多个Picture控件,每个Picture控件都在控件中间位置写上1 2 3 4等数字标识是哪个摄像头
1
void
CCameraMonitorView::OnDraw(CDC*
/*
pDC
*/
)
2
{
3
//
TODO: 在此添加专用代码和/或调用基类;
4
5
if
(
0
!=
m_nCurrentPicture)
6
{
7
ChoosePicture(m_nCurrentPicture);
8
}
9
10
int
index =
0
;
11
for
(index =
0
; index < MAX_CAMERAS_NUM; ++
index)
12
{
13
if
(videoPicturesCtrl[index] !=
0
)
14
{
15
CDC *pDC = GetDlgItem(videoPicturesCtrl[index])->
GetDC();
16
CFont font;
17
font.CreatePointFont(
800
, _T(
"
宋体
"
));
18
CFont *oldFont = pDC->SelectObject(&
font);
19
pDC->
SetBkMode(TRANSPARENT);
20
CRect rect;
21
GetDlgItem(videoPicturesCtrl[index])->GetClientRect(&
rect);
22
23
int
x = (rect.Width() /
2
) -
20
;
24
int
y = (rect.Height() /
2
) -
40
;
25
char
numArr[
5
] = {
0
};
26
_itoa_s(index +
1
, numArr, RADIX_10);
27
CString strDisplayNum(numArr);
28
29
pDC->
TextOut(x, y, strDisplayNum);
30
pDC->
SelectObject(oldFont);
31
32
GetDlgItem(IDC_VIDEO1)->
ReleaseDC(pDC);
33
34
font.DeleteObject();
35
36
}
37
}
38
39
}
从窗口指针获得DC
CDC *pDC = pWnd->GetDC();
根据DC获得HDC
HDC hDC = pDC->GetSafeHdc();
根据句柄获得窗口指针
CWnd *pWnd = FromHandle(hWnd);
void
CJietu::OnPaint()
{
CPaintDC dc(
this
);
//
device context for painting
//
TODO: 在此处添加消息处理程序代码
//
不为绘图消息调用 CDialog::OnPaint()
HWND hWnd
=
m_hWnd;
CWnd
*pWnd =
FromHandle(hWnd);
CDC
*pDC = pWnd->
GetDC();
HDC hDC
= pDC->
GetSafeHdc();
StretchBlt(hDC,
0
,
0
, m_nCx, m_nCy, m_hDCGlobal,
0
,
0
, m_nCx, m_nCy, SRCCOPY);
pWnd
->
ReleaseDC(pDC);
}
另外一个例子
1
bool
DrawPicToHDC(IplImage *img, HWND hWnd,
bool
bIsShowInfo)
2
{
3
CWnd *pWnd =
CWnd::FromHandle(hWnd);
4
if
(NULL == pWnd || FALSE == ::IsWindow(pWnd->
m_hWnd))
5
{
6
AfxMessageBox(_T(
"
DrawPicToHDC error 2
"
));
7
return
false
;
8
}
9
10
CDC *pDC = pWnd->
GetDC();
11
HDC hDC = pDC->
GetSafeHdc();
12
CRect rect;
13
pWnd->GetClientRect(&
rect);
14
CvvImage cimg;
15
cimg.CopyOf(img);
16
cimg.DrawToHDC(hDC, &
rect);
17
18
pDC->SetBkMode(TRANSPARENT);
//
文字透明;
19
CTime time = CTime::GetCurrentTime();
//
获得当前时间;
20
CString strTime;
21
strTime = time.Format(
"
%Y-%m-%d %H:%M:%S
"
);
22
23
CFont font;
24
font.CreatePointFont(
200
, _T(
"
宋体
"
), NULL);
25
CFont *oldFont = pDC->SelectObject(&
font);
26
pDC->SetTextColor(RGB(
255
,
0
,
0
));
//
文字颜色
27
28
pDC->TextOut(
10
,
10
, strTime);
29
30
if
(
true
==
bIsShowInfo)
31
{
32
pDC->TextOut(
10
,
35
, CString(
"
正在录像...
"
));
33
}
34
35
pDC->
SelectObject(oldFont);
36
37
ReleaseDC(hWnd,hDC);
//
释放DC
38
font.DeleteObject();
//
释放GDI对象
39
40
return
true
;
41
}

