1

Windows デスクトップをフェードアウトまたは暗くしてから、デスクトップの長方形の部分を通常どおり表示する方法を考え出そうとしています。これは、画面領域キャプチャ プログラム用です。Web ページの背景のフェード も一般的に行われています。ヒント/ポインター/C++ソースは大歓迎です。Google はこれまでのところ役に立ちませんでした。

ありがとう、ネビル

4

2 に答える 2

8

画面全体をカバーするレイヤードウィンドウを使用しますが、対象の長方形の領域(暗くしない必要がある領域)がカラーキーで完全に塗りつぶされるように、カラーキー値でペイントします。この領域は完全に透明になり、デスクトップの他の部分のように暗くなることはありません。レイヤードウィンドウの残りの部分は、ほとんど透明で暗い色で塗りつぶされた一定のアルファ値を持つように設定する必要があります。

完全で実用的な例を次に示します。

#include "stdafx.h"
#include "ScreenCapper.h"

#define MAX_LOADSTRING 100

//グローバル変数:
HINSTANCE hInst; //現在のインスタンス
TCHAR szTitle [MAX_LOADSTRING]; //タイトルバーのテキスト
TCHAR szWindowClass [MAX_LOADSTRING]; //メインウィンドウのクラス名

//このコードモジュールに含まれる関数の前方宣言:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE、int);
LRESULT CALLBACK WndProc(HWND、UINT、WPARAM、LPARAM);
INT_PTR CALLBACK About(HWND、UINT、WPARAM、LPARAM);

const COLORREFtransparentColor = RGB(255,0,0); //純粋な赤はカラーキー、または完全に透明な色です
const BYTEoverallTranparencyAmount = 90; //255のうち
int DesktopWidth、DesktopHeight;

int APIENTRY _tWinMain(HINSTANCE hInstance、HINSTANCE hPrevInstance、LPTSTR lpCmdLine、int nCmdShow)
{{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    DesktopWidth = GetSystemMetrics(SM_CXSCREEN);
    DesktopHeight = GetSystemMetrics(SM_CYSCREEN);

    MSGメッセージ;
    HACCEL hAccelTable;

    LoadString(hInstance、IDS_APP_TITLE、szTitle、MAX_LOADSTRING);
    LoadString(hInstance、IDC_SCREENCAPPER、szWindowClass、MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    if(!InitInstance(hInstance、nCmdShow))
    {{
        FALSEを返します。
    }

    hAccelTable = LoadAccelerators(hInstance、MAKEINTRESOURCE(IDC_SCREENCAPPER));

    while(GetMessage(&msg、NULL、0、0))
    {{
        if(!TranslateAccelerator(msg.hwnd、hAccelTable、&msg))
        {{
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return(int)msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{{
    WNDCLASSEX wcex;

    memset(&wcex、0、sizeof(WNDCLASSEX));
    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、MAKEINTRESOURCE(IDI_SCREENCAPPER));
    wcex.hCursor = LoadCursor(NULL、IDC_ARROW);
    wcex.hbrBackground =(HBRUSH)(COLOR_WINDOW + 1);
    //wcex.lpszMenuName = MAKEINTRESOURCE(IDC_SCREENCAPPER);
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance、MAKEINTRESOURCE(IDI_SMALL));

    RegisterClassEx(&wcex);を返します。
}

BOOL InitInstance(HINSTANCE hInstance、int nCmdShow)
{{
    hInst = hInstance;
    HWND hWnd = CreateWindowEx(WS_EX_LAYERED、szWindowClass、szTitle、WS_POPUP、0、0、DesktopWidth、DesktopHeight、NULL、NULL、hInstance、NULL);
    if(!hWnd)
        FALSEを返します。
    SetLayeredWindowAttributes(hWnd、transparentColor、32、LWA_COLORKEY | LWA_ALPHA);

    ShowWindow(hWnd、nCmdShow);
    UpdateWindow(hWnd);

    TRUEを返します。
}

LRESULT CALLBACK WndProc(HWND hWnd、UINTメッセージ、WPARAM wParam、LPARAM lParam)
{{
    int wmId、wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    if(message == WM_COMMAND)
    {{
        wmId = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        //メニュー選択を解析します:
        スイッチ(wmId)
        {{
            ケースIDM_EXIT:
                DestroyWindow(hWnd);
                壊す;
            デフォルト:
                DefWindowProc(hWnd、message、wParam、lParam);を返します。
        }
    }
    else if(message == WM_PAINT)
    {{
        hdc = BeginPaint(hWnd、&ps);

        HBRUSH hDarkBackgroundBrush = CreateSolidBrush(RGB(0,0,0));
        HBRUSH hRegionOfInterestBrush = CreateSolidBrush(transparentColor);

        RECT screenRect;
        screenRect.left = screenRect.top = 0;
        screenRect.right = DesktopWidth;
        screenRect.bottom = DesktopHeight;

        RECT InterestRect;
        InterestRect.left = InterestRect.top = 300;
        InterestRect.right = InterestRect.bottom = 600;
        FillRect(hdc、&screenRect、hDarkBackgroundBrush);
        FillRect(hdc、&interestRect、hRegionOfInterestBrush);

        DeleteObject(hDarkBackgroundBrush);
        DeleteObject(hRegionOfInterestBrush);
        EndPaint(hWnd、&ps);
    }
    else if(message == WM_DESTROY)
    {{
        PostQuitMessage(0);
    }
    そうしないと
        DefWindowProc(hWnd、message、wParam、lParam);を返します。
    0を返します。
}
于 2009-10-19T21:10:00.150 に答える
-1

公式の方法は FadeWindow() api を使用することです: Windows はディスプレイ コントロール パネルでそれを行います

C の標準コードを参照してください

于 2009-10-21T12:14:38.203 に答える