delphi - बटन को कम करने, अधिकतम करने और बंद करने के तरीके पर होवरिंग कैसे करें?



vcl windows-10 (1)

उच्च डीपीआई ट्रिगर है और यह समाधान की ओर जाता है।

इस मुद्दे को प्रदर्शित करने वाले अनुप्रयोग उच्च डीपीआई नहीं जानते हैं। समस्या को हल करने के लिए समाधान उन्हें 1, 2 या 3 के तहत समाधानों में से किसी एक का उपयोग करके संबंधित संगतता मोड को जागरूक या चालू करना है।

नोट: जब उच्च डीपीआई जागरूकता चालू होती है तो आवेदन का बाकी हिस्सा ठीक से व्यवहार करेगा और आवेदन से आवेदन में अलग होगा।

  1. संगतता मोड के तहत "उच्च डीपीआई सेटिंग्स पर प्रदर्शन स्केलिंग अक्षम करें"

  2. .dpr फ़ाइल में पहली कॉल के रूप में .dpr कॉल करें - जैसा कि इयान बॉयड द्वारा नोट किया गया है, इस फ़ंक्शन को कॉल करने से दौड़ की स्थिति में लीट हो सकती है और पसंदीदा तरीका मैनिफेस्ट का उपयोग कर रहा है। SetProcessDPIAware

  3. true या true/PM सेटिंग के साथ कस्टम मैनिफेस्ट का उपयोग करें ("रनटाइम थीम सक्षम करें" के साथ डिफ़ॉल्ट डेल्फी मेनिफेस्ट उच्च डीपीआई जागरूक नहीं है)

डेल्फी वीसीएल और एफएमएक्स ढांचे के मौजूदा संस्करणों में प्रति मॉनिटर डीपीआई जागरूकता के लिए समर्थन की कमी है, इसलिए यदि आप प्रति मॉनीटर डीपीआई को संभालने में सक्षम हैं तो केवल true/PM प्रकट करें। वीसीएल और फायरमोन्की के रूप में क्यूपी को रिपोर्ट की गई विंडोज 8.1 (और विंडोज 10) के लिए प्रति-मॉनिटर डीपीआई समर्थन की कमी

  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>

या

  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true/PM</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>

अद्यतन करें:

डेल्फी वीसीएल छोटी गाड़ी व्यवहार का स्रोत है, विशेष रूप से समस्या TForm कक्षा या उसके पूर्वजों में कहीं है। जब प्रत्यक्ष विंडोज एपीआई का उपयोग किया जाता है जिसके परिणामस्वरूप विंडोज सामान्य रूप से व्यवहार करते हैं।

विंडोज एपीआई कोड जो ठीक से व्यवहार करता है:

  MessageBox(0, 'Correct', 'Caption', MB_OK); 

  ShowMessage('Correct'); // if themes are enabled -> Windows Task dialog is used

पूर्ण डेल्फी नमूना ऐप जो वीसीएल का उपयोग किये बिना मुख्य विंडो बनाता है - ठीक से व्यवहार करता है

program win;

{$R *.res}

uses
  Windows,
  Messages,
  SysUtils;

var
  Msg: TMSG;
  LWndClass: TWndClass;
  hMainHandle: HWND;

function WindowProc(HWND, Msg: Longint; wParam: wParam; lParam: lParam): Longint; stdcall;
begin
  if Msg = WM_DESTROY then PostQuitMessage(0);
  Result := DefWindowProc(HWND, Msg, wParam, lParam);
end;

begin
  LWndClass.hInstance := hInstance;
  with LWndClass do
    begin
      lpszClassName := 'WinApiWnd';
      Style := CS_PARENTDC or CS_BYTEALIGNCLIENT;
      hIcon := LoadIcon(hInstance, 'MAINICON');
      lpfnWndProc := @WindowProc;
      hbrBackground := COLOR_BTNFACE + 1;
      hCursor := LoadCursor(0, IDC_ARROW);
    end;

  RegisterClass(LWndClass);
  hMainHandle := CreateWindow(LWndClass.lpszClassName, 'Window Title', WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE, 0, 0, 360, 200, 0, 0, hInstance, nil);

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

Misbehaved वीसीएल रूपों:

var
  f: TForm;

  f := CreateMessageDialog('Broken', mtWarning, mbOKCancel, mbOk);
  f.ShowModal;
  f.Free;

  f := TForm.Create(nil);
  f.ShowModal;
  f.Free;

