इस VB6 लीगेसी सिस्टम में एक विंडो जिसका मैं समर्थन कर रहा हूं, Word 2007 इंस्टेंस को चाइल्ड विंडो< के रूप में होस्ट करता है /ए>. विंडोज 7 पर, पैरेंट विंडो को बिना किसी समस्या के आकार दिया जा सकता है: विंडो तब तक अपडेट नहीं होती जब तक माउस को आकार बदलने के बाद छोड़ दिया जाता है। विंडोज 10 पर, हालांकि, आकार बदलते समय विंडो गतिशील रूप से अपडेट होती है।

विंडोज 10 में मुझे जो समस्या आ रही है, वह यह है कि चाइल्ड वर्ड विंडो पहले अपडेट पर सक्रिय/केंद्रित हो रही है: चाइल्ड विंडो के फोकस होने से पहले आप केवल पैरेंट विंडो को एक बार में दो पिक्सल से आकार देने के लिए खींच सकते हैं। पैरेंट विंडो पर आकार बदलें ईवेंट रद्द कर दिया गया है (कर्सर अभी भी आकार बदलें आइकन पर है, लेकिन निरंतर खींचने का कोई प्रभाव नहीं पड़ता है)। पैरेंट विंडो को अधिकतम करना, छोटा करना और पुनर्स्थापित करना सभी सामान्य रूप से काम करते हैं। एक बार चाइल्ड वर्ड विंडो बंद हो जाने पर (वर्ड में फ़ाइल मेनू के माध्यम से), पैरेंट विंडो को सामान्य रूप से आकार दिया जा सकता है, क्योंकि सक्रिय/फोकस करने के लिए कोई चाइल्ड विंडो नहीं है। वही स्वचालित-चाइल्ड-विंडो-एक्टिवेशन-आफ्टर-पैरेंट-विंडो-रीसाइज़िंग विंडोज 7 में होता है, लेकिन क्योंकि आकार बदलने की घटना तब तक सक्रिय नहीं होती जब तक कि पैरेंट विंडो वास्तव में अपडेट नहीं हो जाती, यह वहां कोई समस्या नहीं है।

मेरी पहेली यह है कि मुझे उस कोड में कुछ भी दिखाई नहीं दे रहा है जो बताता है कि चाइल्ड विंडो स्वचालित रूप से सक्रिय/केंद्रित क्यों हो रही है, जब तक कि यह केवल डिफ़ॉल्ट विंडोज व्यवहार न हो। किसी भी मामले में, मुझे पूरा यकीन है कि मुझे ऐसा नहीं करने के लिए एक तरीका चाहिए।

यह कोड स्पष्ट रूप से कर रहा है (मुख्य रूप से ResizeControls() उप; बाकी यहां ज्यादातर संदर्भ के लिए है) मूल विंडो में कंटेनर के नए आकार के अनुरूप वर्ड विंडो का आकार बदलना/स्थिति बनाना है , जो विंडोज 7 में व्यवहार के अनुरूप है।

मैं जो बता सकता हूं, उससे मुझे विश्वास नहीं होता कि GetWindow() वास्तव में उस विंडो को सक्रिय करता है, जिसके लिए उसे एक हैंडल मिलता है, लेकिन अगर ऐसा होता है, तो इसका कारण यह हो सकता है मुद्दा, इस मामले में मुझे इसे सक्रिय किए बिना खिड़की पर एक हैंडल प्राप्त करने में सक्षम होना चाहिए।

PDFView.frm:

Begin VB.Form frmPDFView
    Caption         =   "Untitled"
    ClientHeight    =   8655
    ClientLeft      =   1320
    ClientTop       =   1665
    ClientWidth     =   9270
    ' ...

    Begin VB.PictureBox picContainer 
        BackColor       =   &H00FFFFFF&
        Height          =   4215
        Left            =   1080
        ScaleHeight     =   4155
        ScaleWidth      =   4995
        TabIndex        =   0
        Top             =   120
        Width           =   5055
    End
End

Private Sub ResizeControls()
On Error Resume Next

    Dim pWndChild As Long
    Dim r As RECT
    Dim rtn As Long

    picContainer.Left = 100
    picContainer.Height = Me.Height - 1300
    picContainer.Width = Me.Width - 350
    picContainer.Top = 300

    pWndChild = GetWindow(picContainer.hWnd, GW_CHILD)
    rtn = GetLastError

    If (pWndChild) Then
        rtn = GetClientRect(picContainer.hWnd, r)
        rtn = SetWindowPos(pWndChild, 0, 0, 0, r.Right - r.Left, r.Bottom - r.Top, SWP_NOZORDER Or SWP_NOMOVE)
    Else
        rtn = GetLastError
    End If

End Sub

Private Sub Form_Resize()
On Error GoTo ERROR_HANDLER

    Call ResizeControls

    Exit Sub

ERROR_HANDLER:
    Err.Clear
    Resume Next

End Sub
2
profezzional 26 मार्च 2020, 22:34

1 उत्तर

सबसे बढ़िया उत्तर

पता चला कि मैं अंधा हूं और/या कोड में उपयोग किए गए विंडोज फ़ंक्शन के सभी के लिए पर्याप्त रूप से दस्तावेज़ीकरण नहीं पढ़ा। अगले दिन समाधान मिला और वापस आकर इसका उत्तर देना भूल गया, लेकिन जैसा कि @wqw के टिप्पणी, समस्या SetWindowPos() के साथ थी। SWP_NOACTIVATE ध्वज आवश्यक लक्ष्य विंडो (मेरे मामले में, चाइल्ड वर्ड विंडो) के सक्रियण को रोकने के लिए SetWindowPos() में पास किया जाना है।

1
profezzional 30 मार्च 2020, 14:53