2012-03-17 3 views
1

msvc2008, xp sp3에있는 UpdateLayeredWindow()를 사용하여 불규칙한 윈도우를 그리려고했습니다. 여기
내 코드의 일부입니다 :이 기능을 사용하려면 여러 가지 방법을 시도UpdateLayeredWindow를 사용하는 코드가 작동하지 않습니다.

//Add something(CreateWindowEx()): 
hwndCyauWnd = CreateWindowEx(
    /*WS_EX_TOOLWINDOW |*/ WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_LAYERED, 
    lpwsCyauClassName, 
    lpwsCyauWndName, 
    WS_CLIPSIBLINGS | WS_POPUP, 
    GetSystemMetrics(SM_CXSCREEN)-320, 
    GetSystemMetrics(SM_CYSCREEN)-232, 
    320, 200, 
    NULL, 
    NULL, 
    hInstance, 
    NULL); 

//Skip Lines 
HDC hdcCyauWnd = GetDC(hwndCyauWnd); 
HDC hdcBuffer = CreateCompatibleDC(hdcCyauWnd); 
//HBITMAP hbmCyau = CreateCompatibleBitmap(hdcBuffer,120, 93); 
//SelectObject(hdcBuffer, hbmCyau); 

POINT ptZero = {0, 0}; 
POINT ptDrawPos = {0, 0}; 
RECT rctCyauWnd; 
GetWindowRect(hwndCyauWnd, &rctCyauWnd); 
SIZE szCyauWnd={rctCyauWnd.right - rctCyauWnd.left, rctCyauWnd.bottom - rctCyauWnd.top}; 
BLENDFUNCTION blendPixelFunction = { AC_SRC_OVER, 0, 100, AC_SRC_ALPHA}; 

Graphics gphCyauWnd(hdcBuffer); 
Image imgCyau(L"surface0000.png"); 
gphCyauWnd.DrawImage(&imgCyau, 0, 0, 125, 93); 

UpdateLayeredWindow(hwndCyauWnd, 
    hdcCyauWnd, &ptZero, 
    &szCyauWnd, 
    hdcBuffer, &ptZero, 
    0, //RGB(255, 255, 255), 
    &blendPixelFunction, 
    ULW_ALPHA); 

while (GetMessage(&msg, NULL, 0, 0))  
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 
return msg.wParam; 

하지만, 모든 화면에 아무것도 나타나지 않습니다, 실패했습니다.
아무도 나에게 무슨 일이 일어나고 어떻게 슬러워 할 수 있겠습니까?

추가 :
전체 소스 파일이 my skydrive에 업로드되어 누구나 수정할 수 있습니다. (나는 지금 약한 약자가되었다 ...)

+0

당 [문서] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633556.aspx), 창 당신은 통과 'UpdateLayeredWindow' 함수에 대한 첫 번째 매개 변수는'CreateWindowEx' 함수로 생성 될 때 'WS_EX_LAYERED' 스타일을 지정해야합니다. 그리고 8 이전의 Windows 버전에서는 그 윈도우가 최상위 윈도우 여야합니다 (Windows 8은 최상위 윈도우 * 및 * 하위 윈도우에 대해 'WS_EX_LAYERED'스타일을 지원합니다). –

+0

@CodyGray 오, 죄송합니다. 나는 몇 줄을 남겼다. hwndCyauWnd는 이미 블록 앞에 WS_ES_LAYERED 스타일을 가지고 있습니다. 그렇게하면 효과가 있지만 그렇지 않습니다. 그래서 혼란 스럽습니다. – cuter44

+0

흠, 질문을 편집하고 빠뜨린 행을 추가하십시오. 특히 CreateWindowEx를 호출하여 창을 생성하는 곳. 이와 같은 질문 (코드를 디버깅하는 데 도움을 줄 사람을 물어 보는 곳)에는 실제로 실행할 수있는 작은 자체 포함 데모 프로젝트가 포함되어야합니다. –

답변

1

