WS_EX_TOOLWINDOW прыгает на фон при разрушении окна - PullRequest
0 голосов
/ 06 октября 2008

Странная проблема:

  1. Открыть большое окно блокнота
  2. создать окно инструментов (стиль WS_EX_TOOLWINDOW)
  3. создать еще 2 окна (с нормальным перекрытием) (WS_OVERLAPPED)
  4. закрыть эти 2 перекрывающихся окна (дочерний элемент рабочего стола или окна инструментов)
  5. окно инструментов прыгает за окном блокнота

Кто-нибудь знает, почему это так? Или что я могу делать не так? Я бы сказал «ошибка в Windows», но это редко так.

Чтобы ответить на вопросы:

Это не диалоговое окно, а полное окно. Если я сделаю так, чтобы у него были правильные дочерние элементы (то есть: не дочерние элементы рабочего стола), запись на панели задач для дочерних элементов не появится (вероятно, легко исправимо), но в любом случае ошибка все равно возникает.

Я включил пример кода, который показывает проблему. Я надеюсь, что просто создаю окно неправильно или требуется ответить на сообщение, на которое я не отвечаю.

В этом примере откроется окно инструментов (без ввода панели задач, что и требуется). Затем вы нажимаете на это окно, откроется подокно. Вы нажимаете на подокно, откроется другое окно. Затем закройте как новые, так и исходные окна, вместо того, чтобы фокусироваться, сразу переходите к другим окнам (блокнот и т. Д.).

Спасибо за любую помощь!

Пример кода для уточнения:

// WindowToback.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "WindowToback.h"

// Global Variables:
HINSTANCE g_instance;
HWND g_mainWnd = NULL;

wchar_t *szWindowClass = L"WindowToBackSub";
wchar_t *szWindowClass2 = L"WindowToBackSub2";

ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    WndProc2(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

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

    MSG msg;

    MyRegisterClass(hInstance);

// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
    return FALSE;
}

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

return (int) msg.wParam;
}


ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

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_WINDOWTOBACK));
wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WINDOWTOBACK);
wcex.lpszClassName  = szWindowClass;
wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

RegisterClassEx(&wcex);

wcex.lpfnWndProc    = WndProc2;
wcex.lpszClassName  = szWindowClass2;

return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   g_instance = hInstance; 
   g_mainWnd = CreateWindowEx(WS_EX_TOOLWINDOW,szWindowClass, szWindowClass,WS_OVERLAPPED,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!g_mainWnd) return FALSE;

   ShowWindow(g_mainWnd, nCmdShow);
   UpdateWindow(g_mainWnd);

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
    case WM_LBUTTONDOWN:
    {
        HWND l_hwnd = CreateWindow(szWindowClass2, szWindowClass2, WS_VISIBLE | WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, g_instance, NULL);
        ShowWindow(l_hwnd,SW_SHOW);
        break;
    }

    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
}

return DefWindowProc(hWnd, message, wParam, lParam);
}

LRESULT CALLBACK WndProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
    case WM_LBUTTONDOWN:
    {
        HWND l_hwnd = CreateWindow(szWindowClass2, szWindowClass2, WS_VISIBLE | WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, g_instance, NULL);
        ShowWindow(l_hwnd,SW_SHOW);
    }
    break;
}

return DefWindowProc(hWnd, message, wParam, lParam);

}

Ответы [ 2 ]

1 голос
/ 29 сентября 2009

Это не удивительно. На самом деле, это именно то поведение, которое я ожидал.

Окно инструментов не спрыгивает; скорее Блокнот подпрыгивает.

Вы закрыли окно с активацией. Система собирается активировать следующее наивысшее окно верхнего уровня в z-порядке. В этом отношении ваше окно инструментов не считается окном верхнего уровня (это часть того, что значит быть окном инструмента). Таким образом, блокнот активируется, и он достигает вершины.

Если вы хотите, чтобы окно вашего инструмента активировалось, вам, вероятно, не нужно окно инструмента.

0 голосов
/ 08 октября 2008

Являются ли три окна диалоговыми окнами другого главного окна или они являются приложениями по-своему?

Если это диалоговые окна, то я бы проверил, правильно ли назначено их родительское окно.

Если это окна приложений, я бы проверил, отображаются ли они на панели задач.

Без дополнительной информации о проблеме трудно дать более значимый ответ.

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