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


  • 相关阅读:
    存储过程和函数
    linux命令行执行db2存储过程
    使用 springmvc请求 返回 字符串时 ,中文出现乱码
    shiro + struts2 在action 中使用 shiro 注解 @requiresPermissions 报错: 方法找不到,类初始失败
    spring 注解 注入属性 和 注解完成bean定义
    hibernate4 , spring3 使用 org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean 报错 Implementing class
    action spring 注入错误,如果检查各项注入都没有错误时,考虑struts 是否配置了namespace(如果你有多个namespace="/")
    urlrewritefilter 本地windowsxp 上正常 使用 ,但是 到linux服务器 上 则时好时坏 ,不起作用
    filter 死循环(tomcat 启动完成 ,自动执行filter.dofilter,导致tomcat 启动超时) , tomcat 启动和 servers 启动 不同
    项目 solrcloud / zookeeper 搭建
  • 原文地址:https://www.cnblogs.com/xieyuan/p/3787428.html
Copyright © 2011-2022 走看看