纯win32实现PNG图片透明窗体

 

  1. #include <windows.h> 
  2. #include <gdiplus.h> 
  3.  
  4. /*  GDI+ startup token */ 
  5. ULONG_PTR gdiplusStartupToken; 
  6.  
  7. /*  Declare Windows procedure  */ 
  8. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); 
  9.  
  10. // UpdateLayeredWindow Defination 
  11. typedef BOOL(*UPDATELAYEREDWINDOWFUNCTION)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD); 
  12.  
  13. /*  Make the class name into a global variable  */ 
  14. char szClassName[ ] = "PNGDialog"; 
  15.  
  16. int WINAPI WinMain (HINSTANCE hThisInstance, 
  17.                      HINSTANCE hPrevInstance, 
  18.                      LPSTR lpszArgument, 
  19.                      int nCmdShow) 
  20.  
  21.     /**/ 
  22.     Gdiplus::GdiplusStartupInput gdiInput; 
  23.     Gdiplus::GdiplusStartup(&gdiplusStartupToken,&gdiInput,NULL); 
  24.     /**/ 
  25.     HWND hwnd;               /* This is the handle for our window */ 
  26.     MSG messages;            /* Here messages to the application are saved */ 
  27.     WNDCLASSEX wincl;        /* Data structure for the windowclass */ 
  28.  
  29.     /* The Window structure */ 
  30.     wincl.hInstance = hThisInstance; 
  31.     wincl.lpszClassName = szClassName;//+-69+ 
  32.     wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */ 
  33.     wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */ 
  34.     wincl.cbSize = sizeof (WNDCLASSEX); 
  35.  
  36.     /* Use default icon and mouse-pointer */ 
  37.     wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); 
  38.     wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); 
  39.     wincl.hCursor = LoadCursor (NULL, IDC_ARROW); 
  40.     wincl.lpszMenuName = NULL;                 /* No menu */ 
  41.     wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */ 
  42.     wincl.cbWndExtra = 0;                      /* structure or the window instance */ 
  43.     /* Use Windows's default colour as the background of the window */ 
  44.     wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; 
  45.  
  46.     /* Register the window class, and if it fails quit the program */ 
  47.     if (!RegisterClassEx (&wincl)) 
  48.         return 0; 
  49.  
  50.     /* The class is registered, let's create the program*/ 
  51.     hwnd = CreateWindowEx ( 
  52.            WS_EX_LAYERED|WS_EX_TOPMOST|WS_EX_TOOLWINDOW,                   /* Extended possibilites for variation */ 
  53.            szClassName,         /* Classname */ 
  54.            "PNGDialog Example Application",       /* Title Text */ 
  55.            WS_OVERLAPPEDWINDOW, /* default window */ 
  56.            CW_USEDEFAULT,       /* Windows decides the position */ 
  57.            CW_USEDEFAULT,       /* where the window ends up on the screen */ 
  58.            500,                 /* The programs width */ 
  59.            500,                 /* and height in pixels */ 
  60.            HWND_DESKTOP,        /* The window is a child-window to desktop */ 
  61.            NULL,                /* No menu */ 
  62.            hThisInstance,       /* Program Instance handler */ 
  63.            NULL                 /* No Window Creation data */ 
  64.            ); 
  65.  
  66.     /* Make the window visible on the screen */ 
  67.     ShowWindow (hwnd, nCmdShow); 
  68.     LONG style = ::GetWindowLong(hwnd,GWL_STYLE); 
  69.     if(style&WS_CAPTION) 
  70.         style^=WS_CAPTION; 
  71.     if(style&WS_THICKFRAME) 
  72.         style^=WS_THICKFRAME; 
  73.     if(style&WS_SYSMENU) 
  74.         style^=WS_SYSMENU; 
  75.     ::SetWindowLong(hwnd,GWL_STYLE,style); 
  76.  
  77.     style = ::GetWindowLong(hwnd,GWL_EXSTYLE); 
  78.     if(style&WS_EX_APPWINDOW) 
  79.         style^=WS_EX_APPWINDOW; 
  80.     ::SetWindowLong(hwnd,GWL_EXSTYLE,style); 
  81.  
  82.     /******************************************** 
  83.     *   step 1. 
  84.     *   Using Gdiplus to load the image 
  85.     ********************************************/ 
  86.     RECT wndRect; 
  87.     ::GetWindowRect(hwnd,&wndRect); 
  88.     SIZE wndSize = {wndRect.right-wndRect.left,wndRect.bottom-wndRect.top}; 
  89.     HDC hdc = ::GetDC(hwnd); 
  90.     HDC memDC = ::CreateCompatibleDC(hdc); 
  91.     HBITMAP memBitmap = ::CreateCompatibleBitmap(hdc,wndSize.cx,wndSize.cy); 
  92.     ::SelectObject(memDC,memBitmap); 
  93.  
  94.     Gdiplus::Image image(L"pic.png"); 
  95.     Gdiplus::Graphics graphics(memDC); 
  96.     graphics.DrawImage(&image,0,0,wndSize.cx,wndSize.cy); 
  97.     /******************************************** 
  98.     *   step 2. 
  99.     *   Get "UpdateLayeredWindow" function's 
  100.     *   proc address. 
  101.     ********************************************/ 
  102.     HMODULE hUser32 = ::LoadLibrary("User32.dll"); 
  103.     if(!hUser32) 
  104.     { 
  105.         return FALSE; 
  106.     } 
  107.     UPDATELAYEREDWINDOWFUNCTION UpdateLayeredWindow = (UPDATELAYEREDWINDOWFUNCTION)::GetProcAddress(hUser32,"UpdateLayeredWindow"); 
  108.     if(!UpdateLayeredWindow) 
  109.     { 
  110.         return FALSE; 
  111.     } 
  112.     // get screen dc 
  113.     HDC screenDC = GetDC(NULL); 
  114.     POINT ptSrc = {0,0}; 
  115.  
  116.     /********************************************* 
  117.     *   step 3. 
  118.     *   Use UpdateLayeredWindow to Draw the Window 
  119.     * 
  120.     *********************************************/ 
  121.     BLENDFUNCTION blendFunction; 
  122.     blendFunction.AlphaFormat = AC_SRC_ALPHA; 
  123.     blendFunction.BlendFlags = 0; 
  124.     blendFunction.BlendOp = AC_SRC_OVER; 
  125.     blendFunction.SourceConstantAlpha = 255; 
  126.     UpdateLayeredWindow(hwnd,screenDC,&ptSrc,&wndSize,memDC,&ptSrc,0,&blendFunction,2); 
  127.  
  128.     ::DeleteDC(memDC); 
  129.     ::DeleteObject(memBitmap); 
  130.  
  131.     /* Run the message loop. It will run until GetMessage() returns 0 */ 
  132.     while (GetMessage (&messages, NULL, 0, 0)) 
  133.     { 
  134.         /* Translate virtual-key messages into character messages */ 
  135.         TranslateMessage(&messages); 
  136.         /* Send message to WindowProcedure */ 
  137.         DispatchMessage(&messages); 
  138.     } 
  139.     Gdiplus::GdiplusShutdown(gdiplusStartupToken); 
  140.     /* The program return-value is 0 - The value that PostQuitMessage() gave */ 
  141.     return messages.wParam; 
  142.  
  143.  
  144. /*  This function is called by the Windows function DispatchMessage()  */ 
  145.  
  146. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
  147.     switch (message)                  /* handle the messages */ 
  148.     { 
  149.         case WM_DESTROY: 
  150.             PostQuitMessage (0);       /* send a WM_QUIT to the message queue */ 
  151.             break; 
  152.         case WM_LBUTTONDOWN: 
  153.             //::SendMessage(hwnd,WM_HIT) 
  154.             break; 
  155.         default:                      /* for messages that we don't deal with */ 
  156.             return DefWindowProc (hwnd, message, wParam, lParam); 
  157.     } 
  158.     return 0; 

 

