您的位置:首页 > 其它

win32下gdiplus的使用/实现PNG图片透明窗体

2013-04-07 18:50 357 查看
新建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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: