Как сделать окно непрозрачным? - PullRequest
1 голос
/ 15 февраля 2010

Я хочу сделать родительское окно непрозрачным со значением RGB как (99,99,99)? Ранее мое окно было прозрачным, но теперь у меня есть требование сделать окно непрозрачным.

Упомянутая ниже функция относится к моему родительскому окну:

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    LogEntry(L"Entered in myRegisterClass Function");

    WNDCLASS CLASS_NAME_ONE_SEG_APP;
    CLASS_NAME_ONE_SEG_APP.cbClsExtra = 0;
    CLASS_NAME_ONE_SEG_APP.cbWndExtra = 0;
    CLASS_NAME_ONE_SEG_APP.hbrBackground = 0;
    CLASS_NAME_ONE_SEG_APP.hCursor = 0;
    CLASS_NAME_ONE_SEG_APP.hIcon = 0;
    CLASS_NAME_ONE_SEG_APP.hInstance = hInstance;
    CLASS_NAME_ONE_SEG_APP.lpfnWndProc =  (WNDPROC) WndProc;
    CLASS_NAME_ONE_SEG_APP.lpszClassName = className;
    CLASS_NAME_ONE_SEG_APP.lpszMenuName = 0;
    CLASS_NAME_ONE_SEG_APP.style = 0;

    LogEntry(L"Exiting from myRegisterClass Function");

    return RegisterClass(&CLASS_NAME_ONE_SEG_APP); 
}

Упомянутый ниже - функция InitInstance, в которой я создаю родительское окно.

handles.parent - это мое родительское окно.

bool WINAPI InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    LogEntry(L"Entered in InitInstance Function");
    handles.parent = CreateWindowEx(0,
                                    className,
                                    windowName, 
                                    WS_VISIBLE | WS_POPUP,
                                    0, 0, 
                                    coordinates.width, coordinates.height,
                                    NULL, 
                                    NULL, 
                                    hInstance, 
                                    NULL);

    if(handles.parent == NULL)
    {
        LogValue(L"Cannot Create Parent Window"
            L"\nInitInstance Function terminated abnormally");
        return false;
    }
    else
    {
        UpdateWindow(handles.parent);
        ShowWindow(handles.parent, nCmdShow);
        LogEntry(L"Exiting from InitInstance Function");
        return true;
    }
}

Ниже приведена функция для WM_PAINT:

case WM_PAINT:
        LogEntry(L"Entred in WM_PAINT");
        PaintWindow(); 
        SetFocus(handles.parent);
        LogEntry(L"Exited from WM_PAINT");
        break;

Это PaintWindow выполняет следующие действия.

void PaintWindow()
{
    LogEntry(L"Entered in PaintWindow Function");
    HWND *handle = &handles.volUp;

    //Paint Buttons on the window
    for(register char i =  MIN_BUTTON; i <= MAX_BUTTON; i++)
    {
        PaintButton( (INITIAL_BUTTON + i) , *handle, btns, i);
        handle++;
    }

    //Paint the AXIS_VOL_ON_OFF Button According to its Status
    if(volumeStatus.status == VOLUME_ON)
        PaintButton(IDB_BTN_VOL_OFF, handles.volOnOff, btns, AXIS_VOL_ON_OFF);
    else if(volumeStatus.status = VOLUME_MUTE)
        PaintButton(IDB_BTN_VOL_ON, handles.volOnOff, btns, AXIS_VOL_ON_OFF);

    //Paint Images on the window
    if(handles.screenMode == SCREEN_MODE_OPERATION)
        InsertImages();

    LogEntry(L"Exited from PaintWindow Function");
}

Заранее спасибо ......

1 Ответ

1 голос
/ 15 февраля 2010

Вы должны дать своему классу ненулевую кисть фона

  CLASS_NAME_ONE_SEG_APP.hbrBackground = CreateSolidBrush(RGB((99,99,99));

И в вашем WindowProc вам необходимо убедиться, что вы передаете сообщение WM_ERASEBKGND в DefWindowProc. (эта часть, вероятно, уже происходит)

1006 * Позже * Хорошо, ваш код WM_PAINT делает некоторые вещи неправильно. Важно, чтобы вы вызывали BeginPaint и EndPaint при обработке сообщения WM_PAINT, и вам нужно использовать HDC, который вы получаете от BeginPaint при рисовании. case WM_PAINT: { LogEntry(L"Entred in WM_PAINT"); PAINTSTRUCT ps; HDC hdc = BeginPaint(&ps); PaintWindow(hdc); EndPaint(hwnd, &ps); LogEntry(L"Exited from WM_PAINT"); } break; Ваше окно прозрачно, потому что вы никогда не вызываете BeginPaint в своем обработчике WM_PAINT, поэтому вы никогда не закончите рисовать что-либо на экране. См. Рисунок в клиентской области для более полного примера.

...