WS_EX_TOOLWINDOW ينتقل إلى الخلفية عند تدمير النافذة

StackOverflow https://stackoverflow.com/questions/175738

  •  05-07-2019
  •  | 
  •  

سؤال

مسألة غريبة:

  1. افتح نافذة المفكرة الكبيرة
  2. إنشاء نافذة أدوات (نمط WS_EX_TOOLWINDOW)
  3. إنشاء نافذتين إضافيتين (متداخلتان بشكل عادي) (WS_OVERLAPPED)
  4. أغلق هاتين النافذتين المتداخلتين (التابع لسطح المكتب أو نافذة الأدوات)
  5. تقفز نافذة الأداة خلف نافذة المفكرة

هل أحد يعرف لماذا هذا هو الحال؟أو ما يمكن أن أفعله خطأ؟أود أن أقول "خلل في النوافذ"، لكن هذا نادرًا ما يحدث.

للإجابة على الأسئلة:

إنها ليست نافذة حوار، بل نافذة كاملة.إذا جعلته لديه أطفال صحيحون (على سبيل المثال:ليس تابعًا لسطح المكتب)، لا يظهر إدخال شريط المهام للأطفال (ربما يمكن إصلاحه بسهولة)، ولكن في كلتا الحالتين، لا يزال الخطأ يحدث.

لقد قمت بتضمين رمز المثال الذي يوضح المشكلة.آمل أن أكون قد قمت بإنشاء النافذة بشكل خاطئ أو كنت مطالبًا بالرد على رسالة لا أرد عليها.

في هذا المثال، سيتم فتح نافذة أداة (لا يوجد إدخال لشريط المهام، وهو ما هو مطلوب).ثم تنقر على تلك النافذة، سيتم فتح نافذة فرعية.تنقر على النافذة الفرعية، سيتم فتح نافذة أخرى.ثم أغلق كلاً من النوافذ الفرعية الجديدة والنافذة الأصلية، وبدلاً من التركيز، انتقل فورًا إلى خلف النوافذ الأخرى (المفكرة، إلخ).

شكرا على اي مساعدة!

مثال على الكود للتوضيح:

// 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.لا تعتبر نافذة الأداة الخاصة بك كنافذة المستوى الأعلى في هذا الصدد (وهذا جزء مما يعنيه كونك نافذة أداة).لذلك يتم تنشيط برنامج "المفكرة"، ويأتي إلى الأعلى.

إذا كنت تريد تنشيط نافذة الأداة بدلاً من ذلك، فمن المحتمل أنك لا تريد نافذة الأداة حقًا.

نصائح أخرى

هل مربعات حوار النوافذ الثلاث تنتمي إلى نافذة رئيسية أخرى أم أنها تطبيقات في حد ذاتها؟

إذا كانت عبارة عن نوافذ حوار، فسأتأكد من تعيين نافذتها الأصلية بشكل صحيح.

إذا كانت عبارة عن نوافذ تطبيقات، فسأتحقق من ظهورها في شريط المهام.

وبدون مزيد من المعلومات حول المشكلة، من الصعب إعطاء إجابة ذات معنى أكبر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top