H264解码之ddraw画矩形框和画字(滤镜)

void display::showOSD(HRESULT ddrval, int in_width, int in_height, FaceStructInfo *pUser, int nCount)
{
	HDC hDC = NULL;
	ddrval = m_pOsdSurface->GetDC(&hDC);

	if ((ddrval == DD_OK) && (hDC != NULL))
	{
		LOGFONT lf; //定义字体结构
		lf.lfWeight = 100; //字体磅数=10
		lf.lfHeight = 15; //字体高度(旋转后的字体宽度)=56
		lf.lfWidth = 5; //字体宽度(旋转后的字体高度)=20
		lf.lfUnderline = FALSE; //无下划线
		lf.lfStrikeOut = FALSE; //无删除线
		lf.lfItalic = FALSE; //非斜体
		lf.lfEscapement = 0; //字体显示角度=270°
		lf.lfCharSet = GB2312_CHARSET; //使用缺省字符集
		strcpy(lf.lfFaceName, "华文隶书"); //字体名=@system

		HFONT myLogFont = CreateFontIndirect(&lf);
		HGDIOBJ pOldFont  = SelectObject(hDC, myLogFont);//选入设备描述表

		//叠加文字
		SetBkMode(hDC, TRANSPARENT);

		std::string strColor = "#FF0000";
		DWORD r, g, b;
		sscanf(strColor.c_str(), "#%2X%2X%2X", &r, &g, &b);
		COLORREF rgb = RGB(r, g, b);
		SetTextColor(hDC, rgb);

		
		strColor = "#0000CD";
		sscanf(strColor.c_str(), "#%2X%2X%2X", &r, &g, &b);
		COLORREF rgbRect = RGB(r, g, b);

		HBRUSH hbrush;
		hbrush = CreateSolidBrush(rgbRect);

// 		HDC memdc = CreateCompatibleDC(hDC);
// 		BITMAP bmp;
// 		HBITMAP holdbmp, hbmp = (HBITMAP)LoadImage(0, "E:\\111.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
// 		holdbmp = (HBITMAP)SelectObject(memdc, hbmp);//这里把hbmp的位图选择到兼容DC memdc,之后这个兼容DC就拥有和
// 													 //hbmp同样大小的绘图区域,注意超出位图返回的GDI输出都是无效的.
// 		GetObject(hbmp, sizeof(BITMAP), &bmp);//这里获取位图的大小信息,事实上也是兼容DC绘图输出的范围

 		for (int i = 0; i < nCount; i++)
 		{
			RECT rect;
			GetClientRect(m_hwnd, &rect);
 			char info[128];
			rect.left = pUser[i].face_x * rect.right / m_rctSour.right;
			rect.top = pUser[i].face_y * rect.bottom / m_rctSour.bottom;
			rect.right = (pUser[i].face_x+ pUser[i].face_w) * rect.right / m_rctSour.right;
			rect.bottom = (pUser[i].face_y + pUser[i].face_h) * rect.bottom / m_rctSour.bottom;

			MONITORINFO mi;
			memset(&mi, 0, sizeof(MONITORINFO));
			mi.cbSize = sizeof(MONITORINFO);
			HMONITOR hmon = ::MonitorFromWindow(m_hwnd, MONITOR_DEFAULTTONEAREST);
			if (!hmon)
			{
				OutputDebugStringA("display::inputsource MonitorFromWindow error[hmon equ null]\r\n");
				return ;
			}
			::GetMonitorInfo(hmon, &mi);
			rect.left -= mi.rcMonitor.left;
			rect.right -= mi.rcMonitor.left;
			rect.top -= mi.rcMonitor.top;
			rect.bottom -= mi.rcMonitor.top;
			ClientToScreen(m_hwnd, (LPPOINT)&rect.left);
			ClientToScreen(m_hwnd, (LPPOINT)&rect.right);
			
			int nWidth = pUser[i].face_w * m_rctDest.right / m_rctSour.right;
			int nX = rect.left + nWidth+5;
			int nY = rect.top;

// 			RECT rc;
// 			rc.left = nX;
// 			rc.top = nY;
// 			rc.right = nX + 40;
// 			rc.top = nY + 140;

			//SetRect(&rc, 0, 0, bmp.bmWidth, bmp.bmHeight);
 			std::string strTemp = parseSex(pUser[i].usrSex);
 			_snprintf_s(info, sizeof(info), "性别:%s", strTemp.c_str());
 			TextOut(hDC, nX, nY, info, strlen(info));
 
 			strTemp = parseAge(pUser[i].userAge);
 			_snprintf_s(info, sizeof(info), "年龄:%s", strTemp.c_str());
 			TextOut(hDC, nX, nY + 20, info, strlen(info));
 
 			strTemp = parseBrow(pUser[i].userBrow);
 			_snprintf_s(info, sizeof(info), "表情:%s", strTemp.c_str());
 			TextOut(hDC, nX, nY + 40, info, strlen(info));
 
 			strTemp = parseHairstyle(pUser[i].userHairstyle);
 			_snprintf_s(info, sizeof(info), "发型:%s", strTemp.c_str());
 			TextOut(hDC, nX, nY + 60, info, strlen(info));
 
 			strTemp = parseGlasses(pUser[i].userGlasses);
 			_snprintf_s(info, sizeof(info), "眼镜:%s", strTemp.c_str());
 			TextOut(hDC, nX, nY + 80, info, strlen(info));
 
 			strTemp = parseHat(pUser[i].userHat);
 			_snprintf_s(info, sizeof(info), "帽子:%s", strTemp.c_str());
 			TextOut(hDC, nX, nY + 100, info, strlen(info));
 
 			strTemp = parseMask(pUser[i].userMask);
 			_snprintf_s(info, sizeof(info), "口罩:%s", strTemp.c_str());
 			TextOut(hDC, nX, nY + 120, info, strlen(info));
 
 			strTemp = parseRace(pUser[i].userRace);
 			_snprintf_s(info, sizeof(info), "人种:%s", strTemp.c_str());
 			TextOut(hDC, nX, nY + 140, info, strlen(info));
 
			
 			//画空心矩形
 			FrameRect(hDC, &rect, hbrush);

			rect.left -= 1;
			rect.right -= 1;
			rect.top -= 1;
			rect.bottom -= 1;
			FrameRect(hDC, &rect, hbrush);
 		}

// 		SelectObject(memdc, holdbmp);//复原兼容DC数据.
// 		DeleteDC(memdc);

		SelectObject(hDC, pOldFont); //将myFont从设备环境中分离
		DeleteObject(myLogFont); //删除myLogFont对象

		DeleteObject(hbrush);
		m_pOsdSurface->ReleaseDC(hDC);
		m_lpddsprimary->Blt(&m_rctDest, m_pOsdSurface, &m_rctDest, DDBLT_WAIT, NULL);
	}
}

 

posted @ 2018-07-23 16:00  SunkingYang  阅读(308)  评论(0编辑  收藏  举报