本人以前一直做接口这块对MFC 还是不太熟悉,如今有需求需要用到MFC 做一个项目所以开始学习MFC ,就差这个圆png的处理了 ,大家受累帮忙看一下,主要是想做一个不规则的图形窗口,主窗口贴图后,把黑色区域给设置为透明了,然后把圆形PNG图贴到窗口上,但是要露到外面 请参考图片样式, 但是圆有黑边在 请参考代码
BOOL CMFC111Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) ^ 0x80000);
HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));
if (hInst != NULL)
{
typedef BOOL(WINAPI *MYFUNC)(HWND, COLORREF, BYTE, DWORD);
MYFUNC pFunc = (MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if (pFunc != NULL)
{
pFunc(m_hWnd, RGB(0, 0, 0), 255, LWA_COLORKEY);
}
FreeLibrary(hInst);
hInst = NULL;
}
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标
CRect temprect(0, 0, 420, 476);
SetWindowPos(NULL, 0, 0, temprect.Width(), temprect.Height(), SWP_NOZORDER | SWP_NOMOVE);
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CMFC111Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//CBitmap FootballBMP;
//FootballBMP.LoadBitmap(IDB_BITMAP1);
//CDC ImageDC;
//CDC*pDC = GetDC();
//ImageDC.CreateCompatibleDC(pDC);
///CBitmap *pOldImageBMP =ImageDC.SelectObject(&FootballBMP);
//TransparentBlt(pDC->m_hDC, 0, 0, 420, 476, ImageDC.m_hDC, 0, 0, 420, 476, RGB(0, 0, 0));
//ImageDC.SelectObject(pOldImageBMP);
CPaintDC dc(this);
CBitmap m_bitmap;
m_bitmap.LoadBitmap(IDB_BITMAP1);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
memdc.SelectObject(&m_bitmap);
int width, height;
BITMAP bmp;
m_bitmap.GetBitmap(&bmp);
width = bmp.bmWidth;
height = bmp.bmHeight;
CRect rect;
this->GetClientRect(&rect);
dc.StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&memdc, 0, 0, width, height, SRCCOPY);
CDialog::OnPaint();
Graphics graphics(dc);
Image image(L"icon.png");
//graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.DrawImage(&image, 20, 10);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
}
}
BOOL CMFC111Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) ^ 0x80000);
HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));
if (hInst != NULL)
{
typedef BOOL(WINAPI *MYFUNC)(HWND, COLORREF, BYTE, DWORD);
MYFUNC pFunc = (MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if (pFunc != NULL)
{
pFunc(m_hWnd, RGB(0, 0, 0), 255, LWA_COLORKEY);
}
FreeLibrary(hInst);
hInst = NULL;
}
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标
CRect temprect(0, 0, 420, 476);
SetWindowPos(NULL, 0, 0, temprect.Width(), temprect.Height(), SWP_NOZORDER | SWP_NOMOVE);
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CMFC111Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//CBitmap FootballBMP;
//FootballBMP.LoadBitmap(IDB_BITMAP1);
//CDC ImageDC;
//CDC*pDC = GetDC();
//ImageDC.CreateCompatibleDC(pDC);
///CBitmap *pOldImageBMP =ImageDC.SelectObject(&FootballBMP);
//TransparentBlt(pDC->m_hDC, 0, 0, 420, 476, ImageDC.m_hDC, 0, 0, 420, 476, RGB(0, 0, 0));
//ImageDC.SelectObject(pOldImageBMP);
CPaintDC dc(this);
CBitmap m_bitmap;
m_bitmap.LoadBitmap(IDB_BITMAP1);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
memdc.SelectObject(&m_bitmap);
int width, height;
BITMAP bmp;
m_bitmap.GetBitmap(&bmp);
width = bmp.bmWidth;
height = bmp.bmHeight;
CRect rect;
this->GetClientRect(&rect);
dc.StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&memdc, 0, 0, width, height, SRCCOPY);
CDialog::OnPaint();
Graphics graphics(dc);
Image image(L"icon.png");
//graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.DrawImage(&image, 20, 10);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
}
}