इस 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
1 उत्तर
पता चला कि मैं अंधा हूं और/या कोड में उपयोग किए गए विंडोज फ़ंक्शन के सभी के लिए पर्याप्त रूप से दस्तावेज़ीकरण नहीं पढ़ा। अगले दिन समाधान मिला और वापस आकर इसका उत्तर देना भूल गया, लेकिन जैसा कि @wqw के टिप्पणी, समस्या SetWindowPos() के साथ थी। SWP_NOACTIVATE ध्वज आवश्यक लक्ष्य विंडो (मेरे मामले में, चाइल्ड वर्ड विंडो) के सक्रियण को रोकने के लिए SetWindowPos() में पास किया जाना है।
संबंधित सवाल
नए सवाल
windows-7
Microsoft विंडोज के पिछले रिलीज के साथ या विंडोज 7 के लिए प्रोग्रामिंग के बारे में प्रश्नों के लिए उपयोग करें। सामान्य सॉफ़्टवेयर या समस्या निवारण प्रश्न सीधे प्रोग्रामिंग से संबंधित नहीं हैं, यह विषय से हटकर है और इसे सुपर उपयोगकर्ता पर पोस्ट किया जाना चाहिए