c++ mfc 根据图片生成异形窗口代码
时间: 2023-06-25 10:06:19 浏览: 76
以下是一个简单的示例代码,可以根据图片生成具有异形边框的窗口:
```cpp
// MyWnd.h
class CMyWnd : public CWnd
{
public:
CMyWnd();
protected:
DECLARE_MESSAGE_MAP()
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
private:
CBitmap m_bitmap;
CRgn m_rgn;
};
// MyWnd.cpp
CMyWnd::CMyWnd()
{
// 加载位图
m_bitmap.LoadBitmap(IDB_BITMAP1);
BITMAP bmp;
m_bitmap.GetBitmap(&bmp);
// 创建区域
CRect rect(0, 0, bmp.bmWidth, bmp.bmHeight);
m_rgn.CreateEllipticRgnIndirect(&rect);
m_rgn.OffsetRgn(50, 50);
}
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
void CMyWnd::OnPaint()
{
CPaintDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&m_bitmap);
dc.BitBlt(0, 0, m_rgn.GetRgnBox().Width(), m_rgn.GetRgnBox().Height(), &memDC, 0, 0, SRCCOPY);
}
BOOL CMyWnd::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_rgn.PtInRegion(point))
{
// 点击了区域内部
MessageBox(_T("Clicked!"));
}
}
// 在窗口类中添加以下代码
void CMyWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
{
// 创建窗口
CWnd::CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle, rect, hWndParent, nIDorHMenu, lpParam);
// 设置窗口的形状
HRGN hRgn = m_rgn.Detach();
SetWindowRgn(hRgn, TRUE);
}
```
在窗口类的 `CreateEx` 函数中,我们可以调用 `SetWindowRgn` 函数将窗口的形状设置为我们创建的区域,从而实现异形窗口的效果。在以上代码示例中,我们使用了一个椭圆形的区域作为窗口的形状。你可以根据自己的需求,使用不同的区域来实现不同的窗口形状。