Win32 GUI: редактирование управления размытием - PullRequest
3 голосов
/ 10 февраля 2010

У меня есть окно с элементом управления редактирования как его дочерний элемент. Контроль находится в фокусе. Каждый раз, когда я переключаюсь на другое приложение, элемент управления теряет фокус (размытие). Нужно ли отслеживать фокусированный элемент управления, чтобы вручную вернуться обратно при возврате в приложение? Или я что-то не так делаю? Я ожидаю, что Windows автоматически отслеживает такие вещи, но кто знает?

Я на Win32 использую обычный C. Пример:

#include <windows.h>

#define NAME "test"

LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HWND edit1, edit2;
    switch (msg)
    {
        case WM_CREATE:
            edit1 = CreateWindow("edit", "", WS_CHILD|WS_VISIBLE, 0, 0, 200, 50, hWnd, NULL, NULL, NULL);
            edit2 = CreateWindow("edit", "", WS_CHILD|WS_VISIBLE, 250, 0, 200, 50, hWnd, NULL, NULL, NULL);
            return 0;

        case WM_CLOSE:
            DestroyWindow(hWnd);
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS wc;
    wc.style = 0;
    wc.lpfnWndProc = WinProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    wc.lpszMenuName = NAME;
    wc.lpszClassName = NAME;
    RegisterClass(&wc);

    HWND win;
    win = CreateWindow(NAME, "test", WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hInstance, NULL);

    ShowWindow(win, nCmdShow);
    UpdateWindow(win);

    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

1 Ответ

3 голосов
/ 10 февраля 2010

Когда другое приложение становится активным, ваше окно получает уведомление WM_ACTIVATE (для wParam установлено значение WA_INACTIVE ).

Когда ваше приложение снова станет активным, ваше окно снова получит уведомление WM_ACTIVATE , на этот раз с wParam, установленным в WA_ACTIVE или WA_CLICKACTIVE

Поскольку вы не используете диспетчер диалогов, вам может потребоваться установить фокус на элемент управления для редактирования, когда вы активированы.

Если сомневаетесь, используйте Spy ++ в диалоговом окне и следите за трафиком сообщений, когда приложение деактивировано, а затем снова активировано. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...