把一张图片作为mfc的背景图片,图片放在OnEraseBkgnd函数里还是放在OnPaint函数里
时间: 2023-12-17 21:02:43 浏览: 49
一般来说,将背景图片放在`OnEraseBkgnd`函数中比较好,因为该函数是在窗口被擦除时调用的。如果将背景图片放在`OnPaint`函数中,每当窗口被重新绘制时都会重新绘制背景图像,这样会导致性能下降。因此,将背景图片放在`OnEraseBkgnd`函数中可以避免这个问题。另外,建议使用双缓冲技术,以避免闪烁和图像重叠的问题。
相关问题
在mfc中有时mfcButton按钮被背景图片遮挡,该如何解决,代码示例
如果在 MFC 中,MFCButton 按钮被背景图片遮挡,可以尝试以下解决方法:
1. 将按钮的风格设置为“透明”。
```c++
m_MFCButton.ModifyStyle(0, BS_TRANSPARENT, 0);
```
2. 在按钮的 OnEraseBkgnd 函数中,将背景绘制为透明。
```c++
BOOL CMFCButtonEx::OnEraseBkgnd(CDC* pDC)
{
// 绘制透明背景
CRect rect;
GetClientRect(&rect);
pDC->FillSolidRect(rect, RGB(255, 255, 255));
return TRUE;
}
```
3. 在按钮的 OnPaint 函数中,先绘制背景图,再绘制按钮的文本和图标。
```c++
void CMFCButtonEx::OnPaint()
{
CPaintDC dc(this);
// 绘制背景图
CRect rect;
GetClientRect(&rect);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP_BACKGROUND);
CBitmap* pOldBmp = memDC.SelectObject(&bmp);
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBmp);
// 绘制按钮的文本和图标
...
}
```
以上是一些常用的解决方法,具体实现可以根据实际情况进行调整。
c++ mfc 根据图片生成异形窗口代码
以下是一个简单的示例代码,可以根据图片生成具有异形边框的窗口:
```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` 函数将窗口的形状设置为我们创建的区域,从而实现异形窗口的效果。在以上代码示例中,我们使用了一个椭圆形的区域作为窗口的形状。你可以根据自己的需求,使用不同的区域来实现不同的窗口形状。
相关推荐
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)