मेरे पास कुछ अजीब नियंत्रण है,

CreateWindowEx(!tset&USE?WS_EX_OVERLAPPEDWINDOW:0,
tset&USE?"static":"edit",0,WS_CHILD|WS_VISIBLE|
(!tset&USE?ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL|WS_VSCROLL //when it's edit
:SS_NOTIFY|SS_EDITCONTROL),5,60,390,474,hwnd,HMENU(10),0,0); //when it's static
SetWindowSubclass(GetDlgItem(hwnd,10),tset&USE?BOR:NoMenu,0,0);

जिसका सब कुछ इस बात पर निर्भर करता है कि थीम सक्रिय हैं या नहीं। यहाँ tset बिट फ़्लैग के लिए enum प्रकार का एक उदाहरण है। स्क्रॉलिंग के अलावा सब कुछ ठीक है जब नियंत्रण स्थिर मोड में होता है। इसे WM_MOUSEWHEEL संदेश प्राप्त नहीं हो रहे थे, मैंने इसे निम्न तरीके से प्राप्त किया:

LRESULT CALLBACK BOR(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp,UINT_PTR,DWORD_PTR)
{
    if(msg==WM_MOUSEMOVE&&GetDlgCtrlID(hwnd)==10)
    {
        POINT x{LOWORD(lp),HIWORD(lp)}; ClientToScreen(hwnd,&x);
        RECT rc; GetWindowRect(hwnd,&rc); if(PtInRect(&rc,x)&&GetCapture()!=hwnd){SetCapture(hwnd); hwnd3=SetFocus(hwnd);}
        if(!PtInRect(&rc,x)&&GetCapture()==hwnd){ReleaseCapture(); SetFocus(hwnd3);} //hwnd3 is an instance of HWND defined in global scope, for giving focus back
    }
    if(msg==WM_MOUSEWHEEL)
    {
        RECT rc; GetWindowRect(GetParent(hwnd),&rc);
        HRGN x; GetWindowRgn(GetParent(hwnd),x);
        ScrollWindowEx(hwnd,0,short(HIWORD(wp)),0,0,x,&rc,SW_INVALIDATE|SW_ERASE);
        ShowWindow(GetParent(hwnd),SW_HIDE); ShowWindow(GetParent(hwnd),SW_SHOW);
        SetFocus(hwnd);
        return 1;
    }
    return DefSubclassProc(hwnd,msg,wp,lp);
}

अब जब माउस मेरे नियंत्रण के क्लाइंट क्षेत्र में प्रवेश करता है, यदि यह स्थिर मोड में है, तो यह माउस को पकड़ लेता है और फोकस प्राप्त करता है। तो यह अपने उपवर्ग कॉलबैक फ़ंक्शन में WM_MOUSEWHEEL संदेशों को रोकता है और मैं अपने नियंत्रण को स्थिर मोड में स्क्रॉल कर सकता हूं। यहां सटीक समस्या है: कुछ मिलीसेकंड बाद, इसके पाठ के ठीक बाद स्क्रॉल किया जाता है, विंडो किसी भी तरह अपनी प्रारंभिक अनियंत्रित स्थिति में खुद को अपडेट करती है। और मेरे प्रयास विफल हो जाते हैं। क्या यह स्पष्ट है कि यह ऐसा क्यों व्यवहार करता है, और इसे कैसे ठीक किया जाए?

@ संपादित करें: मैं इसके स्थिर संस्करण में बस WS_VSCROLL क्यों नहीं जोड़ता? क्योंकि इसमें SS_NOTIFY शैली है और मुझे किसी और तरह से WM_COMMAND संदेशों का जवाब देने के लिए इसकी आवश्यकता है। यही कारण है कि मैंने इसे मैन्युअल रूप से स्क्रॉल करने का प्रयास किया।

@अपडेट:

यहां दोनों स्क्रीनशॉट में टेक्स्ट की लंबाई समान है। जब नियंत्रण संपादन स्थिति में होता है, तो इसका लंबवत स्क्रॉलबार उचित होता है। लेकिन जब यह स्थिर स्थिति में होता है तो लंबवत स्क्रॉलबार वास्तविक टेक्स्ट लंबाई से मेल नहीं खाता है। इसके अलावा, स्क्रॉलबार हमेशा एक ही आकार और एक ही स्थिति में पाठ की लंबाई से स्वतंत्र होता है और यह अनियंत्रित भी होता है। ऐसा व्यवहार करने का कारण यह क्यों हो सकता है?

@अपडेट: @enhzflep's comment, समस्या किसी अन्य तरीके से आसानी से हल हो जाती है।

0
user814412 15 जिंदा 2021, 02:29
SS_NOTIFY का उपयोग करने के बारे में क्या आपको WH_VSCROLL का उपयोग करने से रोकता है? उनके मूल्यों में अतिव्यापी बिट्स नहीं हैं, इसलिए आप उन्हें एक साथ उपयोग कर सकते हैं।
 – 
