2013-03-25 19 views
5

私は完全に透明な境界線のないウィンドウを、その上に完全に表示されたテキストで作ろうとしています。テキストの背景は透過的ではなく、実際のフォント面である必要があります。問題は、SetWindowRgnを実行していないときにTextOutが表示されることがわかります。私は私が間違っているの何見当がつかない:(透明なwin32ウィンドウとテキスト

このように、これを解決
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 
{ 
    HWND hWnd; 
    hInst = hInstance; 

    DWORD Flags1 = WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_NOACTIVATE | WS_EX_TOPMOST | WS_EX_TRANSPARENT; 
    DWORD Flags2 = WS_POPUP; 

    hWnd = CreateWindowEx(Flags1, szWindowClass, szTitle, Flags2, 0, 0, 1920, 1200, 0, 0, hInstance, 0); 

    if(!hWnd)return FALSE; 

    HRGN GGG = CreateRectRgn(0, 0, 0, 0); 
    SetWindowRgn(hWnd, GGG, false); 

    ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 

    DeleteObject(GGG); 

    return TRUE; 
} 

    case WM_PAINT: 
    hdc = BeginPaint(hWnd, &ps); 

    SetBkMode(hdc, TRANSPARENT); 
    TextOut(hdc, 50, 50, L"MY TEXT", lstrlen(L"MY TEXT")); 

    EndPaint(hWnd, &ps); 
+3

CreateRectRgnにまともな値を渡します( ) –

+0

私は0,0,1920,1200で試しましたが、今は何も見えません。画面全体が見えないようにしています:( – Kachinsky

+0

@ user1040769 Githubにこのソリューションを追加してください。ウィンドウが透明な場所)と子ウィンドウ(ボタンなど)を1つずつ押してください。これはとても素晴らしいので、これをどのように達成したかを私たちが知ることができます。リンクを乗せてください。どうもありがとうございます! – bluejamesbond

答えて

3

:はい、0 X 0ピクセルのウィンドウを表示するために実際に困難である

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 
{ 
    HWND hWnd; 
    hInst = hInstance; 

    DWORD Flags1 = WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_NOACTIVATE | WS_EX_TOPMOST | WS_EX_TRANSPARENT; 
    DWORD Flags2 = WS_POPUP; 

    hWnd = CreateWindowEx(Flags1, szWindowClass, szTitle, Flags2, 0, 0, 1920, 1200, 0, 0, hInstance, 0); 

    if(!hWnd)return FALSE; 

    HRGN GGG = CreateRectRgn(0, 0, 1920, 1200); 
    InvertRgn(GetDC(hWnd), GGG); 
    SetWindowRgn(hWnd, GGG, false); 

    COLORREF RRR = RGB(255, 0, 255); 
    SetLayeredWindowAttributes(hWnd, RRR, (BYTE)0, LWA_COLORKEY); 

    ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 

    DeleteObject(GGG); 

    return TRUE; 
} 

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

    switch (message) 
    { 
    case WM_ERASEBKGND: 

     GetClientRect(hWnd, &rect); 
     FillRect((HDC)wParam, &rect, CreateSolidBrush(RGB(255, 0, 255))); 

     break; 
+0

'SetWindowRgn'関数の[Documentation](http://msdn.microsoft.com/en-us/library/windows/desktop/dd145102.aspx)には、次のように書かれています:*" SetWindowRgnへの呼び出しが成功した後、システムは領域ハンドルhRgnで指定された領域。領域のコピーは作成されませんので、この領域ハンドルを使用して関数呼び出しを行う必要はありません。あなたがその契約に違反した場合。 –