程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 如何使用設備描述表

如何使用設備描述表

編輯:關於VC++

Windows 程序在屏幕、打印機或其它設備上畫圖時,它並不是將像素直接輸出到設備上,而是將圖繪制到由設備描述表表示的邏輯意義上的"顯示平面"上去。設備描述表(DC)是Windows中的一種數據結構,它包含GDI需要的所有關於顯示界面情況的描述字段,包括相連的物理設備和各種各樣的狀態信息。在Windows畫圖之前,Windows程序從GDI獲取設備描述表句柄(HDC),並在每次調用完GDI輸出函數後將句柄返回給GDI。本文將對如何獲得和釋放 HDC以及 CDC及其派生類的使用方法進行演示說明。

下載示例工程 DCDemo 具體說明:

1、按鈕 IDC_GETDC_APINULL的函數

void CDCDemoDlg::OnGetdcApinull()
{
  HDC hDC=::GetDC(NULL);
  ::MoveToEx(hDC,0,0,NULL);
  LineTo(hDC,200,20);
  ::ReleaseDC(NULL,hDC);
}

該段代碼具體演示了如何使用API 函數GetDC(NULL),取得屏幕的HDC.並進行畫圖。HDC GetDC(HWND hWnd); //功能:取得hWnd窗口的設備描述表句柄。當hWnd參數為NULL時,取得整個屏幕的設備描述表句柄。MoveToEx和LineTo演示在DC上畫一條直線記住,最後調用ReleaseDC釋放HDC資源。int ReleaseDC (
HWND hWnd,//你要控制的那個窗口的句柄,如果你在GetDC函數傳遞的是NULL,現在還要傳遞NULL。
HDC hDC //DC的句柄
);
編譯運行程序,按下按鈕,發現屏幕的左上角處畫了一條直線。

2、按鈕 IDC_GETDC_API的函數

void CDCDemoDlg::OnGetdcApi()
{
  HDC hDC=::GetDC(m_hWnd);
  ::MoveToEx(hDC,0,0,NULL);
  LineTo(hDC,200,50);
  ::ReleaseDC(m_hWnd,hDC);
}

這段代碼與前一段代碼唯一的區別是GetDC的參數不再是NULL,而改為CWnd的成員變量m_hWnd,即對話框窗口的句柄。對比兩段代碼運行結果,深入體會API函數 GetDC。

3、按鈕IDC_GETDC_CWND的函數

void CDCDemoDlg::OnGetdcCwnd()
{
  CDC *pDC=GetDC();
  pDC->MoveTo(0,0);
  pDC->LineTo(200,100);
  ReleaseDC(pDC);
}

該段代碼演示使用MFC CWnd類的 GetDC函數和ReleaseDC的方法,使用該方法在程序窗口中畫圖非常方便。為了避免獲取和釋放設備描述表所帶來的麻煩,MFC提供了一些CDC派生類,如CPaintDC,CClientDC,CWindowDC,這些類被設計為可直接進行實例化。各個類的構造函數和析構函數調用相應的函數捕獲和釋放設備描述表,從而使得更加方便簡捷。

4、按鈕IDC_CCLIENTDC的函數

void CDCDemoDlg::OnCclientdc()
{
  CClientDC dc(this);
  CBrush brush(RGB(255,0,0));
  dc.FillRect(CRect(0,0,100,100),&brush);
}

該段代碼演示了 CClientDC的具體使用方法,通過測試可以看出和 CClientDC對象相對應的設備描述表是窗口的客戶區。CPaintDC類是從CDC類派生出來的,在構造時自動調用CWnd::BeginPaint,析構時調用CWnd::EndPaint。通常CPaintDC用來響應WM_PAINT消息,一般應用在OnPaint函數,對窗口的客戶區進行操作。

5、按鈕IDC_CWINDOWDC的函數

void CDCDemoDlg::OnCwindowdc()
{
  CWindowDC dc(this);
  CPen pen(PS_SOLID,3,RGB(0,255,0));
  CPen *pOldPen=dc.SelectObject(&pen);
  dc.MoveTo(0,0);
  dc.LineTo(200,200);
  dc.SelectObject(pOldPen);
}
運行並觀察畫線的起始位置。可以看出CWindowDC對象和整個窗口相對應。

6、按鈕IDC_POINTER的函數

void CDCDemoDlg::OnPointer()
{
  CWindowDC *pDC;
  pDC=new CWindowDC(this);
  pDC->MoveTo(0,0);
  pDC->LineTo(200,250);
  delete pDC;
}

這段代碼演示了如何在堆中創建指向CDC派生類的指針,再利用該指針進行畫圖,最後請使用delete pDC; 釋放指針。就說到這吧,希望能對您有所幫助。不足之處,還望指正。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved