1. 程式人生 > >MFC PNG作背景 透明邊框GDI+

MFC PNG作背景 透明邊框GDI+

記錄下啦。剛剛實現,怕忘了。從上往下,建立對話方塊工程就行。

1-把PNG圖片當作點陣圖的形式載入,在資源裡面會多出一個PNG的資料夾例如載入一張了。

[code=c]
2-stdafx.h里加上兩句:
#include <gdiplus.h> //新加的
using namespace Gdiplus;

3-然後在該視窗的.h檔案裡面加上以下程式碼

.h 檔案裡的 protected:
HICON m_hIcon;  /

private:
BLENDFUNCTION m_Blend;
HDC m_hdcMemory;
Image *image;
int m_BakWidth , m_BakHeight ;
HINSTANCE hFuncInst ;
typedef BOOL (WINAPI *MYFUNC)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD);
MYFUNC UpdateLayeredWindow;

ULONG_PTR m_gdiplusToken;
BOOL UpdateClockDisplay(int Transparent=255);//其實重要的是這個跟下面一個函式
BOOL ImageFromIDResource(UINT nID,LPCTSTR sTR,Image * &pImg);

4-public:裡面應該有以下的幾個訊息響應,注意不是直接新增,要在類嚮導-->訊息中新增。
afx_msg void OnPaint();
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg HCURSOR OnQueryDragIcon();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

5-然後就去實現這些訊息,還有private裡的兩個重要函式,這兩個我也不懂,加上去,不要露了5-public裡的各個訊息處理
函式就可以使用了。以下是在.cpp裡面的實現:


主要是在以下函式裡面執行:UpdateClockDisplay(); ImageFromIDResource()兩個函式
BOOL titelDlg::OnInitDialog()//所有的視窗屬性都可以在這個初始化時候設定,例如標題欄是否顯示
{
CDialogEx::OnInitDialog();

// 執行此操作
SetIcon(m_hIcon, TRUE); // 設定大圖示
SetIcon(m_hIcon, FALSE); // 設定小圖示

// TODO: 在此新增額外的初始化程式碼

Gdiplus::GdiplusStartupInput gdiplusStartupInput;//啟動時初始化gdi+
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

ImageFromIDResource(IDB_PNG1,L"PNG",image);//這裡是已經載入到了資源的PNG圖片
//image = Image::FromFile(L"D:/test.png"); //圖片和路徑自己換,同上?

m_BakWidth =image->GetWidth();
m_BakHeight =image->GetHeight();

UpdateClockDisplay();

return TRUE;
}

5-以上說的兩個函式的實現如下我也看不懂:
BOOL titelDlg::ImageFromIDResource(UINT nID, LPCTSTR sTR,Image * &pImg)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type
if (!hRsrc)
return FALSE;

// load resource into memory
DWORD len = SizeofResource(hInst, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (!lpRsrc)
return FALSE;

// Allocate global memory on which to create stream
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem,lpRsrc,len);
IStream* pstm;
CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);

// load from stream
pImg=Gdiplus::Image::FromStream(pstm,1);

// free/release stuff
GlobalUnlock(m_hMem);
pstm->Release();
FreeResource(lpRsrc);

return true;
}

BOOL titelDlg::UpdateClockDisplay(int Transparent)
{
HDC hdcTemp=GetDC()->m_hDC;
m_hdcMemory=CreateCompatibleDC(hdcTemp);
HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,m_BakWidth,m_BakHeight);
SelectObject(m_hdcMemory,hBitMap);
if(Transparent<0||Transparent>100) Transparent=100;

m_Blend.SourceConstantAlpha=int(Transparent*2.55);//1~255
HDC hdcScreen=::GetDC (m_hWnd);
RECT rct;
GetWindowRect(&rct);
POINT ptWinPos={rct.left,rct.top};
Graphics graph(m_hdcMemory);

Point points[] = { Point(0, 0), Point(m_BakWidth, 0), Point(0, m_BakHeight)};