당신은 좋은 생각이 아닌 GDI와 GDI +를 섞었다. 여기에 동작하는 예제입니다 : 당신은 GDI + 알파 채널이있는 이미지를 그리려는 경우

hWnd = CreateWindowEx(WS_EX_LAYERED, szWindowClass, szTitle, 0, 
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 

// Load PNG 
CImage img; 
img.Load("BACKGR.png"); 
// Get image sizes 
int nWidth = img.GetWidth(); 
int nHeight = img.GetHeight(); 
// Create memory DC 
HDC hdcScreen = GetDC(NULL); 
HDC hDC = CreateCompatibleDC(hdcScreen); 
// Create memory bitmap 
HBITMAP hBmp = CreateCompatibleBitmap(hdcScreen, nWidth, nHeight); 
HBITMAP hBmpOld = (HBITMAP)SelectObject(hDC, hBmp); 
// Draw image to memory bitmap (currently selected in memory DC) 
img.Draw(hDC, 0, 0, nWidth, nHeight, 0, 0, nWidth, nHeight); 

// Call UpdateLayeredWindow 
BLENDFUNCTION blend = {0}; 
blend.BlendOp = AC_SRC_OVER; 
blend.SourceConstantAlpha = 128;// half transparent 
blend.AlphaFormat = AC_SRC_ALPHA; 
POINT ptLocation = {0, 0}; 
SIZE szWnd = {nWidth, nHeight}; 
POINT ptSrc = {0, 0}; 
UpdateLayeredWindow(hWnd, hdcScreen, &ptLocation, &szWnd, hDC, &ptSrc, 0, &blend, ULW_ALPHA); 
ShowWindow(hWnd, SW_SHOW); 

SelectObject(hDC, hBmpOld); 
DeleteObject(hBmp); 
DeleteDC(hDC); 
ReleaseDC(NULL, hdcScreen); 
+0

Errr ...,'img.Draw (hDC, 0, 0, nWidth, nHeight, 0, 0, nWidth, nHeight);가 잘못되어'inline void CImage :: ReleaseDC() Spy ++ – cuter44

+0

죄송합니다, 어떻게 든 ShowWindow (hWnd, SW_SHOW) 코드에서 미끄러, 편집 된 답변을 참조하십시오. 이걸 추가하고 나면 모든 것이 잘 돌아가고 있습니다. PNG 파일이 괜찮은가요? – Flot2011

+0

여전히 작동하지 않으며 심지어 어떤 일이 일어 났는지 말할 수 없습니다 ... 코드를 skydrive에 업로드했습니다. 좀 더 도와 주시겠습니까? 감사를 많이! – cuter44

1

것은, 당신이 비트 맵이 아닌 HDC에 그릴 수 있고, 당신은 비트 맵의 ​​형식은 알파를 가지고 지정해야 . HBITMAP을 사용하려면 GDI +를 비트 맵 비트로 가리켜 야합니다. 이 같은

뭔가 :

BITMAPINFOHEADER bih; 
HBITMAP hbmp; 
HDC hdc; 
void *bits; 

bih.biSize = sizeof(bih); 
bih.biWidth = width; 
bih.biHeight = -height; 
bih.biPlanes = 1; 
bih.biBitCount = 32; 
bih.biCompression = BI_RGB; 
bih.biSizeImage = 0; 
bih.biXPelsPerMeter = 0; 
bih.biYPelsPerMeter = 0; 
bih.biClrUsed = 0; 
bih.biClrImportant = 0; 

hdc = CreateCompatibleDC(NULL); 

hbmp = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_RGB_COLORS, &bits, NULL, 0); 

Bitmap bitmap(width, height, 0, PixelFormat32bppPARGB, bits); 

Graphics graphics(bitmap); 

graphics->DrawWhatever(...); 

graphics->Flush(); 

SelectObject(hdc, hbitmap); 

UpdateLayeredWindow(hwnd, hdc, ... 
+0

"HDC가 아닌 비트 맵으로 그려야합니다."몇 달 동안이 문제로 인해 막혔습니다! – WawaBrother

관련 문제