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

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

http://www.cnblogs.com/lidabo/p/3701249.html

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

  1. win32下实现透明窗体

    最開始写透明窗体的代码,在百度了之后,找到了SetLayeredWindowAttributes()这一个函数,可是因为网上案列的缺少,使得非常多人无法非常好的使用这一个方法,我花了几天的时间写了一个 ...

  2. 重温 Win32 API ----- 截屏指定窗体并打印

    朋友说在一个VC++6.0开发的项目中要增加打印窗体的功能,让帮忙写个代码供其调用. 这么老的IDE当然不想碰了,并且也不喜欢MFC笨拙不清晰的封装.所以决定採用纯Win32 API,然后用C++类简 ...

  3. gdi+ 高速绘制透明窗体

    gdi+ 高速绘制透明窗体: 方法一: 1.用Iamge对象载入png资源, 2.调用drawimage函数讲图片绘制出了 3.UpdateLayeredWindow对窗体进行布局 方法二: 1.用B ...

  4. qt 获取windows 的消息(通过MFC的DLL的透明窗体转发消息)good

    qt 给win32 发送消息很简单,但是要获取windows 消息却十分复杂,最后想了一个不是很完美 但是也是以现在本人能力所能实现的唯一途径了,基本原理是 利用vc编写一个mfc 的dll ,这个d ...

  5. 【转载】Layered Window(分层窗体,透明窗体)

    本文转载自花间醉卧<Layered Window(分层窗体,透明窗体)> //为窗体添加WS_EX_LAYERED属性,该属性使窗体支持透明 ModifyStyleEx(0, WS_EX_ ...

  6. 解决IE6中 PNG图片透明的终极方案-八种方案!

    “珍惜生命,远离IE6”,IE6中的bug令很多Web前端开发人员实为头疼,因此不知道烧了多少脑细胞,在众多的Bug中最令人抓狂的就是IE对png图片的不支持,导致设计师和重构师放弃了很多很炫的效果, ...

  7. WPF透明窗体不支持缩放解决方案

    方案一 WPF中的无边框透明窗体,由于没有边并且透明,窗体无法进行缩放操作,今天来讲解如何解决这个问题. 先说一下思路,我们先手为该窗体添加4个边,4个角用于缩放操作,然后再为他们写事件,完成拖放操作 ...

  8. Qt Widget 利用 Qt4.5 实现酷炫透明窗体

    本文讲述的是Qt Widget 利用 Qt4.5 实现酷炫透明窗体,QWidget类中的每一个窗口部件都是矩形,并且它们按Z轴顺序排列的.一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分 ...

  9. 分享11个纯css完成的图片浏览器

    图片画廊用于在网站上显示系列图片,它已成为网站重要的组成部分.实现图片画廊有很多种方法,今天要与大家分享的是11个使用纯 CSS 实现的图片画廊,它们代码少,效果炫,加载速度快,希望能对大家有所帮助. ...

随机推荐

  1. Oracle的function

    写在这里,以便于以后忘记格式后可以查询. CREATE OR REPLACE FUNCTION TEMP_FUNC_WYL(PI_AAA100 VARCHAR2, PI_AAA102 VARCHAR2 ...

  2. lodop 打印控件的使用

    先看效果图 : lodop插件  需要安装 打印浏览效果: 实现打印的前提条件 去官网下载几个js包 : http://www.lodop.net/download.html 添加到项目中 图片如下: ...

  3. 我的wifi

    首先利用百度查找 怎么承载网络,托管网络的用户名和密码 . 1.以管理员身份运行命令提示符: 快捷键win+R→输入cmd→回车 2.启用并设定虚拟WiFi网卡: 运行命令:netsh wlan se ...

  4. Android 修改底部导航栏navigationbar的颜色

    Android 修改底部导航栏navigationbar的颜色 getWindow().setNavigationBarColor(Color.BLUE); //写法一 getWindow().set ...

  5. 九度OnlineJudge之1022:游船出租

    题目描述:     现有公园游船租赁处请你编写一个租船管理系统.当游客租船时,管理员输入船号并按下S键,系统开始计时:当游客还船时,管理员输入船号并按下E键,系统结束计时.船号为不超过100的正整数. ...

  6. 数据库迁移 - SQLServer->MySQL

    SqlServer转换为Mysql的一款工具推荐(mss2sql)

  7. SD-关于定价日期的设置

    最近看了一篇关于定价日期的文章,我觉得写得很不错,特将自己的理解摘抄如下: 关于SD的定价日期在SAP系统中有三个配置与其相关,以及手工输入定价日期,具体如下: 1.订单类型的“定价日期建议“ 这个字 ...

  8. 基于Zlib算法的流压缩、字符串压缩源码

    原文:基于Zlib算法的流压缩.字符串压缩源码 Zlib.net官方源码demo中提供了压缩文件的源码算法.处于项目研发的需要,我需要对内存流进行压缩,由于zlib.net并无相关文字帮助只能自己看源 ...

  9. perl 传递对象到模块

    perl 中的对象 就是引用 通过new方法传递数据结构给各个模块 [root@wx03 test]# cat x1.pm package x1; use Data::Dumper; sub new ...

  10. 基于visual Studio2013解决C语言竞赛题之0809链表排序

     题目