كيفية الحصول على حجم وموضع أزرار التسمية التوضيحية للنافذة (التصغير والاستعادة والإغلاق)

StackOverflow https://stackoverflow.com/questions/479332

سؤال

هل هناك استدعاء API لتحديد حجم وموضع أزرار التسمية التوضيحية للنافذة؟أحاول رسم أزرار التسميات التوضيحية بنمط فيستا على نافذة رسمها المالك.أنا أتعامل مع c/c++/mfc.

يحرر:هل لدى أي شخص مثال رمزي لرسم زر الإغلاق؟

هل كانت مفيدة؟

المحلول

ولقد وجدت الوظيفة المطلوبة للحصول على موقف من الأزرار في ويندوز فيستا: <لأ href = "https://docs.microsoft.com/en-us/windows/desktop/menurc/wm-gettitlebarinfoex" يختلط = "نوفولو noreferrer"> WM_GETTITLEBARINFOEX

ويظهر هذا الارتباط أيضا مقاييس النظام المطلوبة للحصول على كل التباعد الصحيح (العار انها ليست صورة كاملة الحوار على الرغم من). هذا يعمل تماما في ويندوز فيستا، ومعظمها في XP (في XP هناك الكثير من الفجوة بين الأزرار قليلا).

نصائح أخرى

GetSystemMetrics يعطي كل هذه المعلومات. رسم داخل نافذة الديكور، استخدم GetWindowDC .

ويتم تكييف التعليمة البرمجية التالية من المثال "هوك شريط العناوين العالمية" لقد وجدت في HTTP: // شبكة الاتصالات العالمية .catch22.net / المحتوى / قصاصات . I تعديل المثال لجعلها صديقة للMFC. تقوم بإرجاع X-تنسيق زر شريط العناوين أقصى اليسار ولكن يمكن بسهولة تعديله للعثور على موقف أي من الأزرار.

#define B_EDGE 2

int CMyWindow::CalcRightEdge()
{
 if(GetStyle() & WS_THICKFRAME)
  return GetSystemMetrics(SM_CXSIZEFRAME);
 else
  return GetSystemMetrics(SM_CXFIXEDFRAME);
}


int CMyWindow::findNewButtonPosition()
{
 int   nButSize  = 0;
 DWORD dwStyle   = GetStyle();
 DWORD dwExStyle = GetExStyle();

 if(dwExStyle & WS_EX_TOOLWINDOW)
 {
  int nSysButSize = GetSystemMetrics(SM_CXSMSIZE) - B_EDGE;

  if(GetStyle() & WS_SYSMENU) 
   nButSize += nSysButSize + B_EDGE;

  return nButSize + CalcRightEdge();
 }
 else
 {
  int nSysButSize = GetSystemMetrics(SM_CXSIZE) - B_EDGE;

 // Window has Close [X] button. This button has a 2-pixel
 // border on either size
  if(dwStyle & WS_SYSMENU) 
   nButSize += nSysButSize + B_EDGE;

 // If either of the minimize or maximize buttons are shown,
 // Then both will appear (but may be disabled)
 // This button pair has a 2 pixel border on the left
  if(dwStyle & (WS_MINIMIZEBOX | WS_MAXIMIZEBOX) )
   nButSize += B_EDGE + nSysButSize * 2;

 // A window can have a question-mark button, but only
 // if it doesn't have any min/max buttons
  else if(dwExStyle & WS_EX_CONTEXTHELP)
   nButSize += B_EDGE + nSysButSize;

 // Now calculate the size of the border...aggghh!
  return nButSize + CalcRightEdge();
 }
}

احصل على SystemMetrics يجب أن تساعدك الوظيفة في تحديد الحجم (معلمات SM_CYSIZE وSM_CXSIZE).

يحرر

لست متأكدًا من إمكانية العثور على وظائف بهذه الوظيفة ولكن يمكنك إلقاء نظرة عليها إيمي كود المصدر, ، لقد تمكنوا من إضافة زر إلى التسمية التوضيحية للنافذة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top