graph.DrawImage(image, points, 3);

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);

BOOL bRet=FALSE;
bRet= 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;

return bRet;
}

6-還有以下幾個訊息函式,新增訊息後,把程式碼過載進去,否則上面函式不能使用

void titelDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
titelDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}


HCURSOR titelDlg::OnQueryDragIcon()
{
// TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值

return static_cast<HCURSOR>(m_hIcon);
}


int titelDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: 在此新增您專用的建立程式碼
hFuncInst = LoadLibrary(L"user32.dll");
BOOL bRet=FALSE;
if(hFuncInst)
UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow");
else
{
MessageBox(L"User32.dll ERROR!");
exit(0);
}
//初始化gdiplus的環境
m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000
m_Blend.BlendFlags=0; //nothingelseisspecial...
m_Blend.AlphaFormat=1; //...
m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA
return 0;
}

這個叫做GDI+畫圖是吧?我弄了一天CIMAGE都不行,最後找了份程式碼實現的。純屬加程式碼上去的。
動態的實現應該加上定時器就不難吧,遲點在實現。

部分問題:

void Dialog_Warn_Dlg::OnSysCommand(UINT nID, LPARAM lParam) 訊號響應裡把 titelDlg 改為自己的類
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
titelDlg dlgAbout;
dlgAbout.DoModal();
}

void Dialog_Warn_Dlg::OnSysCommand(UINT nID, LPARAM lParam)訊號響應中 IDM_ABOUTBOX

去 Resource.h把

#define IDM_ABOUTBOX                    0x0010
#define IDS_ABOUTBOX                    101

http://blog.csdn.net/weiwangchao_/article/details/6795360

[/code]

相關推薦

MFC PNG背景 透明邊框GDI+

記錄下啦。剛剛實現,怕忘了。從上往下,建立對話方塊工程就行。 1-把PNG圖片當作點陣圖的形式載入,在資源裡面會多出一個PNG的資料夾例如載入一張了。 [code=c] 2-stdafx.h里加上兩句: #include <gdiplus.h> //新加的 u

MFC控制元件背景透明設定

這種方法只適用於下面這些控制元件 CTLCOLOR_BTN   Button control CTLCOLOR_DLG   Dialog box CTLCOLOR_EDIT   Edit control CTLCOLOR_LISTBOX   List-box cont

mfc 編輯框背景透明設定

前幾天和風在這裡討論關於CEdit控制元件的透明問題。主要的目的就是要做一個有圖形背景的Edit控制元件,經過一番努,終於做出了一個還算象樣的Edit控制元件。 做一個透明的Edit控制元件的主要問題是字元的輸出,在Edit裡輸出的重新整理有幾個時機,一個是在接收到鍵盤或

IE6 中png背景透明的最好方法

int script fix ret 代碼 BE scrip 方式 print 應用方式:(網站尾部加上如下代碼) <!--[if IE 6]> <script src="js/DDPngMin.js"></script> <

iframe設定無邊框背景透明

一般我們設定iframe無邊框背景透明程式碼如下: <iframe style="border:0;background:none;"></iframe> 現代瀏覽器如chome,firefox用上述程式碼即可實現,當

ie7、8設定iframe無邊框背景透明

一般我們設定iframe無邊框背景透明程式碼如下: <iframe style="border:0;background:none;"></iframe> 現代瀏覽器如chome,firefox用上述程式碼即可實現,當

Qt中設定QML窗體無邊框背景透明

主要程式碼在(main()函式中)如下: //設定窗體無邊框 view.setWindowFlags(Qt::FramelessWindowHint); //設定整個窗體背景為透明 view.setAttribute(Qt::WA_TranslucentBac

php 影象處理 摳圖,生成背景透明png 圖片

*自定義一個圖片等比縮放函式 *@param string $picname 被縮放圖片名 *@param string $path 被縮放圖片路徑 *@param int $maxWidth 圖片被縮放後的最大寬度 *@param int $maxHeight 圖片被縮放後的最大高度 *@par

