2014-02-09 2 views
1

내 프로그램에서 레이어 창을 가지고 있고 그것을 잘 작동하는 (시각적으로) 보이지만, UpdateLayeredWindow의 리턴 코드는 성공이 아닌 제로 값으로 가정된다를 반환 UpdateLayeredWindow. 내 경우는 0이며, GetLastError 잘못된 매개 변수입니다, 87을 반환합니다. 누군가 내 설치에 문제가 있는지 알려주실 수 있습니까? 여기에 전체 기능입니다, 윈도우 스타일은 WS_EX_LAYERED|WS_EX_TOPMOSTWS_POPUP 있습니다.윈도우 API : 값

bool SplashScreen(HWND hwnd, HINSTANCE m_hinstance) 
{ 
    HBITMAP hBitmap = (HBITMAP)LoadImage(m_hinstance, "splash.bmp", IMAGE_BITMAP, 640, 640, LR_LOADFROMFILE); 
    PAINTSTRUCT  ps; 
    HDC    hdc; 
    BITMAP   bitmap; 
    HDC    hdcMem; 
    HGDIOBJ   oldBitmap; 
    int result=0; 

    if(!SetLayeredWindowAttributes(hwnd, 0, (255 * 100)/100, LWA_ALPHA)) 
    { 
     char msg[255]; 
     sprintf(msg,"Error SetLayeredWindowAttributes: %d",GetLastError()); 
     MessageBox(hwnd,msg,"System",MB_OK); 
     return false; 
    } 

    hdc = BeginPaint(hwnd, &ps); 
    if(!hdc) 
    { 
     char msg[255]; 
     sprintf(msg,"Error BeginPaint: %d",GetLastError()); 
     MessageBox(hwnd,msg,"System",MB_OK); 
     return false; 
    } 

    hdcMem = CreateCompatibleDC(hdc); 
    if(!hdcMem) 
    { 
     char msg[255]; 
     sprintf(msg,"Error CreateCompatibleDC: %d",GetLastError()); 
     MessageBox(hwnd,msg,"System",MB_OK); 
     return false; 
    } 

    oldBitmap = SelectObject(hdcMem, hBitmap); 

    GetObject(hBitmap, sizeof(bitmap), &bitmap); 
    result=BitBlt(hdc, 0, 0, 640, 640, hdcMem, 0, 0, SRCCOPY); 
    if(result==0) 
    { 
     char msg[255]; 
     sprintf(msg,"Error BitBlt: %d",GetLastError()); 
     MessageBox(hwnd,msg,"System",MB_OK); 
     return false; 
    } 

    BLENDFUNCTION blend = { 0 }; 
    blend.BlendOp = AC_SRC_OVER; 
    blend.SourceConstantAlpha = 255; 
    blend.AlphaFormat = AC_SRC_ALPHA; 

    result=UpdateLayeredWindow(hwnd,GetDC(NULL),NULL,NULL,hdcMem,NULL, RGB(0,0,0),&blend, ULW_ALPHA);// Returns non-zero on success(!), in reality works when 0 is returned. 
    if(result==0) 
    { 
     char msg[255]; 
     sprintf(msg,"Error UpdateLayeredWindow: %d",GetLastError());// Error UpdateLayeredWindow: 87 
     MessageBox(hwnd,msg,"System",MB_OK); 
     return false; 
    } 

    result=SetLayeredWindowAttributes(hwnd, RGB(255,255,255), 0, ULW_COLORKEY); 
    if(result==0) 
    { 
     char msg[255]; 
     sprintf(msg,"Error SetLayeredWindowAttributes: %d",GetLastError()); 
     MessageBox(hwnd,msg,"System",MB_OK); 
     return false; 
    } 

    result=EndPaint(hwnd, &ps); 
    if(result==0) 
    { 
     char msg[255]; 
     sprintf(msg,"Error EndPaint: %d",GetLastError()); 
     MessageBox(hwnd,msg,"System",MB_OK); 
     return false; 
    } 

    SelectObject(hdcMem, oldBitmap); 
    DeleteDC(hdc); 
    DeleteObject(hdcMem); 
    return true; 
} 

답변

5

동일한 HWND에 SetLayeredWindowAttributes()UpdateLayeredWindow()을 요구하고있다. 그것은 작동하지 않습니다, 및 설명서는 매우 분명하다 : 계층화 된 창을 촉구하고있다 SetLayeredWindowAttributes되면, 이후 UpdateLayeredWindow 호출은 레이어 스타일의 비트가 해제 될 때까지 실패 것

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633540(v=vs.85).aspx

주 다시 설정하십시오.

SetLayeredWindowAttributes()UpdateLayeredWindow()을 함께 사용하지 마십시오. 그것들은 매우 다른 방법론입니다. 어느 전통적인 WM_PAINT 드로잉 SetLayeredWindowAttributes()을 사용하거나, 메모리 비트 맵을 사용 UpdateLayeredWindow(). 둘 다 사용하지 마십시오. 표시 한 내용에 따라 UpdateLayeredWindow()을 단독으로 사용해야합니다. 비트 맵을 윈도우 내용으로 설정하고 동시에 윈도우의 투명도/알파를 설정합니다.

그리고 WM_PAINT 핸들러의 Begin/EndPaint() 외부를 사용하지 마십시오.

+0

당신 말이 맞아, 감사합니다. – Vladivarius