错误:包含windows.h时,未在范围中声明SetLayeredWindowAttributes

时间:2013-08-11 20:18:57

标签: c++ winapi compiler-errors

当我尝试编译代码时,我的编译器代码块给出了以下错误:

c:\blah.cpp|67|error: 'SetLayeredWindowAttributes' was not declared in this scope

我包括windows.h所以我不明白为什么会这样。这是完整的代码:

// main.cpp : Defines the entry point for the application. //
#include "C:\Program Files\Microsoft DirectX SDK (August 2008)\Include\D3dx9core.h"
#include "C:\Documents and Settings\Death\My Documents\Downloads\DXSprite\DXSprite\resource.h"
#include <windows.h>
#include <string>
#include <stdio.h> //----------------------------------------------------------------------------- // GLOBALS //----------------------------------------------------------------------------- HWND                      g_hWnd                  = NULL; LPDIRECT3D9                 g_pD3D                  = NULL; LPDIRECT3DDEVICE9           g_pD3DDevice            = NULL; ID3DXSprite
*               g_pD3DXSprite           = NULL; LPDIRECT3DTEXTURE9          g_pTexture              = NULL; const int                   SCREEN_WIDTH            = 800; const int                    SCREEN_HEIGHT           = 600;

//----------------------------------------------------------------------------- // PROTOTYPES //----------------------------------------------------------------------------- LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HRESULT  InitializeD3D       ( ); void RenderFrame           ( );

//----------------------------------------------------------------------------- // Name: WinMain() // Desc: The application's entry point //----------------------------------------------------------------------------- int WINAPI WinMain( HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR     lpCmdLine,
                    int       nCmdShow ) {  WNDCLASSEX  winClass;   MSG         uMsg;   HRESULT     hr;

    memset(&uMsg,0,sizeof(uMsg));

    winClass.lpszClassName = "MY_WINDOWS_CLASS";    winClass.cbSize       
= sizeof(WNDCLASSEX);   winClass.style         = CS_HREDRAW | CS_VREDRAW;   winClass.lpfnWndProc   = WindowProc;    winClass.hInstance 
= hInstance;    winClass.hIcon         = LoadIcon(hInstance, (LPCTSTR)IDC_DXSPRITE);
    winClass.hIconSm       = LoadIcon(hInstance, (LPCTSTR)IDC_DXSPRITE);    winClass.hCursor       = LoadCursor(NULL, IDC_ARROW);   winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);   winClass.lpszMenuName  = NULL;  winClass.cbClsExtra    = 0;     winClass.cbWndExtra    = 0;

    if( !RegisterClassEx(&winClass) )       return E_FAIL;

    g_hWnd = CreateWindowEx( NULL, "MY_WINDOWS_CLASS",
                             "Direct3D 9 - ID3DXSprite Example",
                             WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                             0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, hInstance, NULL );

    if( g_hWnd == NULL )        return E_FAIL;

    ShowWindow( g_hWnd, nCmdShow );
    UpdateWindow( g_hWnd );    SetLayeredWindowAttributes(GetActiveWindow(), NULL, 255, LWA_ALPHA);     //----------------------------------------------------------------  // Create the DirectX device    //----------------------------------------------------------------  if (FAILED( InitializeD3D()))       return 0;


    //----------------------------------------------------------------  // CREATE THE ID3DXSprite   //----------------------------------------------------------------

    // Create the ID3DXSprite interface object  hr = D3DXCreateSprite(g_pD3DDevice, &g_pD3DXSprite );   if( FAILED(hr) )        return hr;


    //----------------------------------------------------------------  // LOAD THE TEXTURE FOR THE SPRITE  //----------------------------------------------------------------

    // --------------------------------------------------------     // Load the texture.  I decided to use the extended     // version of the texture loading function just to show what    // it would look like.  // The texture was created with Photoshop with a transparent    // background to start with.  Then line cross hairs were added.     //  // Note - If you don't use a texture image that has a power of  // 2 size for the width or height then the image may not load   // properly.  This image is 256x256.    //
    D3DXCreateTextureFromFileEx(        g_pD3DDevice,       "C:\\Documents and Settings\\Death\\My Documents\\45handold2.tga",              // Our texture image!       D3DX_DEFAULT,               // width        D3DX_DEFAULT,               // height       D3DX_DEFAULT,               // MIP levels       0,                          // usage        D3DFMT_DXT1,                // texture format       D3DPOOL_MANAGED,            // mem pool         D3DX_DEFAULT,               // filter       D3DX_DEFAULT,               // MIP filter       0,                          // transparent color key        NULL,                       // image info struct        NULL,                       // palette      &g_pTexture);               // the returned texture, if success

    if ( FAILED(hr) )       return hr;





    // ---------    // Main Loop    // ---------    while( uMsg.message != WM_QUIT )    {       if( PeekMessage( &uMsg, NULL, 0, 0, PM_REMOVE ) )       {           TranslateMessage( &uMsg );          DispatchMessage( &uMsg );       }   }

    // -------------------------    // Release directx resources    //
-------------------------   if (g_pD3DXSprite)  {       g_pD3DXSprite->Release();       g_pD3DXSprite = NULL;   }

    if (g_pTexture)     {       g_pTexture->Release();      g_pTexture = NULL;  }

    if (g_pD3DDevice)   {       g_pD3DDevice->Release();        g_pD3DDevice = NULL;    }




    UnregisterClass( "MY_WINDOWS_CLASS", winClass.hInstance );  return (int)uMsg.wParam; }

