PNG图片作为对话框的背景带来的问题 我有一张PNG图片,边缘是透明的,其他的地方不透明。将这幅图片作为对话框的背景时,其他地方显示正常,但是边缘变成了黑色,不知道有没有办法解决这个问题? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 贴代码?你是在什么函数中贴图的?OnPaint? OnEraseBkgnd ? lz是不是想让PNG透明不显示,我也在找,但是我试过了BMP可以,PNG试了效果和你一样,我用的是CRgn搞的。大家有解决方法发我一份啊[email protected] png图片是这样的,你用微软自带的那个画图工具打开,就是绘制到对话框上的效果。如果你要显示正常,用gdi+绘制。 BOOL CResManager::OnEraseBkgnd(CDC* pDC){ // TODO: Add your message handler code here and/or call default CRect rect; GetClientRect(&rect); //利用颜色过滤四角 //CBrush brush; //brush.CreateSolidBrush(RGB(255,0,0)); //pDC->FillRect(&rect, &brush); //brush.DeleteObject(); //this->SetLayeredWindowAttributes(RGB(255,0,0), 255, LWA_COLORKEY); //------ 绘制工具栏部分的背景图片 Graphics graphics(pDC->GetSafeHdc()); int x = rect.left; int y = rect.top; int width = 100; int height = 100; graphics.DrawImage(m_pImageTitleLeft, Rect(x, y, width, height)); return TRUE; //return CDialog::OnEraseBkgnd(pDC);}其中,m_pImageTitleLeft是Image*指针,利用这个指针加载的Png图片。 显示透明图片,用gdi+可以。我试过,代码如下(OnEraseBkgnd中),看看对你有用吗?//使用gdi+显示图像 Graphics graphics(pDC->m_hDC); Image image("文件路径",FALSE); graphics.DrawImage(&image,0,0); 显示透明图片,用gdi+可以。我试过,代码如下(OnEraseBkgnd中),看看对你有用吗?//使用gdi+显示图像 Graphics graphics(pDC->m_hDC); Image image("文件路径",FALSE); graphics.DrawImage(&image,0,0); 你的代码和我的代码是一样的,应该不是代码的问题,主要是图片的透明部分,而且是渐变透明的,移动的时候会留下残影。所以我用了this->SetLayeredWindowAttributes(RGB(0,0,0), 255, LWA_COLORKEY);函数,将整个窗口的属性改了,一改之后边框变黑了。我的同事说把对话框改成透明属性,但是好像还是不行 使用二次缓存和upsatelayeredwindow 就可以解决.先绘制到MemDC中,再帖到当前窗口DC上,this->SetLayeredWindowAttributes(RGB(0,0,0), 255, LWA_COLORKEY); 会将整个图片设为完全透明效果,图片以外的部分会受到影响...下面代码供参考.void CGDIPNGDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle 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; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); //MessageBox("aa"); HDC hdcTemp = GetDC()->m_hDC; m_hdcMemory = CreateCompatibleDC(hdcTemp); HBITMAP hBitMap = CreateCompatibleBitmap(hdcTemp, m_BakWidth, m_BakHeight); SelectObject(m_hdcMemory, hBitMap); // m_Blend.SourceConstantAlpha=100; // 窗口透明度最大为255,最小为0 HDC hdcScreen = ::GetDC(m_hWnd); RECT rct; GetWindowRect(&rct); POINT ptWinPos = {rct.left, rct.top}; Graphics graph(m_hdcMemory); Rect destinationRect(0, 0, 1 * m_BakWidth, 1* m_BakHeight); graph.DrawImage( m_pImageBack, Rect(0, 0, m_BakWidth, m_BakHeight), // destination rectangle //destinationRect, 0, 0, // upper-left corner of source rectangle m_BakWidth, // width of source rectangle m_BakHeight, // height of source rectangle UnitPixel); //修改风格 graph.DrawImage(m_pImageTop,Pos_Top_x,Pos_Top_y); if (m_bOver) { graph.DrawImage(m_pImageTopc,Pos_Top_x-8,Pos_Top_y-9); } else if(m_bChe){ graph.DrawImage(m_pImageTop,Pos_Top_x,Pos_Top_y); } SIZE sizeWindow={m_BakWidth,m_BakHeight}; POINT ptSrc={0,0}; DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE); if((dwExStyle&0x80000)!=0x80000) SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000); UpdateLayeredWindow(m_hWnd, hdcScreen, &ptWinPos, &sizeWindow, m_hdcMemory, &ptSrc, 0, &m_Blend, 2); graph.ReleaseHDC(m_hdcMemory); ::ReleaseDC(m_hWnd,hdcScreen); hdcScreen=NULL; ::ReleaseDC(m_hWnd,hdcTemp); hdcTemp=NULL; DeleteObject(hBitMap); DeleteDC(m_hdcMemory); m_hdcMemory=NULL; }}int CGDIPNGDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here hFuncInst = LoadLibrary("User32.DLL"); if(hFuncInst) UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow"); else { AfxMessageBox("User32.dll ERROR!"); exit(0); } //初始化gdiplus的环境 // Initialize GDI+. m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000 m_Blend.BlendFlags=0; //nothingelseisspecial... m_Blend.AlphaFormat=1; //... m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA // 透明度 using namespace Gdiplus; // 名称空间 ImageFromIDResource(IDR_PNG2, "PNG", m_pImageBack); // 读取资源中的PNG图片, 为自订义类形“PNG” ImageFromIDResource(IDR_PNG1, "PNG", m_pImageTop); ImageFromIDResource(IDR_PNG3, "PNG", m_pImageTopc); m_TopWidth=m_pImageTop->GetWidth(); m_TopHeight=m_pImageTop->GetHeight(); Pos_Top_x=408;Pos_Top_y=11; return 0;} 我有成功的exe 用的方法是 gdi+ 的 .drawimage()函数 closesocket CSplitterWnd创建的两个视图,如何只让其中一个视图有滚动条? 这几天在看《COM技术内幕》 我有个windows的计算器的问题 请求帮助,谢谢!我想用INSTALLSHIELD打包,可不知道怎么操作! 用MFC开发ActiveX控件,怎样为我的控件增加一个工具栏!!! 位图地显示 dll注册问题 如何在mfc上创建的Tab页上添加其他通用控件? ATL下和非ATL下的struct/class 成员变量对齐? 求教!!!为什么调试运行时没问题,正式执行时不正常? 为什么用Visual Studio 2008做DLL,做不了共享节呢?
你是在什么函数中贴图的?
OnPaint? OnEraseBkgnd ?
搞的。大家有解决方法发我一份啊[email protected]
如果你要显示正常,用gdi+绘制。
{
// TODO: Add your message handler code here and/or call default CRect rect;
GetClientRect(&rect); //利用颜色过滤四角
//CBrush brush;
//brush.CreateSolidBrush(RGB(255,0,0));
//pDC->FillRect(&rect, &brush);
//brush.DeleteObject();
//this->SetLayeredWindowAttributes(RGB(255,0,0), 255, LWA_COLORKEY); //------ 绘制工具栏部分的背景图片
Graphics graphics(pDC->GetSafeHdc());
int x = rect.left;
int y = rect.top;
int width = 100;
int height = 100; graphics.DrawImage(m_pImageTitleLeft, Rect(x, y, width, height)); return TRUE; //return CDialog::OnEraseBkgnd(pDC);
}其中,m_pImageTitleLeft是Image*指针,利用这个指针加载的Png图片。
//使用gdi+显示图像
Graphics graphics(pDC->m_hDC);
Image image("文件路径",FALSE);
graphics.DrawImage(&image,0,0);
//使用gdi+显示图像
Graphics graphics(pDC->m_hDC);
Image image("文件路径",FALSE);
graphics.DrawImage(&image,0,0);
你的代码和我的代码是一样的,应该不是代码的问题,主要是图片的透明部分,而且是渐变透明的,移动的时候会留下残影。所以我用了this->SetLayeredWindowAttributes(RGB(0,0,0), 255, LWA_COLORKEY);函数,将整个窗口的属性改了,一改之后边框变黑了。我的同事说把对话框改成透明属性,但是好像还是不行
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
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; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
//MessageBox("aa");
HDC hdcTemp = GetDC()->m_hDC;
m_hdcMemory = CreateCompatibleDC(hdcTemp);
HBITMAP hBitMap = CreateCompatibleBitmap(hdcTemp, m_BakWidth, m_BakHeight);
SelectObject(m_hdcMemory, hBitMap);
// m_Blend.SourceConstantAlpha=100; // 窗口透明度最大为255,最小为0
HDC hdcScreen = ::GetDC(m_hWnd);
RECT rct;
GetWindowRect(&rct);
POINT ptWinPos = {rct.left, rct.top};
Graphics graph(m_hdcMemory);
Rect destinationRect(0, 0, 1 * m_BakWidth, 1* m_BakHeight);
graph.DrawImage(
m_pImageBack,
Rect(0, 0, m_BakWidth, m_BakHeight), // destination rectangle
//destinationRect,
0, 0, // upper-left corner of source rectangle
m_BakWidth, // width of source rectangle
m_BakHeight, // height of source rectangle
UnitPixel); //修改风格
graph.DrawImage(m_pImageTop,Pos_Top_x,Pos_Top_y);
if (m_bOver)
{
graph.DrawImage(m_pImageTopc,Pos_Top_x-8,Pos_Top_y-9);
}
else if(m_bChe){
graph.DrawImage(m_pImageTop,Pos_Top_x,Pos_Top_y);
}
SIZE sizeWindow={m_BakWidth,m_BakHeight};
POINT ptSrc={0,0};
DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);
if((dwExStyle&0x80000)!=0x80000)
SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);
UpdateLayeredWindow(m_hWnd, hdcScreen, &ptWinPos, &sizeWindow, m_hdcMemory, &ptSrc, 0, &m_Blend, 2);
graph.ReleaseHDC(m_hdcMemory);
::ReleaseDC(m_hWnd,hdcScreen);
hdcScreen=NULL;
::ReleaseDC(m_hWnd,hdcTemp);
hdcTemp=NULL;
DeleteObject(hBitMap);
DeleteDC(m_hdcMemory);
m_hdcMemory=NULL;
}
}
int CGDIPNGDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
hFuncInst = LoadLibrary("User32.DLL");
if(hFuncInst)
UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow");
else
{
AfxMessageBox("User32.dll ERROR!");
exit(0);
}
//初始化gdiplus的环境
// Initialize GDI+.
m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000
m_Blend.BlendFlags=0; //nothingelseisspecial...
m_Blend.AlphaFormat=1; //...
m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA // 透明度
using namespace Gdiplus; // 名称空间
ImageFromIDResource(IDR_PNG2, "PNG", m_pImageBack); // 读取资源中的PNG图片, 为自订义类形“PNG”
ImageFromIDResource(IDR_PNG1, "PNG", m_pImageTop);
ImageFromIDResource(IDR_PNG3, "PNG", m_pImageTopc);
m_TopWidth=m_pImageTop->GetWidth();
m_TopHeight=m_pImageTop->GetHeight();
Pos_Top_x=408;Pos_Top_y=11;
return 0;
}