OnPaint/OnDraw)。GetDeviceCaps(HORZRES/VERTRES) 取得寬高(像素)。MoveWindow(0, 0, cx, cy) 覆蓋全螢幕。輔助要點:載入游標(互動)、處理 WM_KEYDOWN 攔截 VK_ESCAPE 銷毀視窗恢復正常、雙緩衝防閃爍。
CGribbleWndclass CGribbleWnd : public CWnd
{
public:
CGribbleWnd();
virtual ~CGribbleWnd();
// 螢幕尺寸
int m_pixelsX, m_pixelsY;
CDC* m_pDC;
HCURSOR m_hCursor;
COLORREF m_backColor;
protected:
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnPaint();
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
DECLARE_MESSAGE_MAP()
};
BOOL CGribbleWnd::OnEraseBkgnd(CDC* pDC)
{
m_backColor = RGB(125, 200, 125); // 自訂背景色
CBrush brush(m_backColor);
CRect rect(0, 0, m_pixelsX, m_pixelsY);
pDC->FillRect(&rect, &brush);
return TRUE; // 關鍵:阻止預設擦除,配合雙緩衝消除閃爍
}
int CGribbleWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1) return -1;
// 1. 載入並設定游標
m_hCursor = LoadCursor(NULL, IDC_ARROW);
SetCursor(m_hCursor);
ShowCursor(TRUE);
// 2. 取得螢幕 DC 與尺寸
m_pDC = GetDC();
m_pixelsX = m_pDC->GetDeviceCaps(HORZRES);
m_pixelsY = m_pDC->GetDeviceCaps(VERTRES);
// 3. 全螢幕定位
MoveWindow(0, 0, m_pixelsX, m_pixelsY);
return 0;
}
void CGribbleWnd::OnPaint()
{
CPaintDC dc(this); // 雙緩衝自動處理
// 繪製李薩茹曲線示例
static int xCoef = 1, yCoef = 3, yOffset = 44;
++xCoef; ++yCoef;
for (float t = 0; t < 32767; t += 0.2f) {
int x = (int)(sin(xCoef * t) * m_pixelsX / 2 + m_pixelsX / 2);
int y = (int)(sin(yCoef * t + yOffset) * m_pixelsY / 2 + m_pixelsY / 2);
dc.SetPixel(x, y, RGB(255, 80, 255));
}
}
void CGribbleWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_ESCAPE) {
DestroyWindow(); // ESC 鍵銷毀視窗,退出全螢幕
}
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
WINDOWPLACEMENT 保存/恢復狀態若需在 MDI/SDI 架構下實現視圖全螢幕並保留原狀,可採用更完整的流程:
GetWindowPlacement 保存視圖/主框架原始位置、顯示狀態、非客戶區可見性。GetDesktopWindow + GetWindowRect 取得螢幕尺寸。AdjustWindowRect 依客戶區尺寸反推視窗尺寸。SetWindowPlacement 套用全螢幕佈局。WM_GETMINMAXINFO 允許最大化/最小化操作。此法繁瑣但功能完整,適合專業級文檔/視圖架構;本文
CGribbleWnd方案輕量直觀,極適合工具類、演示類、遊戲類全螢幕需求。
OnEraseBkgnd 返回 TRUE + OnPaint 使用 CPaintDC 自動雙緩衝。OnCreate 載入/設定/顯示,確保全螢幕可見。WM_KEYDOWN 攔截 VK_ESCAPE 呼叫 DestroyWindow,資源自動釋放。m_pixelsX/Y 歸一化,適應任意解析度。