2008-09-14 38 views
8

मैं पुराने स्कूल ड्राइंग कर रहा हूँ (unthemed - थीम पर आधारित रेडियो एक पूरी अन्य समस्या कर रहे हैं) के बटन भाग का आकार निर्धारित करने के लिए अपने आप को रेडियो बटन का उपयोग कर DrawFrameControl:कैसे एक Windows रेडियो बटन

DrawFrameControl(dc, &rectRadio, DFC_BUTTON, isChecked() ? DFCS_BUTTONRADIO | DFCS_CHECKED : DFCS_BUTTONRADIO); 

मैंने आरईसीटी के लिए क्या पास करना है, यह जानने के लिए कभी भी एक निश्चित अग्नि मार्ग नहीं पता चला। मैं एक 12x12 आयताकार का उपयोग कर रहा हूं लेकिन मुझे विंडोज़ पसंद है कि मुझे रेडियो बटन का आकार बताएं।

DrawFrameControl रेडियो पास को पार करने के लिए रेडियो बटन को स्केल करने लगता है, इसलिए मुझे स्क्रीन पर अन्य (गैर-मालिक तैयार) रेडियो से रेडियो के "दाएं" आकार के करीब होना चाहिए।

कोई भी यह कैसे जानता है?

उत्तर

2

यह कुछ समय हो गया है क्योंकि मैंने इस पर काम किया है, इसलिए मैं जो वर्णन कर रहा हूं वह है जो मैंने किया है, और यह आवश्यक रूप से प्रश्न का सीधा जवाब नहीं है।

मुझे 12 x 12 के बजाय बिट मैप्स 13 x 13 का उपयोग करना होता है। चेक बॉक्स का बिटमैप भाग WM_DRAWITEM में पारित होने लगता है। हालांकि, मैंने WM_MEASUREITEM भी स्थापित किया था और इसे वही मान खिलाया था, इसलिए मेरा उत्तर सही दार्शनिक अर्थ में "प्रश्न पूछना" हो सकता है।

 
     case WM_MEASUREITEM: 
      lpmis = (LPMEASUREITEMSTRUCT) lParam; 

      lpmis->itemHeight = 13; 
      lpmis->itemWidth = 13; 

      break; 


     case WM_DRAWITEM: 
      lpdis = (LPDRAWITEMSTRUCT) lParam; 
      hdcMem = CreateCompatibleDC(lpdis->hDC); 



      if (lpdis->itemState & ODS_CHECKED) // if selected 
       { 
       SelectObject(hdcMem, hbmChecked); 
       } 
      else 
       { 
       if (lpdis->itemState & ODS_GRAYED) 
        { 
        SelectObject(hdcMem, hbmDefault); 
        } 
       else 
        { 
        SelectObject(hdcMem, hbmUnChecked); 
        } 
       } 
      StretchBlt(
       lpdis->hDC,   // destination DC 
       lpdis->rcItem.left, // x upper left 
       lpdis->rcItem.top, // y upper left 

       // The next two lines specify the width and 
       // height. 
       lpdis->rcItem.right - lpdis->rcItem.left, 
       lpdis->rcItem.bottom - lpdis->rcItem.top, 
       hdcMem, // source device context 
       0, 0,  // x and y upper left 
       13,  // source bitmap width 
       13,  // source bitmap height 
       SRCCOPY); // raster operation 

      DeleteDC(hdcMem); 
      return TRUE; 

यह दोनों Win2000 और XP के लिए अच्छी तरह से काम करने लगता है हालांकि मैं एनबीओ विचार विस्टा क्या कर सकता है।

यह देखने के लिए एक प्रयोग के लायक हो सकता है कि WM_MEASUREITEM क्या छोड़ रहा है, हालांकि मुझे आमतौर पर पुराने कोड के साथ पता चलता है कि मुझे आमतौर पर अनावश्यक दिखने के लिए पूरी तरह से अच्छा कारण था।

4

यह पृष्ठ नियंत्रण के लिए कुछ आकार देने दिशानिर्देश दिखाता है। ध्यान दें कि आकार आप एक संवाद है या नहीं पर नियंत्रण दे रहे हैं, इस आधार पर दोनों DLU (संवाद इकाइयों) और पिक्सेल में दिया जाता है,:

http://msdn.microsoft.com/en-us/library/aa511279.aspx#controlsizing

मैंने सोचा था कि GetSystemMetrics एपीआई के लिए मानक आकार वापस कर सकती है कुछ सामान्य नियंत्रण, लेकिन मुझे कुछ भी नहीं मिला। आकार निर्धारित करने के लिए एक सामान्य नियंत्रण विशिष्ट API हो सकता है।

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