GDI的一些知識點


爲何顯示的中文是橫着的?
如果在各種屬性框中選擇字體的時候前面有@字符的,顯示中文就是橫着的,

如何有效更改一個Dialog的背景?
typedef struct tagBITMAP {
  LONG   bmType;
  LONG   bmWidth;
  LONG   bmHeight;
  LONG   bmWidthBytes;
  WORD   bmPlanes;
  WORD   bmBitsPixel;
  LPVOID bmBits;
} BITMAP, *PBITMAP; -----BITMAP結構用於定義圖像的寬度,高度和顏色格式和圖像的值

CBitmap::GetBitmap
int GetBitmap( BITMAP* pBitMap ); ----此函數用於獲得圖片的信息
返回值爲非0,則爲成功
CMyGDIView::OnEraseBkgnd函數裏應用如下程序,而在CMyGDIView::OnDraw裏也可以,但是當重新更改頁面大小的時候
OnDraw函數的反應刷新次數太多
  CBitmap bitmap;
 bitmap.LoadBitmap(IDB_BITMAP1);

 BITMAP bmp;
 bitmap.GetBitmap(&bmp);

 CDC dcCompatible;
 dcCompatible.CreateCompatibleDC(pDC);---在內存中創建一個虛擬設備上下文對象,而不立即顯示出來

 dcCompatible.SelectObject(&bitmap);

 CRect rect;
 GetClientRect(&rect);---獲取客戶區的Rect
// pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);---將圖像按照1:1的比例進行顯示
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,
   0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);----將圖像進行變更以合適客戶區的尺寸
          return true;---不進行下一步的擦除處理,而直接返回,否則會直接擦除剛家加載的背景


怎麼初始化一個 COLORREF ?
COLORREF m_color;
 m_color=RGB(255,0,0);

怎麼選擇字體並且顯示?
CFontDialog dlg;
if (dlg.DoModal() == IDOK)
{
   if(font.m_hObject)
   {
      font.DeleteObject();
   }
  
    font.CreateFontIndirect(dlg.m_cf.lpLogFont);
  m_strName=dlg.m_cf.lpLogFont->lfFaceName;
          Invalidate(); ---引起窗口重繪
}
以下是顯示在OnDraw裏的

 CFont *pOldFont=pDC->SelectObject(&font);
 pDC->TextOut(0,0,m_strName);
 pDC->SelectObject(pOldFont);


如何選擇顏色並顯示?
        CColorDialog dlg;
 dlg.m_cc.Flags |= CC_RGBINIT | CC_FULLOPEN;
 dlg.m_cc.rgbResult=m_clr;---將剛選擇的顏色賦回給顏色框體
 if(IDOK==dlg.DoModal())
 {
  m_clr=dlg.m_cc.rgbResult;--獲取已經選擇的顏色
            //  m_clr=dlg.GetColor ();---此方法也可以
 }


如何控制座標?
CWindow::ClientToScreen是把座標從當前窗體轉化成全屏幕的!!!
CWindow::ScreenToClient是把屏幕座標轉化成相對當前窗體的座標!!!!

CWnd::GetWindowRect是取得窗口在屏幕座標系下的RECT座標(包括客戶區和非客戶區),這樣可以得到窗口的大小和相對屏幕左上角(0,0)的位置。
CWnd::GetClientRect取得窗口客戶區(不包括非客戶區)在客戶區座標系下的RECT座標,可以得到窗口的大小,而不能得到相對屏幕的位置,因爲這個矩陣是在客戶區座標系下(相對於窗口客

戶區的左上角)的。  
們對同一個窗口先GetWindowRect取得一個RECT,再用ScreenToClient轉換到客戶座標系。然後GetClientRect取得一個RECT,再用ClientToScreen轉換到屏幕座標系。顯然,GetWindowRect

取得的矩陣不小於GetClientRect取得的矩陣。因爲前者包含了非客戶區,而後包括了客戶區。 


CWindow和CWnd的區別?
CWindow是ATl中封裝的窗口類
CWnd是MFC的封裝

什麼是ATL呢?
Active   Template   Library   (活動模板庫)  

  Template   是C++新標準中源碼重用的新工具   本人感覺棒極了  
  C++   有   Standard   Template   Library   提供了相當多的模板  
  而   ATL是爲COM/ActiveX提供的一組開發庫,使COM開發簡化  

WTL   =   Windows   Template   Library,可以說起源於   ATL   類庫中關於   Window   創建/管理的類。主要原因是用原始的   WIN32   API   編寫漂亮的用戶界面工作量大,繁雜

。MFC   雖然提供了一套很好的封裝,但是也不是很容易消化和使用,特別是各個   MFC   類之間耦合很緊,要用好   MFC   就要理解很多   MFC   內在的運行機制(有人說   MFC   的

封裝是“白盒”封裝,呵呵)。WTL   利用   C++   模版的高級功能,提供很聯繫很鬆散的“獨立”的類庫,使用起來比較方便,而且代碼體積小,不必爲了學習某個類必須學習一大堆相

關的類。  
 WTL   不是   Microsoft   官方正式支持的類庫,雖然有相當多的人和越來越多的在使用;不過有可能將來會支持的


STL   =   Standard   Template   Library  

 

 

CDC/CClientDC/CPaintDC/CWindowDC的區別是什麼?

CDC類是所有繪圖類的基類。

底下的類都爲CDC的派生類

CPaintDC用於模擬相應WM_PAINT的設備環境,這個類中可以使用CDC中的所有函數.

CClientDC它爲非響應Windows消息WM_PAINT的成員函數提供了一個設備環境。

CWindowDC提供了一個設備環境,以便成員函數在包括非客戶區在內的整個屏幕區域內繪圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章