zoukankan      html  css  js  c++  java
  • win32下gdiplus的使用/实现PNG图片透明窗体

    新建win32项目
    ---------------------

    如果有自动生成stdio.h,把里面的
    #define WIN32_LEAN_AND_MEAN
    注释掉
    否则添加#include <windows.h>
    ------------------------


    添加h
    #include <gdiplus.h>
    打开名字空间
    using namespace Gdiplus;
    添加lib
    #pragma comment(lib,"gdiplus.lib")
    -----------------------

    winmain函数最上面添加
    ULONG_PTR token;
    GdiplusStartupInput gsi;
    GdiplusStartup(&token,&gsi,0);

    最下面返回前添加
    GdiplusShutdown(token);
    --------------------------

    wndproc 里添加

    case WM_PAINT:
       hdc = BeginPaint(hWnd, &ps);
       // TODO: Add any drawing code here...
       OnPaint(hdc);
       EndPaint(hWnd, &ps);
       break;
    ---------------

    添加画图函数
    void OnPaint(HDC hdc){
    Graphics g(hdc);
    Gdiplus::Image img(L"img.jpg");
    Pen pen(Color(233,24,22));
    g.DrawImage(&img,PointF());
    g.DrawLine(&pen,0,0,100,100);
    }

    其中img.jpg为当前目录(调试时为当前项目文件夹)下的一张图片
    -------------------------

    好了,自己玩玩吧


    摘自:http://hi.baidu.com/kikoqiu/item/2e60f12b4dd123f850fd87d3


    纯win32实现PNG图片透明窗体\


    #include <windows.h>
    #include <gdiplus.h>
    #pragma comment(lib,"gdiplus.lib")
    /*  GDI+ startup token */
    ULONG_PTR gdiplusStartupToken;

    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

    // UpdateLayeredWindow Defination
    typedef BOOL(*UPDATELAYEREDWINDOWFUNCTION)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD);

    /*  Make the class name into a global variable  */
    TCHAR szClassName[ ] = L"PNGDialog";

    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nCmdShow)
    {

        /**/
        Gdiplus::GdiplusStartupInput gdiInput;
        Gdiplus::GdiplusStartup(&gdiplusStartupToken,&gdiInput,NULL);
        /**/
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */

        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;//+-69+
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style =WS_OVERLAPPED;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);

        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default colour as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;

        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               WS_EX_LAYERED|WS_EX_TOPMOST|WS_EX_TOOLWINDOW,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               L"PNGDialog Example Application",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               500,                 /* The programs width */
               500,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );

        /* Make the window visible on the screen */
        ShowWindow (hwnd, nCmdShow);
        LONG style = ::GetWindowLong(hwnd,GWL_STYLE);
        if(style&WS_CAPTION)
            style^=WS_CAPTION;
        if(style&WS_THICKFRAME)
            style^=WS_THICKFRAME;
        if(style&WS_SYSMENU)
            style^=WS_SYSMENU;
        ::SetWindowLong(hwnd,GWL_STYLE,style);

        style = ::GetWindowLong(hwnd,GWL_EXSTYLE);
        if(style&WS_EX_APPWINDOW)
            style^=WS_EX_APPWINDOW;
        ::SetWindowLong(hwnd,GWL_EXSTYLE,style);

        /********************************************
        *   step 1.
        *   Using Gdiplus to load the image
        ********************************************/
        RECT wndRect;
        ::GetWindowRect(hwnd,&wndRect);
        SIZE wndSize = {wndRect.right-wndRect.left,wndRect.bottom-wndRect.top};
        HDC hdc = ::GetDC(hwnd);
        HDC memDC = ::CreateCompatibleDC(hdc);
        HBITMAP memBitmap = ::CreateCompatibleBitmap(hdc,wndSize.cx,wndSize.cy);
        ::SelectObject(memDC,memBitmap);

        Gdiplus::Image image(L"F:\\我的作品\\C#作品\\垃圾清理专家\\_撮鸟识别器\\image\\close.png");
        Gdiplus::Graphics graphics(memDC);
        graphics.DrawImage(&image,0,0,wndSize.cx,wndSize.cy);
        /********************************************
        *   step 2.
        *   Get "UpdateLayeredWindow" function's
        *   proc address.
        ********************************************/
        HMODULE hUser32 = ::LoadLibrary(L"User32.dll");
        if(!hUser32)
        {
            return FALSE;
        }
        UPDATELAYEREDWINDOWFUNCTION UpdateLayeredWindow = (UPDATELAYEREDWINDOWFUNCTION)::GetProcAddress(hUser32,"UpdateLayeredWindow");
        if(!UpdateLayeredWindow)
        {
            return FALSE;
        }
        // get screen dc
        HDC screenDC = GetDC(NULL);
        POINT ptSrc = {0,0};

        /*********************************************
        *   step 3.
        *   Use UpdateLayeredWindow to Draw the Window
        *
        *********************************************/
        BLENDFUNCTION blendFunction;
        blendFunction.AlphaFormat = AC_SRC_ALPHA;
        blendFunction.BlendFlags = 0;
        blendFunction.BlendOp = AC_SRC_OVER;
        blendFunction.SourceConstantAlpha = 255;
        UpdateLayeredWindow(hwnd,screenDC,&ptSrc,&wndSize,memDC,&ptSrc,0,&blendFunction,2);

        ::DeleteDC(memDC);
        ::DeleteObject(memBitmap);

        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
        Gdiplus::GdiplusShutdown(gdiplusStartupToken);
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }


    /*  This function is called by the Windows function DispatchMessage()  */

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            case WM_LBUTTONDOWN:
                //::SendMessage(hwnd,WM_HIT)
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
        return 0;
    }

    摘自:http://blog.csdn.net/bhlzlx/article/details/7481601


  • 相关阅读:
    存储过程 游标 有用
    Spring框架IOC容器和AOP解析 非常 有用
    业务逻辑;完成根据自动分单结果来决定进行的相关业务处理
    业务逻辑:完成基于分区关键字匹配的自动分单业务逻辑
    业务逻辑:完成基于CRM地址完全匹配的自动分单业务逻辑
    业务逻辑:完成客户下单后前台系统的数据处理并调用后台系统服务处理业务 webservice接口调用 有用
    Spring IOC 少
    Spring IOC 巨多 非常 有用
    Spring ioc
    LeetCode -- Remove Element
  • 原文地址:https://www.cnblogs.com/xieyuan/p/3787428.html
Copyright © 2011-2022 走看看