15,979
社区成员
发帖
与我相关
我的任务
分享
class LayeredWindowInfo {
const POINT m_sourcePosition;
POINT m_windowPosition;
CSize m_size;
BLENDFUNCTION m_blend;
UPDATELAYEREDWINDOWINFO m_info;
public:
LayeredWindowInfo(
__in UINT width,
__in UINT height) :
m_sourcePosition(),
m_windowPosition(),
m_size(width, height),
m_blend(),
m_info() {
m_info.cbSize = sizeof(UPDATELAYEREDWINDOWINFO);
m_info.pptSrc = &m_sourcePosition;
m_info.pptDst = &m_windowPosition;
m_info.psize = &m_size;
m_info.pblend = &m_blend;
m_info.dwFlags = ULW_ALPHA;
m_blend.SourceConstantAlpha = 255;
m_blend.AlphaFormat = AC_SRC_ALPHA;
}
void Update(
__in HWND window,
__in HDC source) {
m_info.hdcSrc = source;
auto nRet = UpdateLayeredWindowIndirect(window, &m_info);
}
UINT GetWidth() const { return m_size.cx; }
UINT GetHeight() const { return m_size.cy; }
};
通过m_pLayeredInfo->Update(m_hWnd, m_hMemDc);更新画面透明窗口m_hWnd,m_hMemDc是我通过Graphics操作的,
Graphics相关如下:
bool CMarkWindow::DrawLine(const CPoint& ptSecond)
{
if (nullptr != m_hMemDc)
{
if (m_pGraphics == NULL)
{
m_pGraphics.reset(Gdiplus::Graphics::FromHDC(m_hMemDc));
}
if (m_pPen == NULL || m_bBrushReset)
{
m_pPen.reset(new Gdiplus::Pen(Gdiplus::Color(m_color), m_LineWidth) );
m_bBrushReset = false;
}
m_pGraphics.get()->SetSmoothingMode(Gdiplus::SmoothingMode::SmoothingModeAntiAlias);
m_pGraphics.get()->DrawLine(m_pPen.get(), m_pt.x, m_pt.y, ptSecond.x, ptSecond.y);
m_pLayeredInfo->Update(m_hWnd, m_hMemDc);
m_pt = ptSecond;
}
return true;
}