2008-10-06 55 views
0

奇怪的問題: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); 

}

回答

1

這並不奇怪。事實上,這正是我期望的行爲。

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

您關閉了激活窗口。系統將按照z順序激活次高的頂層窗口。您的工具窗口在這方面不算作頂級窗口(這是工具窗口意味着什麼的一部分)。所以記事本被激活,並且它到達頂部。

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

0

是三個窗口對話框到另一個主窗口或者是他們自己的權利的應用程序?

如果他們是對話窗口,那麼我會檢查他們的父窗口是否正確分配。

如果它們是應用程序窗口,那麼我會檢查它們是否出現在任務欄中。

沒有關於問題的更多信息,很難給出更有意義的答案。

+0

我已更新該問題以包含更多信息。感謝迄今的迴應! – Bob 2008-10-08 13:24:12