تعلم كيفية إنشاء فئة ثابتة لوظيفة التنبيه مع مؤلف Jiang Chuan Qi Gao
مقدمة غالبًا ما يتم رؤية التحكم في الإنذار في أنظمة التحكم الصناعية المختلفة. هناك العديد من الطرق للإنذار، والتي يمكن تمييزها بالنص أو تمثيلها بالرسومات. المبدأ ليس أكثر من مجرد إنشاء كائن من فئة CDC ثم استخدام الأساسيات المختلفة المتوفرة فقط الرسومات باستخدام السمات البدائية. هنا سوف نصنع برنامجًا يمكنه عرض نص التنبيه، عند حدوث إنذار، يمكننا وميض الخلفية لتحقيق الوظيفة.
نستخدم عمومًا طرقًا مشتقة لتنفيذ هذا النوع من المعالجة في النص.
استخدم أولاً معالج VC لإنشاء مشروع قائم على الحوار.
ثم نضع عنصر تحكم ثابت على واجهة مربع الحوار ونضبط الموضع.
اكتملت الاستعدادات الأساسية لاشتقاق فئة قائمة على CStatic تسمى CStaticRectangle لعنصر التحكم STATIC الخاص بنا. ومهمتنا التالية هي إضافة محتوى إلى الفئة المشتقة الجديدة لتحقيق تأثير شاشة التنبيه المطلوب.
وفقًا لما قلته في مقالتي الأخيرة، باستخدام طريقة التخزين المؤقت المزدوج، نحتاج إلى إضافة الملفات الثلاثة MemDC.h وAutoFont.h وAutoFont.cpp إلى المشروع. تعتبر فئة AutoFont تغليفًا أفضل لفئة CFont على الإنترنت اليوم، لا يحتاج المستخدمون إلى التفكير في وظائف API المعقدة عند إنشاء كائنات CFont، فهم يحتاجون فقط إلى إجراء بعض إعدادات المعلمات البسيطة لإكمال الوظيفة، لذلك نستخدم هذه الفئة هنا لتنفيذ التحكم في الخط لنص التنبيه.
تحديد الكائن
// يمكن زيادة أو تقليل تعريف اللون وفقًا للحالة الفعلية.
#define COLOR_RED RGB(255,0,0)
#define COLOR_GREEN RGB(0,255,0)
محمي:
CBitmap *m_pBitmapOldBackground;// يتم استخدام هذه الثلاثة لرسم المخزن المؤقت المزدوج
CBitmap m_bitmapBackground;
مركز السيطرة على الأمراض m_dcBackground;
CRect m_rectCtrl؛ // منطقة التحكم
nMillSec قصير //Timer
CAutoFont *m_pFnt; // إنشاء خط نص التنبيه
عام:
COLORREF m_BkColor;//لون الخلفية
COLORREF m_TextColor;// لون النص
CString strText; // نص التنبيه المعروض
BOOL bGleam;//سواء يومض
تهيئة المتغيرات في المنشئ:
CStaticRectangle::CStaticRectangle()
{
m_BkColor = COLOR_RED;
m_TextColor = RGB(255,128,64);
nMillSec = 10;
bGleam = FALSE;
m_pFnt = new CAutoFont("البرنامج النصي الرسمي");
m_pFnt->SetHeight(28);
m_pFnt->SetWidth(12);
m_pFnt->SetBold(TRUE);
}
يتم تحرير الذاكرة في المدمر
CStaticRectangle::~CStaticRectangle()
{
إذا (m_pFnt)
حذف m_pFnt؛
}
لرسم وظيفة الإنذار الثابت، نحتاج فقط إلى تعيين رسالة WM_PAINT، ثم إعادة رسم الواجهة وعرض النص.
باطلة CStaticRectangle::OnPaint()
{
CPaintDC dc(this);// سياق الجهاز للرسم
// TODO: أضف رمز معالج الرسائل الخاص بك هنا
// احصل على منطقة التحكم
GetClientRect (&m_rectCtrl);
CMemDC memDC(&dc, &m_rectCtrl);
إذا (m_dcBackground.GetSafeHdc()== NULL|| (m_bitmapBackground.m_hObject == NULL))
{
m_dcBackground.CreateCompatibleDC(&dc);
m_bitmapBackground.CreateCompatibleBitmap(&dc, m_rectCtrl.Width(), m_rectCtrl.Height()) ;
m_pBitmapOldBackground = m_dcBackground.SelectObject(&m_bitmapBackground);
}
DrawRectangleBackground(&m_dcBackground, m_rectCtrl);
memDC.BitBlt(0, 0, m_rectCtrl.Width(), m_rectCtrl.Height(),
&m_dcBackground, 0, 0, SRCCOPY);
// لا تتصل بـ CStatic::OnPaint() لرسم الرسائل
}
بعد ذلك، نتحكم في عرض المعلومات ذات الصلة، وما نحتاج إلى الاهتمام به هنا هو عرض النص الخاص بنا. وهنا نحتاج إلى حساب موضع عرض النص.
يمكننا الحصول على CSize للنص من خلال pDC->GetTextExtent();، ثم استخدم مستطيل عنصر التحكم للحصول على موضع عرض النص.
الطريقة المستخدمة هنا هي عرضه في المركز.
باطلة CStaticRectangle::DrawRectangleBackground(CDC *pDC, CRect &rect)
{
CBrush BrushFill, *pBrushOld;
كثافة العمليات nXSize، nYSize؛
CSize szText;
CFont *fOldFont;
nXSize = rect.Width();
nYSize = rect.Height();
BrushFill.DeleteObject();
brushFill.CreateSolidBrush(m_BkColor);
pBrushOld = pDC->SelectObject(&brushFill);
pDC->مستطيل(مستقيم);
pDC->SetBkColor(m_BkColor);
pDC->SetTextColor(m_TextColor);
fOldFont = (CFont *)pDC->SelectObject(m_pFnt);
szText = pDC->GetTextExtent(strText);
nXSize = (nXSize - szText.cx)/2;
nYSize = (nYSize - szText.cy)/2;
pDC->TextOut(nXSize,nYSize,strText);
pDC->SelectObject(pBrushOld);
pDC->SelectObject(&fOldFont);
BrushFill.DeleteObject();
}
إذا أردنا تنفيذ وظيفة التنبيه، فنحن بحاجة إلى استخدام وظيفة المؤقت لتغيير لون الخلفية بانتظام ثم تحديث الشاشة.
في هذه المرحلة، تم الانتهاء من العمل الأساسي والشيء التالي الذي يجب فعله هو توفير واجهة يمكن للمستخدمين تعديلها ديناميكيًا.
باطلة CStaticRectangle::SetRectangleText(CString strVal)
{
this->strText = strVal;
}
باطلة CStaticRectangle::SetBackColor(UINT nStyle)//تعيين لون الخلفية
{
this->m_BkColor = nStyle;
}
باطلة CStaticRectangle::SetBkGleam(BOOL bShow)
{
إذا (هذا->بجليم)
{
إذا (!بإظهار)
KillTimer(nMillSec);
}
آخر
{
إذا (بإظهار)
SetTimer(nMillSec,750,NULL);
}
this->bGleam = bShow;
}
حسنًا، الآن بعد أن اكتمل فصلنا الوظيفي، فإن الشيء التالي الذي يجب فعله هو توصيله بـ CSTATIC على الواجهة.
قم بإنشاء متغير مرتبط بالتحكم الثابت (نوع التحكم) من خلال CLASSWIZARD، ثم قم بتعديل النوع المشتق إلى CStaticRectangle الخاص بنا، وقم بتعيين تأثير الوميض، ويمكننا رؤية التأثير.
يوسع