2015-12-22 6 views
7

ich einige Probleme mit dem Fenster erstreckt Rahmen unter Verwendung DwmExtendFrameIntoClientArea unter Windows 10. Die Bilder unten zeigen das Verhalten Ich erhalte:DwmExtendFrameIntoClientArea seltsames Verhalten auf 10 Windows-

enter image description here

Die weiße Farbe ist titlebar von oben und von den Seiten und von der Unterseite erstreckt sich der farbige Rand des Fensters.

Wenn ich die Ränder alle -1 setze den Rahmen der ganzen Weg zu verlängern, wird das Fenster mit weißen gefüllt und verliert seine farbigen Ränder zusammen:

enter image description here

Dieses Ergebnis sehr inkonsistent ist, bin ich Es wird erwartet, dass die weiße Farbe an allen Seiten des Fensters erweitert wird, ähnlich wie bei Windows 8 der farbige Rahmen oder bei Windows 7 und Vista das Glas erweitert wird.

Ich habe versucht, online zu suchen, aber ich konnte keine ähnlichen Probleme finden.

Hier ist der Code, ich verwende:

#include <windows.h> 
#include <dwmapi.h> 
#include <stdio.h> 

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 

int main(int argc, char **argv) 
{ 

    HINSTANCE hInstance = GetModuleHandle(NULL); 
    MSG msg;  
    HWND hwnd; 
    WNDCLASSW wc; 
    int message; 

    wc.style   = CS_HREDRAW | CS_VREDRAW; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.lpszClassName = L"Window"; 
    wc.hInstance  = hInstance; 
    wc.hbrBackground = GetStockObject(BLACK_BRUSH); 
    wc.lpszMenuName = NULL; 
    wc.lpfnWndProc = WndProc; 
    wc.hCursor  = LoadCursor(NULL, IDC_ARROW); 
    wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 

    RegisterClassW(&wc); 
    hwnd = CreateWindowW(wc.lpszClassName, L"Window", 
         WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
         100, 100, 350, 250, NULL, NULL, hInstance, NULL); 

    ShowWindow(hwnd, SW_SHOW); 
    UpdateWindow(hwnd); 

    while(1) { 
     message = GetMessageW(&msg, NULL, 0, 0); 
     if(message == -1) 
     { 
      char x[100]; 
      FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 
          MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), x, 100, NULL); 
      puts(x); 
      abort(); 
     } 
     else if(message == 0) break; 

     TranslateMessage(&msg); 
     DispatchMessageW(&msg); 
    } 

    return (int) msg.wParam; 
} 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
     case WM_ACTIVATE: 
     { 
      MARGINS m = {50, 50, 50, 50}; 
      HRESULT hr = DwmExtendFrameIntoClientArea(hwnd, &m); 
      if(!SUCCEEDED(hr)) 
      { 
       char x[100]; 
       FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 
           MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), x, 100, NULL); 
       puts(x); 
       abort(); 
      } 
      break; 
     } 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      return 0;  
    } 

    return DefWindowProcW(hwnd, msg, wParam, lParam); 
} 

Bin ich etwas falsch zu machen oder ist das nur ein Problem mit Windows 10? Vielen Dank im Voraus für jede Hilfe!

Bearbeiten: Der Code, den ich gepostet habe, funktioniert perfekt mit Aero Lite und den kontrastreichen Designs unter Windows 10, aber nicht mit dem Standard-Windows 10-Design.

+0

Fast eine gute Frage. Außer, die Frage fehlt. Bitte erläutern Sie, was das erwartete Ergebnis sein sollte. – IInspectable

+1

Ich erwarte, dass es einfach die weiße Farbe der Titelleiste erweitert, ähnlich wie der farbige Rahmen auf Windows 8 oder das Glas auf Windows 7 & Vista erweitert wird. Derzeit ist das Ergebnis inkonsistent und sieht nur hässlich aus. – YmFzZTY0

+0

