Frage

Weird-Ausgabe:

  1. Öffnen Sie einen großen Notizblock Fenster
  2. erstellen Toolwindow (Stil WS_EX_TOOLWINDOW)
  3. erstellen 2 weitere Fenster (normal überlappt) (WS_OVERLAPPED)
  4. schließen diese 2 überlappte Fenster (Kind von Desktop oder im Werkzeugfenster)
  5. die Werkzeugfenster springt hinter dem Notizblock Fenster

Wer weiß, warum dies der Fall ist? Oder was könnte ich falsch sein? Ich würde sagen, ‚Fehler in Windows‘, aber das ist selten der Fall.

Zur Beantwortung von Fragen:

Es ist kein Dialog-Fenster, sondern ein Voll Fenster. Wenn ich es richtig, Kinder zu machen (dh: kein Kind von Desktop), die Taskleiste Eintrag für die Kinder nicht erscheinen (wahrscheinlich leicht reparierbar), aber so oder so passiert der Fehler immer noch.

Ich habe Beispiel-Code enthalten, der das Problem zeigt. Ich hoffe, ich bin nur das Fenster falsch oder erforderlich zu schaffen, um eine Nachricht zu antworten ich reagiert bin nicht auf.

In diesem Beispiel wird ein Werkzeug Fenster geöffnet (keine Taskleiste Eintrag, das ist, was gewünscht wird). Dann klicken Sie auf das Fenster, wird ein Unterfenster öffnen. Sie klicken auf das Unterfenster, wird ein weiteres Fenster geöffnet. Dann die beiden neuen Unterfenster schließen und das ursprüngliche Fenster, statt Fokus bekommen, springt sofort hinter anderen Fenstern (Notizblock, usw.).

Vielen Dank für jede Hilfe!

Beispiel-Code zu klären:

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

}

War es hilfreich?

Lösung

Dies ist nicht überraschend. In der Tat, es ist genau das Verhalten, das ich erwarten würde.

Sie sind Werkzeugfenster nicht springen nach unten; eher Notepad springt auf.

Sie das Fenster geschlossen, die Aktivierung hatte. Das System wird die nächsthöheren Fenster der obersten Ebene in der z-Reihenfolge zu aktivieren. Ihr Werkzeug Fenster nicht eine Zählung als Top-Level-Fenster in dieser Hinsicht (das ist Teil dessen, was bedeutet, ein Werkzeugfenster ist). So Notepad wird aktiviert und es kommt nach oben.

Wenn Sie Ihr Werkzeugfenster wollen stattdessen aktiviert werden, werden Sie wahrscheinlich nicht wirklich ein Werkzeugfenster werden sollen.

Andere Tipps

Sind die drei Fenster Dialoge auf eine andere Hauptfenster oder sind sie Anwendungen in ihrem eigenen Recht?

Wenn sie im Dialogfenster sind dann würde ich überprüfen, ob ihre übergeordneten Fenster korrekt zugeordnet ist.

Wenn sie Anwendungsfenster sind dann würde ich prüfen, ob sie in der Taskleiste erscheinen.

Ohne weitere Informationen über das Problem ist es schwer, eine sinnvolle Antwort zu geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top