利用MFC在界面上画一个透明圆
时间: 2024-02-24 15:54:02 浏览: 84
MFC对话框里利用CHtmlView加载界面(四)————分层窗口设置 - CSDN博客1
要在 MFC 界面上画一个透明圆,可以按照以下步骤进行:
1. 创建一个 MFC 对话框程序,打开资源视图,添加一个 Picture Control 控件,设置其 ID 为 IDC_CANVAS。
2. 在对话框类的头文件中添加以下代码:
```
CBitmap m_bmpCanvas; // 画布位图
CRect m_rectCanvas; // 画布矩形
CDC* m_pDCMem; // 内存设备上下文
CBrush m_brushTransparent; // 透明画刷
```
3. 在 OnInitDialog 函数中添加以下代码:
```
// 获取画布控件指针
CWnd* pWndCanvas = GetDlgItem(IDC_CANVAS);
// 获取画布矩形
pWndCanvas->GetClientRect(m_rectCanvas);
// 创建画布位图
m_bmpCanvas.CreateCompatibleBitmap(this->GetDC(), m_rectCanvas.Width(), m_rectCanvas.Height());
// 创建内存设备上下文
m_pDCMem = new CDC();
m_pDCMem->CreateCompatibleDC(this->GetDC());
m_pDCMem->SelectObject(&m_bmpCanvas);
// 创建透明画刷
m_brushTransparent.CreateStockObject(NULL_BRUSH);
// 绘制透明背景
m_pDCMem->FillRect(m_rectCanvas, &m_brushTransparent);
```
4. 在 OnPaint 函数中添加以下代码:
```
CPen penBlack(PS_SOLID, 1, RGB(0, 0, 0)); // 创建黑色实线画笔
m_pDCMem->SelectObject(&penBlack); // 选择画笔
m_pDCMem->SelectObject(&m_brushTransparent); // 选择透明画刷
m_pDCMem->Ellipse(m_rectCanvas); // 绘制透明圆
```
5. 在 OnEraseBkgnd 函数中添加以下代码:
```
return TRUE; // 返回 TRUE 表示背景已被擦除
```
这样,就可以在 MFC 界面上画一个透明圆了。需要注意的是,在绘制完透明圆后,需要调用 Invalidate 函数来触发界面的重绘。完整代码如下:
```
// MyDlg.h
#pragma once
#include "afxwin.h"
class CMyDlg : public CDialogEx
{
public:
CMyDlg(CWnd* pParent = nullptr);
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MY_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX);
DECLARE_MESSAGE_MAP()
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
virtual BOOL OnInitDialog();
private:
CBitmap m_bmpCanvas; // 画布位图
CRect m_rectCanvas; // 画布矩形
CDC* m_pDCMem; // 内存设备上下文
CBrush m_brushTransparent; // 透明画刷
};
// MyDlg.cpp
#include "MyDlg.h"
#include "afxdialogex.h"
CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MY_DIALOG, pParent)
{
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
BOOL CMyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 获取画布控件指针
CWnd* pWndCanvas = GetDlgItem(IDC_CANVAS);
// 获取画布矩形
pWndCanvas->GetClientRect(m_rectCanvas);
// 创建画布位图
m_bmpCanvas.CreateCompatibleBitmap(this->GetDC(), m_rectCanvas.Width(), m_rectCanvas.Height());
// 创建内存设备上下文
m_pDCMem = new CDC();
m_pDCMem->CreateCompatibleDC(this->GetDC());
m_pDCMem->SelectObject(&m_bmpCanvas);
// 创建透明画刷
m_brushTransparent.CreateStockObject(NULL_BRUSH);
// 绘制透明背景
m_pDCMem->FillRect(m_rectCanvas, &m_brushTransparent);
return TRUE;
}
void CMyDlg::OnPaint()
{
CPaintDC dc(this);
// 绘制画布位图
dc.BitBlt(m_rectCanvas.left, m_rectCanvas.top, m_rectCanvas.Width(), m_rectCanvas.Height(),
m_pDCMem, 0, 0, SRCCOPY);
}
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
```
阅读全文