WS_EX_TOOLWINDOW跳转到背景上的窗口摧毁

问题描述:

奇怪的问题:WS_EX_TOOLWINDOW跳转到背景上的窗口摧毁

  1. 打开一个大的记事本窗口
  2. 创建一个工具窗口(样式WS_EX_TOOLWINDOW)
  3. 创建2楼以上的窗口(正常重叠)(WS_OVERLAPPED)
  4. 关闭那些2个重叠窗口(桌面或工具窗口的子窗口)
  5. toolwindow跳到记事本窗口后面

有没有人知道这是为什么?或者我可能做错了什么?我会说'窗口bug',但情况很少。

回答问题:

这不是一个对话窗口,而是一个完整的窗口。如果我让它有正确的孩子(即:不是桌面的孩子),孩子的任务栏条目不会出现(可能容易修复),但无论如何,错误仍然会发生。

我已经包含显示问题的示例代码。我希望我只是创建窗口错误或需要回复我没有回应的消息。

在这个例子中,一个工具窗口将打开(没有任务栏条目,这是想要的)。然后你点击那个窗口,一个子窗口就会打开。你点击子窗口,另一个窗口会打开。然后关闭这两个新的子窗口和原始窗口,而不是获得焦点,立即跳转到其他窗口(记事本等)后面。

感谢您的帮助!

示例代码澄清:

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

}

这并不奇怪。事实上,这正是我期望的行为。

你是工具窗口不是跳下来;而记事本正在跳起来。

您关闭了激活窗口。系统将按照z顺序激活次高的顶层窗口。您的工具窗口在这方面不算作*窗口(这是工具窗口意味着什么的一部分)。所以记事本被激活,并且它到达顶部。

如果你想让你的工具窗口被激活,你可能不需要一个工具窗口。

是三个窗口对话框到另一个主窗口或者是他们自己的权利的应用程序?

如果他们是对话窗口,那么我会检查他们的父窗口是否正确分配。

如果它们是应用程序窗口,那么我会检查它们是否出现在任务栏中。

没有关于问题的更多信息,很难给出更有意义的答案。

+0

我已更新该问题以包含更多信息。感谢迄今的回应! – Bob 2008-10-08 13:24:12