डेल्फी एप्लिकेशन में, जब आप सीमा आइकन पर होवर करते हैं, उदाहरण के लिए:

  • छोटा करना
  • अधिकतम
  • पुनर्स्थापित

यह सही ढंग से व्यवहार नहीं करता है:

एक ऐसे अनुप्रयोग की तुलना करें जो सही तरीके से व्यवहार करे:

पुनरुत्पादन के लिए कदम

  1. फ़ाइल , नया , वीसीएल फॉर्म एप्लीकेशन - डेल्फी पर क्लिक करें
  2. रन (एफ 9) पर क्लिक करें
  3. न्यूनतम, अधिकतम, या बंद बटन पर होवर करें।

कैसे ठीक करना है?

  • विंडोज 10, 64-बिट (डेस्कटॉप पीसी पर मूल रूप से चल रहा है)
  • डेल्फी एक्सई 6

संपादित करें - यह डेल्फी 7 के साथ भी विफल रहता है:

और डेल्फी 5 में:

और डेल्फी 4 में:

मैंने माना (यानी डर था) कि यह ThemeServices इंजन के कारण हुआ था; जहां उन्होंने सोचा होगा कि उपयोगकर्ता की प्राथमिकताओं का सम्मान नहीं करना अच्छा था। लेकिन ऐसा लगता है कि यह कुछ और मौलिक है।

संगतता मोड

  • कोई नहीं : विफल रहता है
  • विंडोज 8 : विफल रहता है
  • विंडोज 7 : विफल रहता है
  • विंडोज विस्टा (सर्विस पैक 2) : विफल रहता है
  • विंडोज विस्टा (सर्विस पैक 2) : विफल रहता है
  • विंडोज विस्टा : विफल रहता है
  • विंडोज एक्सपी (सर्विस पैक 3) (गैर-क्लाइंट क्षेत्र थीमिंग अक्षम): काम करता है
  • विंडोज एक्सपी (सर्विस पैक 2) (गैर-क्लाइंट क्षेत्र थीमिंग अक्षम): काम करता है
  • विंडोज 98 / विंडोज़ मी (गैर-क्लाइंट क्षेत्र थीमिंग अक्षम): काम करता है
  • विंडोज 95 (गैर-क्लाइंट क्षेत्र थीमिंग अक्षम): काम करता है

स्काइप

स्काइप में भी विफल रहता है; डेल्फी में भी लिखा है:

उच्च डीपीआई ट्रिगर है

आखिरकार मुझे पता चला कि यह हर विंडोज 10 मशीन पर क्यों विफल रहता है; लेकिन हर किसी के लिए नहीं। उच्च डीपीआई

अपने डीपीआई को 97 (101%) या उच्चतम पर सेट करें।

पर्याप्त नजदीक

Dalija के समाधान काम करता है:

हम टूलटिप के साथ समस्या को अनदेखा करेंगे और दूसरे दिन लड़ने के लिए जीवित रहेंगे।

यह भी ध्यान दिया जाना चाहिए कि विंडोज 10 सुझाव देगा कि आपको कुछ अनुप्रयोगों के लिए डीपीआई बदलने के बाद सही तरीके से काम करने के लिए साइन आउट करना होगा और साइन ऑन करना होगा। यह निश्चित रूप से डेल्फी के बारे में सच है।

यह भी ध्यान दिया जाना चाहिए कि डेल्फी इस तरह की पीठ के पीछे डीपीआई को बदलना बर्दाश्त नहीं करता है। इसमें ज़ूम स्लाइडर को एडजस्ट करना शामिल है। इसमें प्राथमिक मॉनीटर के अलावा ऐप को किसी मॉनीटर पर रखने में भी शामिल होगा।

और हमने यह नहीं पता कि समस्या क्या है; केवल कई मॉनीटर चलाने वाले उपयोगकर्ताओं के लिए सड़क को लात मार दिया।

क्यूसी बग रिपोर्ट

क्योंकि बोर ... Impr ... CodeG ... Embarca ... Idera की QC साइट पे-वॉल के पीछे है, यहां बग रिपोर्ट की एक प्रति है :

जैसा कि आप देख सकते हैं: कोई परवाह नहीं करता है।





delphi-xe6