MFC 窗口贴一个圆形图标有黑边,求高手帮忙看一下
大家受累帮忙看一下,主要是想做一个不规则的图形窗口,主窗口贴图后,把黑色区域给设置为透明了,然后把圆形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); } }