popupwindow vs overlappedwindow : positions und größenunterschied



  • hallo leute

    bin grad ueber etwas gestolpert, was mir bisher noch nie aufgefallen war:
    abhängig welchen style ich bei createwindowex beim erstellen eines non-child fensters verwende ist die position und größe unterschiedlich.

    hab 2 fenster erstellt. einmal mit WS_POPUPWINDOW und einmal mit WS_OVERLAPPEDWINDOW.

    schaut folgend aus:
    http://komports.de/overlapped_vs_popup.jpg
    das untere ist das mit POPUPWINDOW erstellte fenster.
    das einzige was da also übereinstimmt ist der TOP wert.
    habe mir noch zusätzlich mit GetWindowRect die maße der fenster geholt.
    sieht man rechts daneben in der messagebox: sind angeblich gleich.

    was ist da los und warum ist das so ?

    hier der source den ich dafür verwendet hab:

    #include <windows.h>
    
    auto WINAPI WindowProc1(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) -> LRESULT;
    auto WINAPI WindowProc2(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) -> LRESULT;
    
    auto WINAPI WinMain(HINSTANCE hins, HINSTANCE, char*, int) -> int
    {
       WNDCLASSEX wc{0};
       wc.cbSize = sizeof(wc);
       wc.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
       wc.hCursor = LoadCursorW(0, IDC_ARROW);
       wc.hIcon = LoadIconW(0, IDI_APPLICATION);
       wc.hIconSm = wc.hIcon;
       wc.hInstance = hins;
       wc.lpfnWndProc = WindowProc1;
       wc.lpszClassName = L"test1";
       wc.style = CS_VREDRAW | CS_HREDRAW;
       RegisterClassExW(&wc);
    
       HWND w1 = CreateWindowExW(0, L"test1", L"Test1", WS_POPUPWINDOW, 100, 100, 500, 300, 0, 0, hins, 0);
    
       wc.lpszClassName = L"test2";
       wc.lpfnWndProc = WindowProc2;
       RegisterClassExW(&wc);
    
       HWND w2 = CreateWindowExW(0, L"test2", L"Test2", WS_OVERLAPPEDWINDOW, 100, 100, 500, 300, 0, 0, hins, 0);
    
       ShowWindow(w1, SW_SHOW);
       UpdateWindow(w1);
       ShowWindow(w2, SW_SHOW);
       UpdateWindow(w2);
    
       char buffer[100];
       RECT r1, r2;
       GetWindowRect(w1, &r1);
       GetWindowRect(w2, &r2);
       sprintf(buffer, "test1: [%d, %d, %d, %d]\r\ntest2: [%d, %d, %d, %d]", 
                         r1.left, r1.top, r1.right, r1.bottom, r2.left, r2.top, r2.right, r2.bottom);
    
       MessageBoxA(0, buffer, "Message", MB_OK);
    
       MSG msg;
    
       while(GetMessage(&msg, 0, 0, 0) != 0)
       {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
       }
    
       return 0;
    }
    
    auto WINAPI WindowProc1(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) -> LRESULT
    {
       switch(msg)
       {
          case WM_NCDESTROY:
             PostQuitMessage(0);
    
          default: break;
       }
    
       return DefWindowProcW(hwnd, msg, wparam, lparam);
    }
    
    auto WINAPI WindowProc2(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) -> LRESULT
    {
       switch(msg)
       {
          case WM_NCDESTROY:
             PostQuitMessage(0);
    
          default: break;
       }
    
       return DefWindowProcW(hwnd, msg, wparam, lparam);
    }
    

    Meep Meep



  • Also bei mir unter Windows 8 haben beide die gleiche Größe und Position.



  • hab hier Windows 10 und VS 2015


  • Mod

    Die "Rahmen" sind gleich dick, werden aber in dem anderen Stil mit einem Schatten umgeben, der teilweise durchsichtig ist.



  • versteh ich das richtig, das der schatten mit zum fenster gehört ?


  • Mod

    So wie ich das sehe ja.


Anmelden zum Antworten