• 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

  • 相关阅读:
    Sightseeing,题解
    A Simple Problem,题解
    城池攻占,题解
    传递,题解
    How many ways??,题解
    Least Cost Bracket Sequence,题解
    Evacuation,题解
    Tallest Cow,题解
    容易题,题解
    无题Ⅱ,题解
  • 原文地址:https://www.cnblogs.com/lidabo/p/3701246.html
Copyright © 2020-2023  润新知