爲何顯示的中文是橫着的?
如果在各種屬性框中選擇字體的時候前面有@字符的,顯示中文就是橫着的,
如何有效更改一個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提供了一個設備環境,以便成員函數在包括非客戶區在內的整個屏幕區域內繪圖