2

こんにちは、私WNDCLASSEXはこのデータを持つ構造を持っています:

m_wndClass.cbSize = sizeof(WNDCLASSEX);
m_wndClass.style = CS_NOCLOSE;
m_wndClass.lpfnWndProc = WndProc;
m_wndClass.cbClsExtra = 0;
m_wndClass.cbWndExtra = 0;
m_wndClass.hInstance = GetModuleHandle(NULL);
m_wndClass.hIcon = NULL;
m_wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
m_wndClass.hbrBackground = NULL;
m_wndClass.lpszMenuName = NULL;
m_wndClass.lpszClassName = Checkbox::CHECKBOX_CLASS.c_str(); 
m_wndClass.hIconSm = NULL;

親ウィンドウにテキストを描画する必要があり、テキストは任意の色になる可能性があるため、背景のないウィンドウが必要です。

描画は正常に機能します。描画用のコード:

case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC dc = BeginPaint(window, &ps);

    if (!classInfo->m_text.empty())
    {
        HDC wdc = GetDC(window);

        SetBkMode(wdc,TRANSPARENT);
        DrawText(wdc, classInfo->m_text.c_str(), -1, &classInfo->m_textRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP);
        ReleaseDC(window, wdc); 
    }

    EndPaint(window, &ps);
    break;
}

ただし、ラベルのテキストを変更する方法があります。

void Checkbox::SetText(const String& text)
{
    m_text = text;
    SetTextRectSize();   //calculates size of RECT 
    if (m_window != NULL)
        InvalidateRect(m_window, NULL, TRUE);
}

ラベル付きのウィンドウを作成した後、ラベルが表示されますが、テキストを変更したい場合は変更されません (手動でウィンドウのサイズを変更する必要があり、その後変更されます)。ただし、背景に色を付けていたときは、この問題はありませんでした。たとえば、ウィンドウ クラスには次のようなものがあります。

m_wndClass.hbrBackground = HBRUSH(COLOR_3DFACE+1);

背景のないウィンドウを更新する方法を教えてください。

編集: 私はいくつかのものを試しました

FillRect(dc, &rect, (HBRUSH)GetStockObject(NULL_BRUSH));

ウィンドウプロシージャも変更しようとしました:

case WM_CTLCOLORSTATIC:
{
    HDC hdc = (HDC) wp; 
    SetBkMode (hdc, TRANSPARENT);
    return (LRESULT)GetStockObject(NULL_BRUSH);
}

その結果、ラベルの一部に設定textした後、以前に新しいテキストを描画すると破損します! これを参照してください。ただし、メイン ウィンドウのサイズを変更すると、ラベルが読めるようになります。some longer text

4

3 に答える 3

1

DrawText()デフォルトは黒ですが、コードは のデバイス コンテキストのテキストの前景色を設定しません。SetTextColor()を参照してください。

SetBkMode(..., TRANSPARENT)DrawText()ウィンドウ全体ではなく、四角形の背景色/モードを設定するだけです。

于 2013-09-05T02:56:06.767 に答える
0

ウィンドウを透明にする方法について質問していますが、問題は描画にはまったくありません。

答えは、基本的に、透明なウィンドウを作成するためにこれまで行ってきたことはすべて間違っているということです。ウィンドウは透明に見えますが、ウィンドウを移動してサイズを変更したときの動作からわかるように、実際にはそうではありません。それが典型的な症状です。

つまり、ウィンドウを透明にしておらず、背景の描画を停止しただけです。背景として表示されるのは、ウィンドウが最初に描画されたときにたまたまウィンドウの下にあったものです。

レイヤード ウィンドウを作成する必要があります。透明なウィンドウを作成する方法については、こちらを参照してください。

于 2013-09-06T07:42:44.897 に答える
-1

親フォームでテキスト/チェック/ラベルを透明にしますか?

WS_CLIPSIBLINGS と WS_EX_TRANSPARENT を追加できます。

WM_PAINT メッセージの場合は SetBkMode(hDC, TRANSPARENT) を使用する

于 2016-06-23T02:09:30.027 に答える