//----------------------------------------------------------------------------- // Name: WindowProc() // Desc: The window's message handler //----------------------------------------------------------------------------- LRESULT CALLBACK WindowProc( HWND   hWnd,
                             UINT   msg,
                             WPARAM wParam,
                             LPARAM lParam ) {

    switch( msg )   {
        case WM_KEYDOWN:        {           switch( wParam )            {
                case VK_ESCAPE:
                    PostQuitMessage(0);
                    break;

            }       }
        break;

        case WM_CLOSE:      {           PostQuitMessage(0);         }

        case WM_DESTROY:        {
            PostQuitMessage(0);         }
        break;

        default:        {
            RenderFrame();          return DefWindowProc( hWnd, msg, wParam, lParam );      }       break;  }

    return 0; }

//----------------------------------------------------------------------------- // Name: InitializeD3D() // Desc: Create DirectX interface objects //        Initialize the view matrix. //      Setup render states that will not need changing throughout //       the life of the application. //----------------------------------------------------------------------------- HRESULT InitializeD3D( ) {    HRESULT hr;

    // Create a direct 3D interface object
    g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );

    if( g_pD3D == NULL )    {       // TO DO: Respond to failure of Direct3DCreate9         return E_FAIL;  }

    D3DDISPLAYMODE d3ddm;

    if( FAILED( hr = g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )    {       // TO DO: Respond to failure of GetAdapterDisplayMode       return hr;  }


    //  if( FAILED( hr = g_pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
                                                d3ddm.Format, D3DUSAGE_DEPTHSTENCIL,
                                                D3DRTYPE_SURFACE, D3DFMT_D16 ) ) )  {       if( hr == D3DERR_NOTAVAILABLE )             // POTENTIAL PROBLEM: We need at least a 16-bit z-buffer!           return hr;  }

    //  // Do we support hardware vertex processing? If so, use it.     // If not, downgrade to software.   //

    D3DCAPS9 d3dCaps;

    if( FAILED( hr = g_pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT,
                                       D3DDEVTYPE_HAL, &d3dCaps ) ) )   {       // TO DO: Respond to failure of GetDeviceCaps       return hr;  }

    DWORD dwBehaviorFlags = 0;

    if( d3dCaps.VertexProcessingCaps != 0 )         dwBehaviorFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING;     else        dwBehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    //  // Everything checks out - create a simple, windowed device.    //

    D3DPRESENT_PARAMETERS d3dpp;    memset(&d3dpp, 0, sizeof(d3dpp));

    d3dpp.BackBufferFormat       = d3ddm.Format;    d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;   d3dpp.Windowed               = TRUE;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    d3dpp.PresentationInterval   = D3DPRESENT_INTERVAL_IMMEDIATE;

    // Attempt to create a HAL device, end app on failure just to keep things   // simple.  In other words we are not trying to create a REF device if the  // HAL fails.
    if( FAILED( hr = g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, HWND_DESKTOP,
                                      dwBehaviorFlags, &d3dpp, &g_pD3DDevice ) ) )  {   //    char blah[100];
      //  snprintf (blah, 1000, "%d", hr);      //MessageBox (NULL,blah,NULL,NULL);     }


    // If we get here everything worked!    return S_OK; }


//----------------------------------------------------------------------------- // Name: RenderFrame() // Desc: Draw the image to the framebuffer. //----------------------------------------------------------------------------- void RenderFrame( ) {    if (!g_pD3DDevice && !g_pD3DXSprite && !g_pTexture)         return;


    // Clear the frame & depth buffer ready for drawing (Black color)
    g_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,  0x00000000, 1.0f, 0 );

    g_pD3DDevice->BeginScene();     {       //-------------------------         // Render the sprite        //

        D3DXVECTOR3 vecPos = D3DXVECTOR3(0,0,0);

        if (g_pD3DXSprite && g_pTexture)        {           g_pD3DXSprite->Begin( D3DXSPRITE_ALPHABLEND );          g_pD3DXSprite->Draw(g_pTexture, NULL, NULL, &vecPos, 0xffffffff);           g_pD3DXSprite->End();       }


    }   g_pD3DDevice->EndScene();


    // Frame buffer to Front buffer     g_pD3DDevice->Present( NULL, NULL, NULL, NULL );

}

1 个答案:

答案 0 :(得分:1)

您需要在之前添加#define _WIN32_WINNT 0x0501 ,包括windows.h,因为SetLayeredWindowAttributes仅在_WIN32_WINNT >= 0x0500时宣布。