用Qt實現窗體的無邊框、可移動、透明不規則顯示(需背景透明的圖片)

用Qt可以做出很炫的介面,更多的功能還有待學習^_^! 1、建構函式中需要做的設定: [cpp] view plaincopyprint? this->setWindowOpacity(1);//設定窗體不透明 this->setWind

MFC設定對話方塊背景邊框顏色

 對於對話方塊,只需要過載預設的訊息處理函式就行了: // 過載預設的訊息處理函式,主要處理WM_MOVE WM_PAINT WM_NCPAINT WM_NCACTIVATE WM_NOTIFY這// 幾個訊息就可以了 LRESULT CMyDialog::DefWi

MFC基於對話方塊如何新增點陣圖並使點陣圖背景透明(TransparentBlt函式)

MFC中比較重要的一部分學習內容即是繪圖,而繪圖時我們會發現如果想插入一張圖片而又不想要圖片的背景,或者已經把圖片的背景用Ps去掉了,但是在MFC視窗中顯示圖片的時候又有了白色的背景,這個時候就可以使用TransparentBlt函式(通常支援點陣圖)來實現將圖

一張圖助你分分鐘掌握用photoshop將圖片轉化為背景透明png技能-ps2017

需求:將背景為白色的jpg轉化為背景透明的png;方法2:適用於背景色與實物色不一樣解鎖->複製圖層->選擇->色彩範圍->使用取色器選擇需要保留的顏色->確定->c

MFC 如何設定子對話方塊背景透明而控制元件不透明

想子對話方塊透明,主要是截獲WM_ERASEBKGND訊息不去清空背景或者設定視窗default brush為NULL_BRUSH,另外重要的一點是window style中不能包含WS_CLIPSIBLINGS標記,同時parent window的style不能包含WS_C

vb.net簡單實現透明窗體顯示出背景透明png

好吧,的確標題怪怪的誒。。。因為我不知道該如何形容哩 進入正題: 因為想做一個類似虛擬人格的桌面精靈,要使得窗體背景是完全透明的,執行後只顯示png的圖形。效果稍微有點像不規則窗體。 在網上看了很多大神的程式碼,覺得好複雜~要麼做不規則窗體,要麼引用什麼什麼函式之類的。。。

MFC學習之 背景貼圖及控制元件透明

在CDialog類中進行貼圖,一般放在OnPaint()函式中,因為視窗更新時,使用它來進行重繪。在OnPain()中貼圖的原始碼如下: void C***Dialog::OnPaint() { CPaintDC dc(this); // device contex

Java調整圖片大小合併PNG圖片生成ICON(保持背景透明)

1.重新調整圖片到合適尺寸(有壓縮圖片功能) /** * * 功能描述: <br> * 〈調整影象到固定大小〉 * * @param srcImageFile 源影象檔案地址

【轉】關於Java生成背景透明png圖片

int width =400;int height =300;// 建立BufferedImage物件BufferedImage image =new BufferedImage(width, height,     BufferedImage.TYPE_INT_RGB);// 獲取Graphics2DG

如何設定MFC靜態文字背景透明色?

增加WM_CTRLCOLOR訊息處理函式,並增加如下程式碼:  HBRUSH CWebCautionDlg::OnCtlColor(CDC* pDC,CWnd* pWnd,  UINT nCtlColor){ HBRUSH hbr = CDialogEx::OnCtlColo

vs2010 MFC設定控制元件背景透明

通常要設定控制元件背景色透明,原因是在對話方塊背景中使用了圖片。對於這種情況,在vs2010中應當呼叫SetBackgroundImage函式來實現背景圖片的顯示。 BOOL CMFCDlg::OnInitDialog() { CDialogEx:

Android 代碼設置Activity 背景透明

tran his win this etc back spa popu content 當指定Activity 樣式 Them.Dialog 時候 又不同意用XML 設置 Activity 的背景顏色的時候 用代碼 this.getWindow().getDecorVi