win32用GDI+加载png图片作为背景图

  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

win32用GDI+加载png图片作为背景图,码迷,mamicode.com

时间: 2024-12-25 20:30:59

win32用GDI+加载png图片作为背景图的相关文章

Gdi+ 加载Gif图片(BYTE*转为IStream)

今天工作中遇到GDI+加载图片流的问题,网上找了很多资料都不行,绘制其他帧总是模糊,, 网上的方法代码如下: 注:pImageData是BYTE*类型 ,dImageLen是DWORD类型; HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, dImageLen); BYTE* pmem = (BYTE*)GlobalLock(m_hMem); memcpy(pmem,pImageData,dImageLen); IStream* pstm; HRESULT ht

有效解决Android加载大图片时内存溢出的问题

首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红.绿.蓝三个字节 CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青.品.黄.黑四个字节 图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8) 例如:一幅640*480图像分辨率.RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24

图片预加载与图片懒加载的区别与实现

预加载与懒加载,我们经常经常用到,这些技术不仅仅限于图片加载,我们今天讨论的是图片加载: 一.什么是图片预加载与懒加载: 图片预加载:顾名思义,图片预加载就是在网页全部加载之前,提前加载图片.当用户需要查看时可直接从本地缓存中渲染,以提供给用户更好的体验,减少等待的时间.否则,如果一个页面的内容过于庞大,没有使用预加载技术的页面就会长时间的展现为一片空白,这样浏览者可能以为图片预览慢而没兴趣浏览,把网页关掉,这时,就需要图片预加载.当然这种做法实际上牺牲了服务器的性能换取了更好的用户体验. 图

[android] 加载大图片到内存

默认情况下,android程序分配的堆内存大小是16,虚拟机上面的VM Heep就是设置它的 一个图片所占的内存,比如1920*2560像素的图片需要,1920*2560*3至少这些的内存byte 找到ImageView控件对象 调用BitmapFactory对象的decodeFile(pathName)方法,来获取一个位图对象,参数:pathName是String类型的图片路径 把图片导入到手机的sdcard目录下面 调用ImageView对象的setImageBitmap(bitemap)方

iOS面试题之加载单张图片到底会不会崩溃?

今天,一哥们去某公司面试iOS职位.其中一道题目问,加载一张图片,到底会不会崩溃呢? 我拿到这个问题,当时以为是获取网络图片,那还是可能崩溃的,但实际问题,还有半句,图片是本地的... 这问题,加载本地的怎么会崩溃呢?写这么久加载图片也没遇到如此问题. =================================================== 原来,iPhone毕竟是手持设备,它所占有的内存是有限的,当图片过大的时候会引起内存导致的崩溃现象. 后来,我又查了下,发现,原来还有这么大学

图片--Android有效解决加载大图片时内存溢出的问题

Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView

Fresco 使用笔记(一):加载gif图片并播放

前言: 项目中图文混合使用的太多太多了,但是绝大部分都是静态图片. 然而现在项目开发中有这么一个需求:显示一个出一个简短的动画(一般都不超过3秒)演示 比如说:一个功能提供很多步骤来教用户做广播体操,那么第一步就显示一个3秒钟的动作图,第二步显示一个几秒钟的动作图.(当然这个需求不是这个功能) 怎么解决呢:一确定这个需求我的第一实现思路便是让美工给我搞几个连续的图片,我使用帧动画来轮回播放 便实现了这个动画. 但是帧动画使用起来太复杂了,一套动作我要搞好久来实现.那么就想Android中支持不支

android95 缩放加载大图片

MainActivity: package com.itheima.loadimage; import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.graphics.Point; i

Android加载大图片到内存

加载大图片到内存 步骤: 步骤一: 获取品屏幕的宽高数据;[HD1] 步骤二: 获取图片的宽高;[HD2] 步骤三: 计算屏幕与图片的宽高比例,按照差距最大的进行缩放处理;[HD3] 步骤四: 图片的缩放处理;[HD4] [HD1]// 获取手机的屏幕的窗体大小 WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Display display = windowManager.getDef