15,980
社区成员




void CCustomDlg::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
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect); //得到客户端的大小;
CBitmap bmpBackground;
HANDLE hBitMap;
hBitMap = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if (hBitMap == NULL)
{
MARGINS mar; //透明化
mar.cxLeftWidth = -1;
mar.cxRightWidth = -1;
mar.cyTopHeight = -1;
mar.cyBottomHeight = -1;
CRect rectClient;
GetClientRect(rectClient);
mar.cyTopHeight = rectClient.Height();
DwmExtendFrameIntoClientArea(CDialogEx::GetSafeHwnd(), &mar);
CRect rcGlassArea;
GetClientRect(&rcGlassArea);
dc.FillSolidRect(&rcGlassArea, RGB(0, 0, 0));
return;
}
bmpBackground.Attach(hBitMap);
BITMAP bitmap;
bmpBackground.GetObject(sizeof(bitmap), &bitmap); //得到位图信息
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);//创建内存DC;
CBitmap* pbmpOld = dcMem.SelectObject(&bmpBackground); //选择位图,将其装入内存设备上下文;
dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
dcMem.SelectObject(pbmpOld);//将原来的位图重新载入
dcMem.DeleteDC();
//CDialogEx::OnPaint();
}
}
MARGINS mar; //透明化
mar.cxLeftWidth = -1;
mar.cxRightWidth = -1;
mar.cyTopHeight = -1;
mar.cyBottomHeight = -1;
CRect rectClient;
GetClientRect(rectClient);
mar.cyTopHeight = rectClient.Height();
DwmExtendFrameIntoClientArea(CDialogEx::GetSafeHwnd(), &mar);
CRect rcGlassArea;
GetClientRect(&rcGlassArea);
dc.FillSolidRect(&rcGlassArea, RGB(0, 0, 0));
这段代码实现对话框透明化,在低配电脑上,透明色变成了黑色