هل تريد إزالة الرمز من أشرطة عناوين Windows دون التخلص من زر الإغلاق أو قائمة النظام؟

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

سؤال

أقوم بتطوير تطبيق MFC وقد كنت أبحث مؤخرًا عن طريقة جيدة لإزالة الرمز من شريط عنوان Windows، مع الاحتفاظ بزر الإغلاق.الحلان المرشحان الواضحان هما إيقاف تشغيل نمط قائمة النظام أو استخدام نمط نافذة الأداة، لكنني أفضل عدم تعطيل قائمة النظام أو استخدام شريط عنوان نافذة الأداة المنكمشة.العديد من تطبيقات MFC لديها هذه الوظيفة، لذلك أتساءل:هل أفتقد بعض الطرق القياسية للقيام بذلك؟

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

المحلول

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

نصائح أخرى

تعيين WS_EX_DLGMODALFRAME أسلوب ممتد.

يمكنك استخدام أيقونة شفافة بالكامل.

ماذا عن التخلص من قائمة النظام ثم إعادتها إلى مكان آخر بنفسك (على سبيل المثال بجوار زر الإغلاق وما إلى ذلك)؟

بدون الرمز، الطريقة الوحيدة التي يمكن أن أتخيلها للمستخدمين للوصول إلى قائمة النظام هي النقر بزر الماوس الأيمن على شريط العنوان.

إذا كان هذا ما يدور في ذهنك، فيمكنك التعامل مع WM_RBUTTONDOWN على إطارك الرئيسي ثم حساب ما إذا كانت النقرة بزر الماوس الأيمن موجودة على شريط العنوان.

int clickX = GET_X_LPARAM(lParam);
int clickY = GET_Y_LPARAM(lParam);

CRect frameRect;
mainFrame.GetWindowRect(&frameRect);

int titleBarHeight = GetSystemMetrics(SM_CYCAPTION);

if (clickX >= frameRect.left &&
    clickX <= frameRect.right &&
    clickY >= frameRect.top &&
    clickY <= frameRect.top + titleBarHeight)
{
   TrackPopupMenu(m_systemMenu);
}

نموذج التعليمات البرمجية في دلفي الذي يزيل الرمز:

const
  WM_ResetIcon = WM_APP - 1;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  protected
    procedure WMResetIcon(var Message: TMessage); message WM_ResetIcon;
  end;

implementation

procedure TForm1.FormShow(Sender: TObject);
begin
  PostMessage(Handle, WM_ResetIcon, 0, 0);
end;

procedure TForm1.WMResetIcon(var Message: TMessage);
const
  ICON_SMALL = 0;
  ICON_BIG   = 1;
begin
  DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_BIG, 0));
  DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_SMALL, 0));
end;

يجب أن يعمل رمز مماثل لـ MFC.في الأساس، تحتاج فقط إلى WM_SETICON إلى NULL في المكان الصحيح.

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