Bitte [bearbeiten] (http://stackoverflow.com/posts/34414751/edit) Ihre Frage, um diese Informationen aufzunehmen. – IInspectable

Antwort

1

Wenn der Rahmen in den Client-Bereich erweitert wurde, müssen Sie sicherstellen, dass Ihre Client-Bereich Lackverfahren schwarz überall rein zieht die Glas sein sollte.

Von MSDN:

Der einfachste Weg, um sicherzustellen, dass die erweiterten Rahmen sichtbar sind, ist die gesamte Client-Region schwarz zu malen. Um dies zu erreichen, initialisieren Sie das hbrBackground Mitglied Ihrer WNDCLASS oder WNDCLASSEX Struktur an den Griff der Lager BLACK_BRUSH. Das folgende Bild zeigt den gleichen Standardrahmen (links) und erweiterten Rahmen (rechts) wie zuvor gezeigt. Diesmal wird jedoch hbrBackground auf den BLACK_BRUSH-Handle gesetzt, der von der GetStockObject-Funktion erhalten wird.

enter image description here

bearbeiten: Ich habe versucht, Ihr Arbeitsprogramm möglichst genau zu reproduzieren:

program ScratchProgram; 

uses 
    Windows, 
    Messages, 
    DwmApi, 
    UxTheme; 

{ Window Procedure } 
function WndProc(hWnd: HWND; uiMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; 
var 
    m: TMargins; 
begin 
    case uiMsg of 
    WM_ACTIVATE: 
     begin 
      m.cxLeftWidth := 50; 
      m.cxRightWidth := 50; 
      m.cyTopHeight := 50; 
      m.cyBottomHeight := 50; 
      DwmExtendFrameIntoClientArea(hWnd, m); 
     end; 
    WM_DESTROY: 
     begin 
      PostQuitMessage(0); 
      Result := 0; 
      Exit; 
     end; 
    end; 

    Result := DefWindowProc(hWnd, uiMsg, wParam, lParam); 
end; 

function WinMain(hInstance: HINST; hPrevInstance: HINST; lpCmdLine: PChar; nShowCmd: Integer): Integer; stdcall; 
var 
    wc: WNDCLASS; 
    msg: TMSG; 
    hWindow: HWND; 
    instance: HINST; 
begin 
    instance := GetModuleHandle(nil); 

    wc.style := CS_HREDRAW or CS_VREDRAW; 
    wc.cbClsExtra := 0; 
    wc.cbWndExtra := 0; 
    wc.lpszClassName := 'Window'; 
    wc.hInstance := instance; 
    wc.hbrBackground := GetStockObject(BLACK_BRUSH); 
    wc.lpszMenuName := nil; 
    wc.lpfnWndProc := @WndProc; 
    wc.hCursor := LoadCursor(0, IDC_ARROW); 
    wc.hIcon := LoadIcon(0, IDI_APPLICATION); 

    RegisterClass(wc); 

    hWindow := CreateWindow(
      wc.lpszClassName,     // Class Name 
      'Window',       // Title 
      WS_OVERLAPPEDWINDOW or WS_VISIBLE, // Style 
      100, 100,       // Position 
      350, 250,       // Size 
      0,         // Parent 
      0,         // No menu 
      instance,       // Instance 
      nil);        // No special parameters 

    ShowWindow(hWindow, SW_SHOW); 

    while (GetMessage(msg, 0, 0, 0)) do 
    begin 
     TranslateMessage(msg); 
     DispatchMessage(msg); 
    end; 

    Result := 0; 
end; 

begin 
    WinMain(hInstance, hPrevInst, CmdLine, CmdShow); 
end. 

Und es funktioniert für mich:

enter image description here

Was auch immer das Problem ist , der Code sieht nicht konzeptionell falsch aus.

Vielleicht Aufrufkonventionen, oder ein Fehler, wo man es nicht erwarten (RegisterClass zum Beispiel, oder die Verwendung von GetModuleHandle über die Instanz-Handle zu WinMain weitergegeben, oder rufen DwmExtendFrameIntoClientArea selbst wenn das Formular deaktiviert wird).

+0

Ich setze den Hintergrund auf Schwarz. In dem Code in meiner Frage Zeile 21: 'wc.hbrBackground = GetStockObject (BLACK_BRUSH);' – YmFzZTY0

+2

Sie verwenden das Aero Lite-Design. Ich habe gerade meinen Code getestet und es funktioniert perfekt mit dem Aero Lite-Thema, aber immer noch nicht mit dem Standardthema. – YmFzZTY0