هل تريد إزالة الرمز من أشرطة عناوين Windows دون التخلص من زر الإغلاق أو قائمة النظام؟
-
08-06-2019 - |
سؤال
أقوم بتطوير تطبيق 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 في المكان الصحيح.