首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Visual C++ 實現全螢幕顯示:從繪圖曲線到 ESC 退出的完整實戰

     編輯:關於VC++

核心思路:三步走佔領全螢幕

  1. 自訂視窗類,重寫繪圖邏輯(OnPaint/OnDraw)。
  2. 獲取螢幕尺寸:GetDeviceCaps(HORZRES/VERTRES) 取得寬高(像素)。
  3. 定位視窗:MoveWindow(0, 0, cx, cy) 覆蓋全螢幕。

輔助要點:載入游標(互動)、處理 WM_KEYDOWN 攔截 VK_ESCAPE 銷毀視窗恢復正常、雙緩衝防閃爍。

完整類別實作:CGribbleWnd

標頭檔

class 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 架構下實現視圖全螢幕並保留原狀,可採用更完整的流程:

  1. GetWindowPlacement 保存視圖/主框架原始位置、顯示狀態、非客戶區可見性。
  2. GetDesktopWindow + GetWindowRect 取得螢幕尺寸。
  3. AdjustWindowRect 依客戶區尺寸反推視窗尺寸。
  4. SetWindowPlacement 套用全螢幕佈局。
  5. 處理 WM_GETMINMAXINFO 允許最大化/最小化操作。

此法繁瑣但功能完整,適合專業級文檔/視圖架構;本文 CGribbleWnd 方案輕量直觀,極適合工具類、演示類、遊戲類全螢幕需求。

關鍵技巧總結

  • 雙緩衝:OnEraseBkgnd 返回 TRUE + OnPaint 使用 CPaintDC 自動雙緩衝。
  • 游標管理:OnCreate 載入/設定/顯示,確保全螢幕可見。
  • 退出機制:WM_KEYDOWN 攔截 VK_ESCAPE 呼叫 DestroyWindow,資源自動釋放。
  • 座標系統:繪圖座標基於 m_pixelsX/Y 歸一化,適應任意解析度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved