3

次のようにウィンドウクラスを登録します。

WNDCLASSEX wctt;
wctt.cbSize        = sizeof(WNDCLASSEX);
wctt.style         = CS_DBLCLKS;
wctt.lpfnWndProc   = WndProcTooltip;
wctt.cbClsExtra    = 0;
wctt.cbWndExtra    = 0;
wctt.hInstance     = m_hAppInstance;
wctt.hIcon         = NULL;
wctt.hCursor       = LoadCursor(NULL, IDC_SIZE);
wctt.hbrBackground = NULL;
wctt.lpszMenuName  = NULL;
wctt.lpszClassName = _T("myWindow");
wctt.hIconSm       = NULL;
RegisterClassEx(&wctt)

ご覧のとおり、私はwctt.hbrBackground = NULL;を使用しています。そのため、背景はありません。

ウィンドウは次のように作成されます。

::CreateWindowEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW,
_T("myWindow"),
NULL,
WS_VISIBLE | WS_POPUP,
50,
50,
150,
100,
NULL,
NULL,
m_hAppInstance,
NULL);

ペイントセクションで、ウィンドウにアイコンを描画します。

PAINTSTRUCT     ps;
HDC             hdc;
BITMAP          bitmap;
ICONINFO        iconinfo;
hdc = ::BeginPaint(hWnd, &ps);
::SetBkMode(hdc,TRANSPARENT);
::GetIconInfo(localIcon, &iconinfo);
::GetObject(iconinfo.hbmColor, sizeof(bitmap), &bitmap);
::DeleteObject(iconinfo.hbmColor);
::DeleteObject(iconinfo.hbmMask);
::DrawIconEx(hdc, 0,0, localIcon, bitmap.bmWidth, bitmap.bmHeight, 0, NULL, DI_NORMAL);

アイコンのサイズはウィンドウのサイズよりも小さく、ポップアップの下のウィンドウの現在のビューを背景に表示します。

しかし、ウィンドウを移動したとき(またはポップアップの下のウィンドウを最小化したとき)、背景は変化しません。

私は毎回流れるタイマーを作ろうとしていました:

RECT rcClient;
GetClientRect(hWnd, &rcClient);
InvalidateRect(hWnd,&rcClient,TRUE);

これにより、印刷機能が再度実行されますが、アイコンの背景は変更されません。

私はで何かをすべきWM_ERASEBKGNDですか?
誰かがそれを機能させる方法を知っていますか?

みんなありがとう

4

3 に答える 3

3

背景をそのままにしておくだけでは十分ではありません。また、必要に応じて自分自身を再描画するために、自分のにあるウィンドウを取得する必要があります。

ウィンドウが同じスレッドによって作成された同じ階層の一部である場合、ウィンドウにWS_EX_TRANSPARENT拡張スタイルを与えるだけで十分です。これにより、下のウィンドウが最初にペイントされるため、背景が常に最新になります。

SetWindowRgnそれ以外の場合は、ペイントする境界線の外側にウィンドウが実際に存在しないようにする必要があります。

于 2012-12-26T17:47:59.977 に答える
2

レイヤードウィンドウを見てください。この機能により、さまざまな形状の半透明のウィンドウを作成できます。

WS_EX_LAYEREDウィンドウクラスに拡張属性を追加します。

次の2つの機能を使用して、ウィンドウの透明度を制御できます。

  1. SetLayeredWindowAttributes

    1. bAlphaLWA_ALPHAを渡した場合、ウィンドウ全体の不透明度を制御しますdwFlags

      bAlphaが0の場合、ウィンドウは完全に透明になります。bAlphaが255の場合、ウィンドウは不透明です。

    2. crKey透明になる色を設定します。

      この色でウィンドウによってペイントされたすべてのピクセルは透明になります。

  2. UpdateLayeredWindowウィンドウの透明度を正確に制御できます。ウィンドウのさまざまな部分にさまざまなレベルの透明度を与えることができます。

于 2012-12-26T18:18:50.523 に答える
0

非長方形のウィンドウを作成しようとしている場合、これは十分ではありません。「背景なし」を設定すると、単に背景が描画されず、その場所のメモリに何が起こっても表示されます。

非長方形のウィンドウを作成するには、SetWindowRgn関数を見てください。

于 2012-12-26T17:30:26.577 に答える