2015-12-22 24 views
7

मैं कुछ परेशानी खिड़की का विस्तार विंडोज 10 पर DwmExtendFrameIntoClientArea का उपयोग कर फ्रेम हो रही है नीचे दी गई छवियों व्यवहार मैं हो रही है दिखाने:DwmExtendFrameIntoClientArea अजीब व्यवहार

enter image description here

सफेद शीर्षक पट्टी रंग है ऊपर से बढ़ाया गया है, जबकि किनारों से और नीचे यह खिड़की के रंगीन किनारे को फैलाता है।

अगर मैं मार्जिन -1 करने के लिए सभी सेट फ्रेम सभी तरह का विस्तार करने, खिड़की सफेद से भरा है और पूरी तरह से अपने रंग धार खो देता है:

enter image description here

यह परिणाम है बहुत असंगत, मैं गया था खिड़की के सभी किनारों पर सफेद रंग को विस्तारित करने की उम्मीद है, जिस तरह से विंडोज 8 में रंगीन फ्रेम बढ़ाया जाता है, या ग्लास विंडोज 7 और Vista में बढ़ाया जाता है।

मैंने ऑनलाइन खोज करने की कोशिश की है, लेकिन मुझे कोई भी समान समस्या नहीं मिली है।

यहाँ है कोड मैं उपयोग कर रहा हूँ:

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

मैं कुछ गलत कर रहा हूँ या यह सिर्फ विंडोज 10 के साथ एक मुद्दा है? किसी भी सहायता के लिए अग्रिम रूप से धन्यवाद!

संपादित करें: मैंने जो कोड पोस्ट किया है वह एरो लाइट और विंडोज 10 पर उच्च विपरीत विषयों दोनों के साथ पूरी तरह से काम करता है, लेकिन डिफ़ॉल्ट विंडोज 10 थीम के साथ नहीं।

+0

लगभग एक अच्छा सवाल है। सिवाय, सवाल गुम है। कृपया समझाएं, अपेक्षित परिणाम क्या होना चाहिए। – IInspectable

+1

मुझे उम्मीद है कि यह शीर्षक बार के सफेद रंग को विस्तारित करने के लिए, विंडोज 8 पर रंगीन फ्रेम कैसे बढ़ाया गया है, या विंडोज 7 और विस्टा पर ग्लास। वर्तमान में परिणाम असंगत है और सिर्फ बदसूरत लग रहा है। – YmFzZTY0

+0

कृपया इस जानकारी को शामिल करने के लिए [संपादित करें] (http://stackoverflow.com/posts/34414751/edit)। – IInspectable

उत्तर

1

जब फ्रेम क्लाइंट क्षेत्र में बढ़ा दिया गया है, तो आप यह सुनिश्चित करें कि अपने ग्राहक क्षेत्र पेंट प्रक्रिया शुद्ध काला कहीं भी कांच होना चाहिए ड्रॉ करने की जरूरत है।

MSDN से:

सबसे आसान तरीका यह सुनिश्चित करें कि विस्तारित फ्रेम दिखाई दे रहे हैं पेंट करने के लिए पूरे ग्राहक क्षेत्र काला है। इसे पूरा करने के लिए, hbrBackground अपने WNDCLASS या WNDCLASSEX संरचना के स्टॉक को BLACK_BRUSH के संचालन में प्रारंभ करें। निम्न छवि पहले दिखाए गए समान मानक फ्रेम (बाएं) और विस्तारित फ्रेम (दाएं) को दिखाती है। इस बार, हालांकि, hbrBackgroundGetStockObject फ़ंक्शन से प्राप्त BLACK_BRUSH हैंडल पर सेट है।

enter image description here

संपादित: मैं से यथासंभव अपने खरोंच कार्यक्रम पुन: पेश करने की कोशिश की:

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. 

और यह मेरे लिए काम करता है:

enter image description here

जो कुछ भी यह समस्या है , कोड अवधारणात्मक रूप से गलत नहीं दिखता है।

शायद बुला सम्मेलनों, या एक विफलता जहां आप इसे की उम्मीद नहीं है (उदाहरण के लिए RegisterClass, या उदाहरण के ऊपर GetModuleHandle के उपयोग WinMain को पारित कर दिया, या DwmExtendFrameIntoClientArea बुला भी जब प्रपत्र निष्क्रिय किया जा रहा है संभाल)।

+0

मैं पृष्ठभूमि को काले रंग में सेट कर रहा हूं। मेरे प्रश्न में कोड में, लाइन 21: 'wc.hbrBackground = GetStockObject (BLACK_BRUSH);' – YmFzZTY0

+2

आप एयरो लाइट थीम का उपयोग कर रहे हैं। मैंने अभी अपना कोड परीक्षण किया है और यह एरो लाइट थीम के साथ भी पूरी तरह से काम करता है, लेकिन फिर भी मानक थीम के साथ नहीं। – YmFzZTY0

संबंधित मुद्दे