本文出自 “冰狐浪子的博客” 博客,请务必保留此出处http://bhlzlx.blog.51cto.com/3389283/949818

时间: 2024-10-21 15:44:35

纯win32实现PNG图片透明窗体的相关文章

透明窗体的又一实现

前面拜读过本站无数高手的许多好文章,受益非浅,首先向各位大侠致敬!今天编程偶有小得,不敢独享,特拿出来与各位共享,希望对某些朋友有些许帮助. 透明窗体的问题相信大家已经很熟悉了,前面的几期在线杂志也有几篇详尽的教程,总结一下就是通过SetWindowRgn这个函数来实现,具体的裁切框用CRgn来生成,比较简单的 象圆,椭圆,圆角窗口等CRgn类都提供了相应的生成方法,我们如果想根据自己的图片来生成裁切框前面的朋友提到的方法是首先生成一个矩形裁切框,然后扫描图片,根据象素点的颜色与掩码颜色的匹配与

js实现IE6浏览器PNG图片透明方法总结

例1 有时候按钮并不能存成jpg,因为jpg不透明: 有时候渐变并不能存成gif,因为gif会有颗粒: 所以很多时候,我们要用到png格式,但是IE6并不兼容PNG图片的透明或者是透明度. 而且分为两种情况,一种是PNG图片背景,另一种是插入式的PNG图片. 现在提供解决"插入式的PNG图片"透明问题. 解决办法是在页面头部里插入一段JS即可. 个人标记一下"招聘语音聊天室管理员页面"应用了此方法.  代码如下 复制代码 <script language=&q