Remy Lebeau
15 जिंदा 2021, 03:04
मैंने देखा कि स्क्रॉलबार सहित, कंटोल के क्लाइंट क्षेत्र पर क्लिक करने से एक WM_COMMAND संदेश भेजा जाता है। और मेरा प्रोग्राम कुछ नियंत्रण छुपाता है और WM_COMMAND STN_CLICKED के साथ प्राप्त होने पर कुछ अन्य नियंत्रण दिखाता है और जब मैं स्क्रॉलबार का उपयोग करता हूं तो मुझे इसकी आवश्यकता नहीं होती है।
 – 
user814412
15 जिंदा 2021, 03:11
आह आपने WH_VSCROLL लिखा, क्षमा करें मैंने इसे WM_VSCROLL के रूप में गलत तरीके से पढ़ा। मैंने अभी तक वर्टिकल स्क्रॉलिंग को हुक करने के बारे में नहीं सोचा है। मैं इसे आजमाउंगा और यहां अपडेट करूंगा। धन्यवाद
 – 
user814412
15 जिंदा 2021, 03:20
1
दिलचस्प लगता है कि उनमें से एक पाठ को स्पष्ट रूप से लपेट रहा है और दूसरा नहीं है। इसे ध्यान में रखते हुए, स्क्रॉल-बार का आकार मुझे अलग नहीं लगता, क्योंकि डार्क इमेज लिपटी हुई है, इसलिए बड़ी संख्या में लाइनें होंगी और इस प्रकार, एक छोटा अंगूठा। चूंकि यह स्थिर प्रतीत होता है जो दुर्व्यवहार कर रहा है, हर समय संपादन नियंत्रण का उपयोग क्यों न करें, केवल अपने केवल-पढ़ने वाले ध्वज को टॉगल करें? यानी, EM_SETREADONLY संदेश का उपयोग करना।
 – 
enhzflep
15 जिंदा 2021, 04:47
1
यह वास्तव में काम किया! मुझे नहीं पता कि मैंने इसके बारे में पहले क्यों नहीं सोचा, धन्यवाद :) समस्या हल हो गई
 – 
user814412
15 जिंदा 2021, 04:56

1 उत्तर

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

अनुत्तरित सूची से प्रश्न को हटाने के हित में, मैं किसी एक टिप्पणी को दोहराऊंगा और उसका विस्तार करूंगा।

छवियों को देखते हुए, हम तुरंत उनके प्रस्तुत किए जाने के तरीके में स्पष्ट अंतर देख सकते हैं। बाईं छवि में प्रत्येक पंक्ति एक अलग वर्ण से शुरू होती है, जबकि दाईं छवि हमेशा एक ही वर्ण से शुरू होती है। स्क्रॉल-बार में उनके अंगूठे भी बहुत अलग आकार के होते हैं।

चूंकि समस्याएं अनिवार्य रूप से एक ही कार्य को प्राप्त करने के लिए दो अलग-अलग नियंत्रणों का उपयोग करने की कोशिश से उत्पन्न होती हैं, इसलिए मैं हमेशा एक संपादन नियंत्रण का उपयोग करने का सुझाव दूंगा। (यह वह है जो अच्छा व्यवहार करता प्रतीत होता है, और वह है जो पाठ को लपेटता नहीं है)

दो अलग-अलग प्रकार के नियंत्रणों का उपयोग करने के बजाय, मैं केवल-पढ़ने के लिए ध्वज को टॉगल करने का सुझाव देता हूं। भाग्य के साथ (!) अब एकमात्र अंतर होगा जिस तरह से माउस और कीबोर्ड संदेशों को संभाला जाता है - उम्मीद है कि आप इस तरह के दृष्टिकोण के साथ समान व्यवहार और उपस्थिति प्राप्त करेंगे। मैं जिस संदेश के बारे में सोच रहा हूं वह इसे प्राप्त करेगा EM_SETREADONLY

हालांकि प्रश्न का सफल उत्तर दिया गया है, मुझे अपने सिद्धांतों का समर्थन करने के लिए माइक्रोसॉफ्ट दस्तावेज़ों में संदर्भ नहीं मिल रहा है, इस प्रकार 'उम्मीद' जैसी भाषा का उपयोग किया जाता है।

2
enhzflep 15 जिंदा 2021, 05:09
उन दोनों में समान लंबाई वाला टेक्स्ट है क्योंकि यह एक ही स्ट्रिंग का कॉपी पेस्ट है, ~ 2500 वर्ण। लेकिन रैपिंग वास्तव में अलग है। वैसे भी, यह अभी इरादा के अनुसार व्यवहार करता है, इसलिए मैंने इस उत्तर को स्वीकृत के रूप में चिह्नित किया। एक बार फिर धन्यवाद
 – 
user814412
15 जिंदा 2021, 05:15