MFC PNG作背景 透明邊框GDI+
1-把PNG圖片當作點陣圖的形式載入,在資源裡面會多出一個PNG的資料夾例如載入一張了。
[code=c]
2-stdafx.h里加上兩句:
#include <gdiplus.h> //新加的
using namespace Gdiplus;
3-然後在該視窗的.h檔案裡面加上以下程式碼
.h 檔案裡的 protected:
HICON m_hIcon; /
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都不行,最後找了份程式碼實現的。純屬加程式碼上去的。
動態的實現應該加上定時器就不難吧,遲點在實現。
部分問題:
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
相關推薦
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