เรียนรู้วิธีสร้างคลาส STATIC สำหรับฟังก์ชันการเตือนกับ Qi Gao ผู้เขียน Jiang Chuan
บทนำ การควบคุมสัญญาณเตือนมักพบเห็นได้ในระบบควบคุมทางอุตสาหกรรมต่างๆ มีวิธีการมากมายในการเตือน ซึ่งสามารถทำเครื่องหมายด้วยข้อความหรือแสดงด้วยกราฟิก หลักการไม่มีอะไรมากไปกว่าการสร้างวัตถุคลาส CDC แล้วใช้วิธีพื้นฐานต่างๆ ที่มีให้ กราฟิกโดยใช้คุณลักษณะดั้งเดิม ที่นี่ เราจะสร้างโปรแกรมที่สามารถแสดงข้อความเตือนได้ เมื่อมีการแจ้งเตือนเกิดขึ้น เราสามารถแฟลชพื้นหลังเพื่อให้บรรลุฟังก์ชันได้
โดยทั่วไปเราใช้วิธีที่ได้รับเพื่อใช้การประมวลผลประเภทนี้ในข้อความ
ขั้นแรกให้ใช้ตัวช่วยสร้าง VC เพื่อสร้างโปรเจ็กต์แบบโต้ตอบ
จากนั้นเราวางตัวควบคุมแบบคงที่บนอินเทอร์เฟซของกล่องโต้ตอบและกำหนดตำแหน่ง
การเตรียมการขั้นพื้นฐานสำหรับการรับคลาสที่ใช้ CStatic ชื่อ CStaticRectangle สำหรับการควบคุม STATIC ของเราเสร็จสมบูรณ์แล้ว งานต่อไปของเราคือการเพิ่มเนื้อหาให้กับคลาสที่ได้รับใหม่เพื่อให้ได้เอฟเฟกต์หน้าจอการเตือนที่ต้องการ
จากสิ่งที่ฉันกล่าวไว้ในบทความที่แล้ว โดยใช้วิธีบัฟเฟอร์สองครั้ง เราจำเป็นต้องเพิ่มไฟล์สามไฟล์ MemDC.h, AutoFont.h และ AutoFont.cpp ให้กับโปรเจ็กต์ คลาส AutoFont เป็นการห่อหุ้มคลาส CFont ที่ดีกว่า บนอินเทอร์เน็ตในปัจจุบัน ผู้ใช้ไม่จำเป็นต้องพิจารณาฟังก์ชัน API การสร้างที่ซับซ้อนเมื่อสร้างออบเจ็กต์ CFont พวกเขาจำเป็นต้องทำการตั้งค่าพารามิเตอร์ง่ายๆ เพียงไม่กี่อย่างเพื่อให้ฟังก์ชันนี้สมบูรณ์ ดังนั้นเราจึงใช้คลาสนี้ที่นี่เพื่อใช้การควบคุมแบบอักษรของข้อความแจ้งเตือน
กำหนดวัตถุ
//ความหมายของสีสามารถเพิ่มหรือลดได้ตามสถานการณ์จริง
#define COLOR_RED RGB(255,0,0)
#กำหนด COLOR_GREEN RGB(0,255,0)
ได้รับการคุ้มครอง:
CBitmap *m_pBitmapOldBackground;//ทั้งสามนี้ใช้สำหรับการวาดบัฟเฟอร์คู่
CBitmap m_bitmapพื้นหลัง;
CDC m_dcพื้นหลัง;
CRect m_rectCtrl; // พื้นที่ควบคุม
nMillSec สั้น ๆ // ตัวจับเวลา
CAutoFont *m_pFnt; // สร้างแบบอักษรข้อความเตือน
สาธารณะ:
COLORREF m_BkColor;//สีพื้นหลัง
COLORREF m_TextColor;//สีข้อความ
CString strText; // แสดงข้อความเตือน
BOOL bGleam;//ไม่ว่าจะกระพริบ
เริ่มต้นตัวแปรในตัวสร้าง:
CStaticRectangle::CStaticRectangle()
-
m_BkColor = สี_แดง;
m_TextColor = RGB(255,128,64);
nMillSec = 10;
bGleam = เท็จ;
m_pFnt = CAutoFont ใหม่ ("สคริปต์อย่างเป็นทางการ");
m_pFnt->ตั้งค่าความสูง(28);
m_pFnt->SetWidth(12);
m_pFnt->SetBold(TRUE);
-
หน่วยความจำถูกปล่อยออกมาในตัวทำลายล้าง
CStaticRectangle::~CStaticRectangle()
-
ถ้า(m_pFnt)
ลบ m_pFnt;
-
ในการวาดฟังก์ชันสัญญาณเตือน STATIC เราเพียงแค่ต้องแมปข้อความ WM_PAINT จากนั้นจึงวาดอินเทอร์เฟซใหม่และแสดงข้อความ
เป็นโมฆะ CStaticRectangle::OnPaint()
-
CPaintDC dc (นี่); // บริบทของอุปกรณ์สำหรับการวาดภาพ
// สิ่งที่ต้องทำ: เพิ่มโค้ดตัวจัดการข้อความของคุณที่นี่
// รับพื้นที่ควบคุม
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)
-
CBbrush brushFill, *pBrushOld;
int nXSize, nYSize;
CSize szText;
CFont *fOldFont;
nXSize = ความกว้างสี่เหลี่ยมผืนผ้า();
nysize = ตรงความสูง();
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)
-
นี่ -> strText = strVal;
-
เป็นโมฆะ CStaticRectangle::SetBackColor(UINT nStyle)//ตั้งค่าสีพื้นหลัง
-
นี่ -> m_BkColor = nStyle;
-
เป็นโมฆะ CStaticRectangle::SetBkGleam (BOOL bShow)
-
ถ้า (นี่ -> bGleam)
-
ถ้า(!bShow)
KillTimer(nMillSec);
-
อื่น
-
ถ้า(bแสดง)
SetTimer(nMillSec,750,โมฆะ);
-
นี่ -> bGleam = bShow;
-
ตอนนี้เมื่อคลาสฟังก์ชันของเราเสร็จสมบูรณ์แล้ว สิ่งต่อไปที่ต้องทำคือการเชื่อมต่อกับ CSTATIC บนอินเทอร์เฟซ
สร้างตัวแปรที่เกี่ยวข้องกับการควบคุม STATIC (ประเภทการควบคุม) ผ่าน CLASSWIZARD จากนั้นแก้ไขประเภทที่ได้รับเป็น CStaticRectangle ของเรา และตั้งค่าเอฟเฟกต์การกะพริบ แล้วเราจะเห็นเอฟเฟกต์
ขยาย