2009-12-23 9 views
16

मैं इस तरह कोड लिखने में सक्षम होना चाहता हूँ:मैं विंडो के क्लाइंट रेक्ट के सापेक्ष नियंत्रण की स्थिति कैसे प्राप्त करूं?

HWND hwnd = <the hwnd of a button in a window>; 
int positionX; 
int positionY; 
GetWindowPos(hwnd, &positionX, &positionY); 
SetWindowPos(hwnd, 0, positionX, positionY, 0, 0, SWP_NOZORDER | SWP_NOSIZE); 

और यह कुछ भी नहीं है। हालांकि, मैं बाहर काम नहीं कर सकता है कि कैसे एक GetWindowPos() समारोह है कि मुझे सही इकाइयों में जवाब देता देता है लिखने के लिए:

void GetWindowPos(HWND hWnd, int *x, int *y) 
{ 
    HWND hWndParent = GetParent(hWnd); 

    RECT parentScreenRect; 
    RECT itemScreenRect; 
    GetWindowRect(hWndParent, &parentScreenRect); 
    GetWindowRect(hWnd, &itemScreenRect); 

    (*x) = itemScreenRect.left - parentScreenRect.left; 
    (*y) = itemScreenRect.top - parentScreenRect.top; 
} 

अगर मैं इस सुविधा का उपयोग, मैं निर्देशांक कि के सापेक्ष हैं पाने के ऊपरी बाएं भाग माता पिता की खिड़की, लेकिन SetWindowPos() शीर्षक पट्टी के नीचे वाले क्षेत्र के सापेक्ष निर्देशांक चाहता है (मुझे लगता है कि यह "क्लाइंट एरिया" है, लेकिन Win32 शब्दावली मेरे लिए बिल्कुल नया है)।

समाधान यह काम कर GetWindowPos() समारोह (धन्यवाद Sergius) है:

void GetWindowPos(HWND hWnd, int *x, int *y) 
{ 
    HWND hWndParent = GetParent(hWnd); 
    POINT p = {0}; 

    MapWindowPoints(hWnd, hWndParent, &p, 1); 

    (*x) = p.x; 
    (*y) = p.y; 
} 
+0

क्या यह एक विंडो अनुप्रयोग है –

+0

यह कैसे काम करता है, डायरेक्टएक्स का उपयोग क्या है। डायरेक्टएक्स में न्यूबी। मैंने यह –

+0

करने के लिए अपना स्वयं का कार्य किया है हां यह एक विंडोज़ एप्लीकेशन है, इसलिए Win32 api का उपयोग। – Andy

उत्तर

17

कोशिश GetClientRect उपयोग करने के लिए निर्देशांक पाने के लिए और MapWindowPoints बदलने के लिए।

1

मुझे लगता है कि यू ऐसा ही कुछ करना चाहते हैं। मैं नियंत्रण खोजने के लिए गर्म नहीं जानता। कोड का यह खंड फॉर्म के आकार के अनुसार विंडो फॉर्म के केंद्र में एक लेबल की स्थिति को आवंटित करता है।

AllignLabelToCenter(lblCompanyName, frmObj) 


Public Sub AllignLabelToCenter(ByRef lbl As Label, ByVal objFrm As Form) 
     Dim CenterOfForm As Short = GetCenter(objFrm.Size.Width) 
     Dim CenterOfLabel As Short = GetCenter(lbl.Size.Width) 
     lbl.Location = New System.Drawing.Point(CenterOfForm - CenterOfLabel, lbl.Location.Y) 
    End Sub 
    Private ReadOnly Property GetCenter(ByVal obj As Short) 
     Get 
      Return obj/2 
     End Get 
    End Property 
+0

यह वास्तव में उपयोगी नहीं है क्योंकि Win32 (या कम से कम, मुझे जो भी मिला है) में "लोलेशन" संपत्ति के बराबर नहीं है। – Andy

+0

मैंने कभी Win32 का उपयोग नहीं किया। यदि आपको कोई समाधान मिलता है, तो कृपया मुझे यह भी बताएं –

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

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