2015-12-22 24 views
7

aşağıda görüntüleri alıyorum davranışı göstermek, Windows 10 üzerinde DwmExtendFrameIntoClientArea kullanarak çerçeveleri pencere uzanan bazı sorun yaşıyorum:DwmExtendFrameIntoClientArea garip davranışlar

enter image description here

beyaz başlık çubuğu rengi Üst taraftan genişletilmiş, yandan ve alttan ise pencerenin renkli kenarını genişletir. Çerçeveler uzanmasına marjları -1 tüm ayarlanırsa

, pencere beyaz ile doldurulur ve tamamen kendi renkli yitirerek:

enter image description here

, çok tutarsız Bu sonuç idi Pencerenin her iki tarafında uzatılacak beyaz rengin, renkli çerçevenin Windows 8'de genişletilme şekline benzer şekilde veya camın Windows 7 ve Vista'da genişletilmesi bekleniyor.

İnternet'te arama yapmayı denedim, ancak benzer sorunları bulamadık. İşte

ben kod kullanıyorum edilir:

#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); 
} 

Yanlış bir şey yapıyor veya Windows 10 ile bu sadece bir konudur muyum? Herhangi bir yardım için şimdiden teşekkür ederiz!

Düzenleme: Gönderdiğim kod, Windows 10'daki hem Aero Lite hem de yüksek kontrast temalarıyla mükemmel çalışır, ancak varsayılan Windows 10 temasıyla uyumlu değildir. Çerçeve istemci alanına uzatıldı zaman

+0

Neredeyse iyi bir soru. Bunun dışında soru eksik. Lütfen, beklenen sonucun ne olduğunu açıklayınız. – IInspectable

+1

Başlık çubuğunun beyaz rengini, renkli çerçevenin Windows 8'de nasıl genişletildiğine veya Windows 7 ve Vista'daki camlara benzer şekilde genişletmesini bekliyorum. Şu anda sonuç tutarsız ve sadece çirkin görünüyor. – YmFzZTY0

+0

Lütfen bu bilgiyi eklemek için sorunuz [düzenle] (http://stackoverflow.com/posts/34414751/edit). – IInspectable

cevap

1

, istemci alanı boya prosedürü siyah yerde cam olmalıdır saf çizer emin olmak gerekir. MSDN itibaren

:

kolay yolu genişletilmiş çerçeveler görünür olmasını sağlamak için tüm istemci bölge siyah boya sağlamaktır. Bunu başarmak için, WNDCLASS veya WNDCLASSEX yapınızın üyesini üyesini BLACK_BRUSH stoğunun tanıtıcısına sıfırlayın. Aşağıdaki görüntü, daha önce gösterilen standart çerçeve (sol) ve genişletilmiş çerçeve (sağ) gösterir. Ancak, bu kez hbrBackground, GetStockObject işlevinden elde edilen BLACK_BRUSH tanıtıcısına ayarlanır.

Düzenleme

enter image description here

: Ben mümkün olduğunca yakından çizilmeye programını yeniden çalıştı:

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. 

Ve benim için çalışıyor:

enter image description here

ne olursa olsun problem şu Kod, kavramsal olarak yanlış görünmüyor.

Belki arama kuralları, ya da bunu beklemeyin bir başarısızlık (örneğin RegisterClass veya örneğinin üzerinde GetModuleHandle kullanımı WinMain geçirilen veya form devre dışı ediliyor olsa bile DwmExtendFrameIntoClientArea arayarak tanıtıcı).

+0

Arka planı siyah olarak ayarlıyorum. Benim sorudaki kodda, satır 21: 'wc.hbrBackground = GetStockObject (BLACK_BRUSH);' – YmFzZTY0

+2

Aero Lite temasını kullanıyorsunuz. Sadece kodumu test ettim ve Aero Lite temasıyla da mükemmel bir şekilde çalışıyor, ancak yine de standart tema ile çalışmıyor. – YmFzZTY0

İlgili konular