문제

이상한 문제 :

  1. 큰 메모장 창을 엽니 다
  2. Toolwindow 만들기 (스타일 WS_EX_TOOLWINDOW)
  3. 2 개의 창을 더 만듭니다 (정상 중첩) (ws_overlapp)
  4. 2 개의 겹쳐진 창 (데스크탑의 자식 또는 도구 와인 DO)을 닫으십시오.
  5. Toolwindow는 메모장 창 뒤로 점프합니다

왜 이것이 왜 그런지 아는 사람이 있습니까? 아니면 내가 뭘 잘못했는지? 나는 '창에서 버그'라고 말하지만 그것은 거의 그렇지 않습니다.

질문에 답하기 위해 :

대화 창이 아니라 전체 창입니다. 내가 올바른 자녀를두면 (즉, 데스크탑의 자녀가 아님), 어린이를위한 작업 표시 줄 항목은 나타나지 않지만 (쉽게 고칠 수있을 것입니다), 버그는 여전히 발생합니다.

문제를 보여주는 예제 코드를 포함 시켰습니다. 나는 단지 창을 잘못 만들거나 응답하지 않는 메시지에 응답해야하기를 바라고 있습니다.

이 예에서는 공구 창이 열립니다 (작업 막대 항목 없음이 필요합니다). 그런 다음 해당 창을 클릭하면 하위 바람이 열립니다. 하위 바람을 클릭하면 다른 창이 열립니다. 그런 다음 새 하위 원형과 원래 창을 모두 닫는 대신에 초점을 맞추는 대신 다른 창 뒤로 바로 점프합니다 (메모장 등).

도움을 주셔서 감사합니다!

명확히 할 코드 예제 :

// 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-Order에서 다음으로 가장 높은 최상위 창을 활성화 할 것입니다. 이와 관련하여 도구 창은 최상위 창으로 계산되지 않습니다 (이는 공구 창이 의미하는 것의 일부입니다). 따라서 메모장이 활성화되어 정상에 올 것입니다.

도구 창이 대신 활성화되기를 원한다면 실제로 도구 창을 원하지 않을 것입니다.

다른 팁

세 개의 Windows 대화 상자는 다른 기본 창에 대한 대화입니까, 아니면 자체적으로 응용 프로그램입니까?

대화 창인 경우 부모 창이 올바르게 할당되어 있는지 확인합니다.

그들이 응용 프로그램 창인 경우 작업 표시 줄에 나타나는지 확인합니다.

문제에 대한 자세한 정보가 없으면 더 의미있는 답변을 제공하기가 어렵습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top