Visual studio 2010 GDI+;在Windows 8.1上不起作用?

Visual studio 2010 GDI+;在Windows 8.1上不起作用?,visual-studio-2010,winapi,windows-8.1,gdi+,Visual Studio 2010,Winapi,Windows 8.1,Gdi+,我想让win32中的alpha混合窗口在所有windows平台上工作。我在visual_studio_2010_sp1_x86中加载了一个带有GDI+和图像与图形类的png文件。它在windows XP和7_sp1 x86&x64上运行得非常好。但当我在Windows8.1上运行它时,它不会显示任何内容,也不会显示任何错误消息。 windows 8.1是否停止支持GDI+,或者我的代码中出现了问题?塔克斯。 这是我的全部代码: #define _UNICODE #define UNICODE

我想让win32中的alpha混合窗口在所有windows平台上工作。我在visual_studio_2010_sp1_x86中加载了一个带有GDI+和图像与图形类的png文件。它在windows XP和7_sp1 x86&x64上运行得非常好。但当我在Windows8.1上运行它时,它不会显示任何内容,也不会显示任何错误消息。 windows 8.1是否停止支持GDI+,或者我的代码中出现了问题?塔克斯。 这是我的全部代码:

#define _UNICODE
#define UNICODE

#ifndef WINVER              
#define WINVER 0x0501       
#endif

#ifndef _WIN32_WINNT        
#define _WIN32_WINNT 0x0501
#endif

#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0410
#endif

#define WIN32_LEAN_AND_MEAN 

#include <windows.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

