2008-10-06 3 views
0

problème étrange:WS_EX_TOOLWINDOW sautant à fond sur la fenêtre détruire

  1. Ouvrir une grande fenêtre de bloc-notes
  2. créer un toolwindow (style WS_EX_TOOLWINDOW)
  3. créer 2 autres fenêtres (de chevauchement normale) (WS_OVERLAPPED)
  4. fermer ces 2 fenêtres superposées (enfant du bureau ou de la fenêtre d'outils)
  5. la fenêtre d'outils saute derrière la fenêtre du bloc-notes

Est-ce que quelqu'un sait pourquoi c'est le cas? Ou ce que je pourrais faire mal? Je dirais "bug dans Windows", mais c'est rarement le cas.

Pour répondre aux questions:

Il n'est pas une fenêtre de dialogue, mais une fenêtre complète. Si je le fais avoir des enfants corrects (ie: pas un enfant de bureau), l'entrée de la barre des tâches pour les enfants n'apparaît pas (probablement facilement réparable), mais de toute façon, le bug arrive toujours.

J'ai inclus un exemple de code qui montre le problème. J'espère que je crée juste la fenêtre fausse ou exigée pour répondre à un message que je ne réponds pas.

Dans cet exemple, une fenêtre d'outil s'ouvrira (aucune entrée de la barre des tâches, ce qui est souhaité). Ensuite, vous cliquez sur cette fenêtre, une sous-fenêtre s'ouvrira. Vous cliquez sur la sous-fenêtre, une autre fenêtre s'ouvre. Puis fermez les deux nouveaux sous-fenêtres et la fenêtre d'origine, au lieu d'obtenir le focus, saute immédiatement derrière d'autres fenêtres (bloc-notes, etc.).

Merci pour toute aide!

Exemple de code pour clarifier:

// 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); 

}

Répondre

1

Ceci n'est pas surprenant. En fait, c'est exactement le comportement auquel je m'attendrais.

Vous êtes fenêtre de l'outil ne saute pas vers le bas; plutôt Notepad saute.

Vous avez fermé la fenêtre qui avait activé. Le système va activer la prochaine fenêtre de plus haut niveau dans l'ordre z. Votre fenêtre d'outils ne compte pas comme une fenêtre de haut niveau à cet égard (cela fait partie de ce que signifie une fenêtre d'outil). Donc, le Bloc-notes est activé, et il vient au sommet.

Si vous souhaitez que votre fenêtre d'outils soit activée à la place, vous n'avez probablement pas besoin d'une fenêtre d'outils.

0

les trois fenêtres des boîtes de dialogue à une autre fenêtre principale ou sont des applications qu'ils en eux-mêmes?

S'il s'agit de fenêtres de dialogue, je vérifierais que leur fenêtre parente est correctement affectée.

S'il s'agit de fenêtres d'application, je vérifierais qu'elles apparaissent dans la barre des tâches.

Sans plus d'informations sur le problème, il est difficile de donner une réponse plus significative.

+0

J'ai mis à jour la question pour inclure plus d'informations.Merci pour la réponse jusqu'à présent! – Bob

Questions connexes