解决ie6下png图片透明的完美方法

看了很多网上有关解决ie6下png图片透明的文章,很多都是只解决了页面上插入png图片或css背景调用,而且都没用透明效果,在ie6下仅实现了去除灰底色.今天特下载网上一些优秀页面进行分析整合,整理了两套相当有效的解决方案,可以同时支持插入图片或css背景调用问题. 更新下载版本说明: 1."ie6-png-2(filter)"文件中,滤镜控制调用背景透明和js控制插入图片透明不能同时出现,这样在不同浏览器下会有问题,可以分开使用: 2."ie6-png-1(js)"

转载: 用纯ASP代码实现图片上传并存入数据库中

上传|数据|数据库 用纯ASP代码实现图片上传并存入数据库中 用ASP编写网站应用程序时间长了,难免会遇到各式各样的问题,其中 关于如何上传文件到服务器恐怕是遇见最多的问题了,尤其是上传图片,比如 你想要在自己的社区里面实现类似网易虚拟社区提供的"每日一星"的功能, 就要提供给网友上传照片的功能.上传图片文件到服务器可以使用各种免费的 文件上传组件,使用起来功能虽然很强大,但是由于很多情况下,我们只能使 用免费的支持ASP的空间或者租用别人的虚拟空间,对于第一种情况,我们 根本就没有可

透明窗体:D3D渲染技术 透明3D桌面c++应用 主题对于GDI颜色的影响

问题描述 透明窗体:D3D渲染技术 透明3D桌面c++应用 主题对于GDI颜色的影响 混合节构: m_stBlend.BlendOp = AC_SRC_OVER; m_stBlend.BlendFlags = 0; m_stBlend.AlphaFormat = AC_SRC_ALPHA; m_stBlend.SourceConstantAlpha = 0xFF; // 设置窗体格式 SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd,

xp系统下半透明窗体(即A.EXE)放置在(B.EXE)用opengl绘制的客户区中出现闪烁

问题描述 xp系统下半透明窗体(即A.EXE)放置在(B.EXE)用opengl绘制的客户区中出现闪烁 请问在xp系统下,用c++实现的半透明窗体(即A.EXE)放置在(B.EXE)用opengl绘制的客户区中,为什么会出现闪烁的问题?是什么原因?有没有解决的办法 解决方案 opengl是直接写屏的,所以有冲突,除非关掉显卡的视频加速.

c++-visual studio空项目做出的exe文件如何实现透明窗体?

问题描述 visual studio空项目做出的exe文件如何实现透明窗体? 如题,建了一个空项目,现在只有源文件cpp,编译出的控制台窗口如何实现透明窗体? 程序使用c++写的 上网查了很久,基本都是建立在mfc上的 希望有具体的步骤 解决方案 只有windows窗口才可以,控制台窗口不行

aps.net网站中不使用image控件,使用纯代码如何显示图片?

问题描述 aps.net网站中不使用image控件,使用纯代码如何显示图片? aps.net网站中不使用image控件,使用纯代码如何显示图片? 现在有十张图片,根据前台一个变量的值来显示不同的照片,用纯代码怎样显示出图片? 解决方案 <img runat="server" id="img1"/> img1.Src=param=="1"?"xxx.jpg":"xxxxxxx.jpg";

C# 透明窗体制作实现方法比较分析_C#教程

制作透明窗体办法有好几种,各有优缺点. 我们先来看看C#本身提供的办法 1:通过设置窗体的 TransparencyKey实现 例:窗体中的白色会变成透明 复制代码 代码如下: this.BackColor =Color.White; this.TransparencyKey = Color.White; 2:通过设置窗体的 Opacity 实现 例:窗体的透明度为50% 复制代码 代码如下: this.Opacity = 0.5; 为了更好说明问题,我们先看一个实例. (1)新建一个winfo