利用 PNG 文件创建异形对话框文档格式.docx
- 文档编号:428998
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:9
- 大小:145.10KB
利用 PNG 文件创建异形对话框文档格式.docx
《利用 PNG 文件创建异形对话框文档格式.docx》由会员分享,可在线阅读,更多相关《利用 PNG 文件创建异形对话框文档格式.docx(9页珍藏版)》请在冰点文库上搜索。
接下来我们还要为需要显示的对话框创建一个资源,您可以在资源管理器中插入一个Dialog,并将对话框上的所有控件删除,因为我们这里不需要它。
随后我们在对话框上单击鼠标右键,在弹出的菜单上选择添加类。
这里我们给新添加的类起一个名字,内容随意,只要日后记得就好了,基类一定选择CDialog,单击完成。
下面我们就来修改本类,以实现我们需要的功能。
首先在类的头文件中声明如下内容:
CBitmapm_bmpDialog;
CDCdcMemory;
CDC*m_screenDC;
voidUpdateView(CStringpngFileName,intwidth,intheight);
voidDoUpdateDummyDialog(CStringpngFileName,CWnd&
wnd,CBitmap&
bmp,BYTESourceConstantAlpha);
HBITMAPConverBmp(HBITMAPhBitmap);
其中包含3个变量,3个方法,方法的具体实现如下:
voidCPNGDlg:
:
UpdateView(CStringpngFileName,intwidth,intheight)
{
HBITMAPhBitmap;
hBitmap=CreateCompatibleBitmap(this->
GetDC()->
m_hDC,width,height);
hBitmap=ConverBmp(hBitmap);
m_bmpDialog.DeleteObject();
m_bmpDialog.Attach(hBitmap);
DoUpdateDummyDialog(pngFileName,*this,m_bmpDialog,255);
}
DoUpdateDummyDialog(CStringpngFileName,CWnd&
bmp,BYTESourceConstantAlpha)
CBitmap*pOldBitmap=dcMemory.SelectObject(&
bmp);
BITMAPbmpInfo;
bmp.GetBitmap(&
bmpInfo);
CRectrectDlg;
wnd.GetWindowRect(rectDlg);
CPointptWindowScreenPosition(rectDlg.TopLeft());
CSizeszWindow(bmpInfo.bmWidth,bmpInfo.bmHeight);
BLENDFUNCTIONblendPixelFunction={AC_SRC_OVER,0,SourceConstantAlpha,0x01};
CPointptSrc(0,0);
Graphicsgraphics(dcMemory.m_hDC);
//////////////////////////////////////////////////////////////////////////
Bitmap*m_bit=newBitmap(pngFileName.AllocSysString());
graphics.DrawImage(m_bit,0,0);
deletem_bit;
graphics.ReleaseHDC(dcMemory.m_hDC);
HINSTANCEhInst=:
LoadLibrary("
user32.dll"
);
if(hInst)
{
typedefBOOL(WINAPI*MYFUNC)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD);
MYFUNCfun=NULL;
fun=(MYFUNC)GetProcAddress(hInst,"
UpdateLayeredWindow"
if(fun)
fun(wnd,m_screenDC->
m_hDC,&
ptWindowScreenPosition,&
szWindow,dcMemory,&
ptSrc,0,&
blendPixelFunction,0x02);
FreeLibrary(hInst);
}
dcMemory.SelectObject(pOldBitmap);
HBITMAPCPNGDlg:
ConverBmp(HBITMAPhBitmap)
HDChDC;
WORDwBitCount=32;
DWORDdwPaletteSize=0,dwBmBitsSize=0,dwDIBSize=0,dwWritten=0;
BITMAPBitmap;
BITMAPINFOHEADERbi;
LPBITMAPINFOHEADERlpbi;
HANDLEhPal,hOldPal=NULL;
HBITMAPhDib;
GetObject(hBitmap,sizeof(Bitmap),(LPSTR)&
Bitmap);
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=Bitmap.bmWidth;
bi.biHeight=Bitmap.bmHeight;
bi.biPlanes=1;
bi.biBitCount=wBitCount;
bi.biCompression=BI_RGB;
bi.biSizeImage=0;
bi.biXPelsPerMeter=0;
bi.biYPelsPerMeter=0;
bi.biClrImportant=0;
bi.biClrUsed=0;
dwBmBitsSize=((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;
hPal=GetStockObject(DEFAULT_PALETTE);
if(hPal)
{
hDC=:
GetDC(NULL);
hOldPal=:
SelectPalette(hDC,(HPALETTE)hPal,FALSE);
RealizePalette(hDC);
hDib=CreateDIBSection(hDC,(BITMAPINFO*)&
bi,DIB_RGB_COLORS,(LPVOID*)&
lpbi,NULL,0);
GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+dwPaletteSize,(LPBITMAPINFO)&
bi,DIB_RGB_COLORS);
if(hOldPal)
:
SelectPalette(hDC,(HPALETTE)hOldPal,TRUE);
ReleaseDC(NULL,hDC);
CloseHandle(hPal);
CloseHandle(hOldPal);
DeleteObject(hBitmap);
returnhDib;
最后我们在对话框的OnInitDialog()方法中添加初始化代码:
m_screenDC=newCDC();
m_screenDC->
Attach(:
GetDC(NULL));
dcMemory.CreateCompatibleDC(m_screenDC);
ModifyStyleEx(0,0x80000);
CStringm_AppPath;
charszPathName[MAX_PATH];
GetModuleFileName(NULL,szPathName,sizeof(szPathName));
m_AppPath=CString(szPathName).Left(CString(szPathName).ReverseFind('
\\'
)+1);
UpdateView(m_AppPath+"
test.png"
400,300);
通过代码(橙色部分)可以看出我们指示程序载入了test.png文件作为对话框外观文件,后面跟的是图片的宽度和高度。
最后是一个小技巧,我们可以映射对话框的WM_NCHITTEST消息,并返回值HTCAPTION,这样我们就可以通过鼠标拖动对话框了,具体代码如下:
UINTCPNGDlg:
OnNcHitTest(CPointpoint)
//TODO:
在此添加消息处理程序代码和/或调用默认值
returnHTCAPTION;
//returnCDialog:
OnNcHitTest(point);
最后我们在程序原有的对话框上创建一个按钮,加入代码:
CPNGDlg*m_pngDlg=newCPNGDlg();
m_pngDlg->
DoModal();
目的就是单击按钮后显示我们新建的对话框。
OK,就这样我们的程序就写完了,编译运行可以看到如下图所示的效果,此时您可以用鼠标拖动对话框,查看透明窗体的效果,是不是很炫~~
最后有几点需要大家注意的:
1.本文中并没有详细讲解程序运行的原理,如果有希望知道的朋友可以给我留言,我会具体讲解的,需要源代码也可以联系我。
2.由于本程序需要调用user32.dll中的UpdateLayeredWindow函数,此函数只包含于windows2000及以后版本的user32.dll文件中,因此我们开发的程序已有当运行于windows2000或以后版本(包括xp/2003/vista)的系统下才可以正常显示,这点需要大家注意。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 PNG 文件创建异形对话框 文件 创建 异形 对话框