#include <commctrl.h>
#include <atlimage.h>
#include <objbase.h> 
#include <gdiplus.h> 
using namespace Gdiplus; 
#pragma comment (lib, "Gdiplus.lib")
#pragma comment (lib, "comctl32.lib")

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    MSG msg;
    HACCEL hAccelTable;

    GdiplusStartupInput Startup;
    GdiplusStartup( &gdiplusToken, &Startup, NULL );

    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, IDI_APPLICATION);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = L"CTest";
    wcex.hIconSm        = LoadIcon(wcex.hInstance, IDI_APPLICATION);
    RegisterClassEx(&wcex);

    HWND hWnd;
    hWnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_LEFT | WS_EX_TOOLWINDOW, L"CTest", L"Test", WS_VISIBLE,
                            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   if (!hWnd)
      return FALSE;

    HANDLE hFile = CreateFile(L"Shape.png" ,
        GENERIC_READ | GENERIC_WRITE , 
        FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE , 
        NULL , OPEN_EXISTING , NULL , NULL);
    if (!hFile)
        return(0);
    DWORD dwSize = GetFileSize( hFile, NULL );
    HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, dwSize);
    LPBYTE pMem = (LPBYTE)GlobalLock(hMem);
    DWORD dwRead = 0;
    ReadFile( hFile, pMem, dwSize, &dwRead, NULL);
    CloseHandle(hFile);

    IStream * pStream = NULL;
    CreateStreamOnHGlobal( hMem, FALSE, &pStream);
    Image * pImage = pImage->FromStream(pStream, FALSE);
    GlobalUnlock(hMem);
    pStream->Release();
    if (!pImage)
        return(0);
    SetWindowPos(hWnd, NULL, 0, 0, 150, 150, SWP_NOZORDER | SWP_NOMOVE);
    ShowWindow(hWnd, SW_NORMAL);
    //UpdateWindow(hWnd);

    HDC hDC = GetDC(hWnd);
    HDC hdcMemory = CreateCompatibleDC(hDC);
    BITMAPINFOHEADER bmih = { 0 };   
    int nBytesPerLine = ((150 * 32 + 31) & (~31)) >> 3;
    bmih.biSize = sizeof(BITMAPINFOHEADER);   
    bmih.biWidth = 150;   
    bmih.biHeight = 150;   
    bmih.biPlanes = 1;   
    bmih.biBitCount = 32;   
    bmih.biCompression = BI_RGB;   
    bmih.biClrUsed = 0;   
    bmih.biSizeImage = nBytesPerLine * 150;
    PVOID pvBits = NULL;   
    HBITMAP hbmpMem = CreateDIBSection(NULL, (PBITMAPINFO)&bmih, DIB_RGB_COLORS, &pvBits, NULL, 0);
    memset( pvBits, 0, 150 * 4 * 150);
    if(hbmpMem)   
    {   
        HGDIOBJ hbmpOld = SelectObject( hdcMemory, hbmpMem); 
        Graphics graph(hdcMemory);
        graph.SetPageScale(1.0);
        graph.SetPageUnit(UnitPixel);
        graph.SetSmoothingMode(SmoothingModeNone);
        graph.DrawImage(pImage, 0, 0, 150, 150);
        RECT rc;
        GetWindowRect(hWnd, &rc);
        POINT ptSrc = { 0, 0};
        POINT ptWinPos = { rc.left, rc.top};
        SIZE szWin = { 150 , 150 };
        BLENDFUNCTION stBlend = { AC_SRC_OVER, 0, 0xFF, AC_SRC_ALPHA };
        UpdateLayeredWindow(hWnd, hDC, &ptWinPos, &szWin, hdcMemory, &ptSrc, 0, &stBlend, ULW_ALPHA);
        graph.ReleaseHDC(hdcMemory);
        SelectObject( hdcMemory, hbmpOld);   
        DeleteObject(hbmpMem); 
    }
    DeleteDC(hdcMemory);
    DeleteDC(hDC);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE)
            break;
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    delete pImage;

    GdiplusShutdown(gdiplusToken);

    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_NCHITTEST:
        {
            UINT uHitTest = DefWindowProc(hWnd, WM_NCHITTEST, wParam, lParam);
            if(uHitTest == HTCLIENT)
                return(HTCAPTION);
            else
                return(uHitTest);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 1;
}
\define\u UNICODE
#定义UNICODE
#温弗
#定义WINVER 0x0501
#恩迪夫
#ifndef\u WIN32\u WINNT
#定义_WIN32_WINNT 0x0501
#恩迪夫
#ifndef\u WIN32\u WINDOWS
#定义WIN32 WINDOWS 0x0410
#恩迪夫
#定义WIN32_精益_和_平均值
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间Gdiplus;
#pragma注释(lib,“Gdiplus.lib”)
#pragma注释(lib,“comctl32.lib”)
GdiplusStartupInput GdiplusStartupInput;
ULONG_PTR gdiplusToken;
LRESULT回调WndProc(HWND、UINT、WPARAM、LPARAM);
int APIENTRY双主,
_在当前情况下,
_在LPTSTR lpCmdLine中,
_In_uuint(nCmdShow)
{
未引用的_参数(HPPreInstance);
未引用的_参数(lpCmdLine);
味精;
HACCEL hAccelTable;
GdiplusStartupInput启动;
GdiplusStartup(&gdiplusToken,&Startup,NULL);
WNDCLASSEX wcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc=WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=加载图标(hInstance,IDI_应用程序);
wcex.hCursor=LoadCursor(空,IDC_箭头);
wcex.hbrBackground=(HBRUSH)(彩色窗口+1);
wcex.lpszMenuName=NULL;
wcex.lpszClassName=L“CTest”;
wcex.hIconSm=加载图标(wcex.hInstance,IDI_应用程序);
注册类别(&wcex);
HWND-HWND;
hWnd=CreateWindowEx(WS_EX_分层| WS_EX_左| WS_EX_工具窗口,L“CTest”,L“Test”,WS_可见,
CW_usefault,0,CW_usefault,0,NULL,NULL,hInstance,NULL);
如果(!hWnd)
返回FALSE;
HANDLE hFile=CreateFile(L“Shape.png”,
一般的读,一般的写,
文件共享删除文件共享读取文件共享写入,
空,打开(存在,空,空);
如果(!hFile)
返回(0);
DWORD dwSize=GetFileSize(hFile,NULL);
HGLOBAL hMem=GlobalAlloc(GMEM_固定,dwSize);
LPBYTE pMem=(LPBYTE)GlobalLock(hMem);
DWORD dwRead=0;
ReadFile(hFile、pMem、dwSize和dwRead,NULL);
闭合手柄(hFile);
IStream*pStream=NULL;
CreateStreamOnHGlobal(hMem、FALSE和pStream);
Image*pImage=pImage->FromStream(pStream,FALSE);
GlobalUnlock(hMem);
pStream->Release();
如果(!pImage)
返回(0);
设置窗口位置(hWnd、NULL、0、0、150、150、SWP|u NOZORDER | SWP|u NOMOVE);
显示窗口(hWnd、SW_正常);
//更新窗口(hWnd);
HDC HDC=GetDC(hWnd);
HDC hdcMemory=CreateCompatibleDC(HDC);
BitMapInfo标头bmih={0};
int nBytesPerLine=((150*32+31)和(~31))>>3;
bmih.biSize=sizeof(BitMapInfo头);
bmih.biWidth=150;
bmih.biHeight=150;
双翼飞机=1;
bmih.bibibitcount=32;
bmih.biCompression=BI_RGB;
bmih.biClrUsed=0;
bmih.biSizeImage=nBytesPerLine*150;
PVOID pvBits=NULL;
HBITMAP hbmpMem=CreateDIBSection(NULL,(PBITMAPINFO)和bmih,DIB_RGB_颜色和pvBits,NULL,0);
memset(pvBits,0,150*4*150);
if(hbmpMem)
{   
HGDIOBJ hbmpOld=SelectObject(hdcMemory,hbmpMem);
图形(hdcMemory);
图.SetPageScale(1.0);
graph.SetPageUnit(单位像素);
图.设置平滑模式(平滑模式无);
绘图图像(pImage,0,0,150,150);
RECT-rc;
GetWindowRect(hWnd和rc);
点ptSrc={0,0};
点ptWinPos={rc.left,rc.top};
大小szWin={150150};
BLENDFUNCTION stBlend={AC_SRC_OVER,0,0xFF,AC_SRC_ALPHA};
UpdateLayeredWindow(hWnd、hDC和ptWinPos、szWin、hdcMemory和ptSrc、0和stBlend、ULW_ALPHA);
图.ReleaseHDC(hdcMemory);
选择对象(hdcMemory、hbmpOld);
删除对象(hbmpMem);
}
DeleteDC(hdcMemory);
DeleteDC(hDC);
while(GetMessage(&msg,NULL,0,0))
{
if(msg.message==WM\u KEYDOWN&&msg.wParam==VK\u ESCAPE)
打破
翻译信息(&msg);
发送消息(&msg);
}
删除pImage;
GdiplusShutdown(gdiplusToken);
返回(int)msg.wParam;
}
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM)
{
int wmId,wmEvent;
PAINTSTRUCT-ps;
HDC-HDC;
开关(信息)
{
案例WM_NCHITTEST:
{
UINT uHitTest=DefWindowProc(hWnd、WM\n chittest、wParam、lParam);
如果(uHitTest==HTCLIENT)
返回(HTCAPTION);
其他的
返回(uHitTest);
}
打破
案例WM_销毁:
PostQuitMessage(0);
打破
违约:
返回DefWindowProc(hWnd、message、wParam、lParam);
}
返回1;
}

在使用它之后,我发现我在Windows8.1“ProgramFiles(x86)”或“ProgramFiles”文件夹中运行该程序,但它不起作用!但当我将程序文件夹更改到其他任何位置时,它就工作了!!谁能告诉我有什么问题吗

请提供一个GDI+是活的,它是每像素阿尔法混合火箭科学,使程序员陷入麻烦。在UpdateLayeredWindow()之前,我没有看到ShowWindow()调用,这不太好。它有ShowWindow(),但已删除以缩短代码长度。一般来说,在提问时最好不要用
替换代码块。如果你不