這篇心得關(guān)于技術(shù)內(nèi)幕第五章,比較的基礎(chǔ)..
我是VC++的初學(xué)者
vc++技術(shù)內(nèi)幕這本書(shū)我是去年暑假開(kāi)始看的,那時(shí)候剛學(xué)windows編程,雖然之前用過(guò)c#,vb,不過(guò)都沒(méi)怎么練習(xí),這本書(shū)我大概看了前面的80%,不過(guò)都未曾動(dòng)手,近日打算從頭練習(xí)一下,在這里記些筆記
第五章第一個(gè)例子很簡(jiǎn)單
一個(gè)單文檔MFC應(yīng)用程序,View類(lèi)中一個(gè)CRect類(lèi)型變量保存矩形的信息,一個(gè)int型保存矩形顏色的屬性
WM_LBUTTONDOWN響應(yīng)函數(shù)判斷單擊左鍵時(shí)鼠標(biāo)位置是不是在之前那個(gè)矩形區(qū)域內(nèi),是的話變換矩形顏色的屬性,而且命令矩形區(qū)域重繪..
OnDraw()中用dc選取矩形顏色,繪制矩形的內(nèi)切橢圓
應(yīng)用的函數(shù)有:
virtual CGdiObject* CDC::SelectStockObject(
int nIndex
);//選取顏色,這里只選畫(huà)刷大概有如下畫(huà)刷
BLACK_BRUSH DKGRAY_BRUSH GRAY_BRUSH HOLLOW_BRUSH LTGRAY_BRUSH NULL_BRUSH WHITE_BRUSH
BOOL CDC::Ellipse(LPCRECT lpRect);//畫(huà)矩形對(duì)應(yīng)的內(nèi)切橢圓
BOOL CRECT::PtInRect(
POINT point
) const throw( );//判斷point是否在矩形中
注意一點(diǎn)就是CView::OnLButtonDown(UINT nFlags, CPoint point)
這里的Point坐標(biāo)是View的client坐標(biāo),如果需要全局坐標(biāo)需要轉(zhuǎn)換
第二個(gè)例子關(guān)于映射模式
不同的映射模式,對(duì)應(yīng)的坐標(biāo)是有區(qū)別的,而且他們的邏輯單位比例都不同
固定比例的映射模式有
Mapping Mode
|
Logical Unit
|
MM_LOENGLISH
|
0.01 inch
|
MM_HIENGLISH
|
0.001 inch
|
MM_LOMETRIC
|
0.1 mm
|
MM_HIMETRIC
|
0.01 mm
|
MM_TWIPS
|
1/1440 inch
|
可變比例的映射模式
MM_ISOTROPIC and MM_ANISOTROPIC
我自己寫(xiě)了一個(gè)Demo看了一下,好像只有MM_ANISOTROPIC跟MM_TEXT是x軸左向右,y軸上到下,DC原點(diǎn)為0,0
其他的映射模式x軸一樣,y軸變成了從下至上,DC原點(diǎn)還是0,0
CDC的幾個(gè)函數(shù)這里有必要說(shuō)說(shuō)
virtual int CDC::SetMapMode(
int nMapMode
);
int CDC::GetMapMode() const;
設(shè)置/讀取DC的映射模式
virtual CSize CDC::SetWindowExt(
int cx,
int cy
);//設(shè)置窗體范圍
virtual CSize CDC::SetViewportExt(
int cx,
int cy
);//設(shè)置視口范圍
virtual CPoint CDC::SetViewportOrg(
int x,
int y
);//設(shè)置(0,0)點(diǎn)的位置
窗體范圍和視口范圍的設(shè)置會(huì)影響可變比例映射
可變比例映射的x,y計(jì)算方法參看下面的公式
x scale factor = x viewport extent / x window extent
y scale factor = y viewport extent / y window extent
device x = logical x* x scale factor + x origin offset
device y = logical y* y scale factor + y origin offset
CDC成員函數(shù)的參數(shù)大都是用邏輯坐標(biāo),但是CWnd的成員卻以設(shè)備坐標(biāo)為參數(shù)
但是CDC成員中有函數(shù)
LPtoDP,將邏輯坐標(biāo)轉(zhuǎn)換為設(shè)備坐標(biāo)
void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const; void LPtoDP( LPRECT lpRect ) const; void LPtoDP( LPSIZE lpSize ) const;
DPtoLP,剛好相反
void DPtoLP( LPPOINT lpPoints, int nCount = 1 ) const; void DPtoLP( LPRECT lpRect ) const; void DPtoLP( LPSIZE lpSize ) const;
第三個(gè)例子關(guān)于滾動(dòng)條
文檔視圖的工程建立向?qū)е锌梢宰?/span>View繼承自CScrollView,使得View帶有滾動(dòng)條
OnInitialUpdate函數(shù)在視圖建立后,OnDraw執(zhí)行之前執(zhí)行,所以對(duì)于滾動(dòng)條的初始化可以放在這個(gè)函數(shù)中
void CScrollingViewWindowView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: 計(jì)算此視圖的合計(jì)大小
sizeTotal.cx = 20000; //20cm
sizeTotal.cy = 30000; //30cm
CSize sizePage(sizeTotal.cx/2,sizeTotal.cy/2);
CSize sizeLine(sizeTotal.cx/50,sizeTotal.cy/50);
SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
}
雖然是初始化了滾動(dòng)條,但是不能夠使用快捷鍵(上下左右,pagedown啥的),需要手動(dòng)重載afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
需要用到CWnd::OnVScroll, CWnd::OnHScroll,分別控制縱向與橫向兩個(gè)滾動(dòng)條
nSBCode
Specifies a scroll-bar code that indicates the user's scrolling request. This parameter can be one of the following:
· SB_BOTTOM Scroll to bottom.
· SB_ENDSCROLL End scroll.
· SB_LINEDOWN Scroll one line down.
· SB_LINEUP Scroll one line up.
· SB_PAGEDOWN Scroll one page down.
· SB_PAGEUP Scroll one page up.
· SB_THUMBPOSITION Scroll to the absolute position. The current position is provided in nPos.
· SB_THUMBTRACK Drag scroll box to specified position. The current position is provided in nPos.
· SB_TOP Scroll to top.
by gohan 11.23