這篇心得關于技術內幕第五章,比較的基礎..
我是VC++的初學者
vc++技術內幕這本書我是去年暑假開始看的,那時候剛學windows編程,雖然之前用過c#,vb,不過都沒怎么練習,這本書我大概看了前面的80%,不過都未曾動手,近日打算從頭練習一下,在這里記些筆記
第五章第一個例子很簡單
一個單文檔MFC應用程序,View類中一個CRect類型變量保存矩形的信息,一個int型保存矩形顏色的屬性
WM_LBUTTONDOWN響應函數判斷單擊左鍵時鼠標位置是不是在之前那個矩形區域內,是的話變換矩形顏色的屬性,而且命令矩形區域重繪..
OnDraw()中用dc選取矩形顏色,繪制矩形的內切橢圓
應用的函數有:
virtual CGdiObject* CDC::SelectStockObject(
int nIndex
);//選取顏色,這里只選畫刷大概有如下畫刷
BLACK_BRUSH DKGRAY_BRUSH GRAY_BRUSH HOLLOW_BRUSH LTGRAY_BRUSH NULL_BRUSH WHITE_BRUSH
BOOL CDC::Ellipse(LPCRECT lpRect);//畫矩形對應的內切橢圓
BOOL CRECT::PtInRect(
POINT point
) const throw( );//判斷point是否在矩形中
注意一點就是CView::OnLButtonDown(UINT nFlags, CPoint point)
這里的Point坐標是View的client坐標,如果需要全局坐標需要轉換
第二個例子關于映射模式
不同的映射模式,對應的坐標是有區別的,而且他們的邏輯單位比例都不同
固定比例的映射模式有
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
我自己寫了一個Demo看了一下,好像只有MM_ANISOTROPIC跟MM_TEXT是x軸左向右,y軸上到下,DC原點為0,0
其他的映射模式x軸一樣,y軸變成了從下至上,DC原點還是0,0
CDC的幾個函數這里有必要說說
virtual int CDC::SetMapMode(
int nMapMode
);
int CDC::GetMapMode() const;
設置/讀取DC的映射模式
virtual CSize CDC::SetWindowExt(
int cx,
int cy
);//設置窗體范圍
virtual CSize CDC::SetViewportExt(
int cx,
int cy
);//設置視口范圍
virtual CPoint CDC::SetViewportOrg(
int x,
int y
);//設置(0,0)點的位置
窗體范圍和視口范圍的設置會影響可變比例映射
可變比例映射的x,y計算方法參看下面的公式
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成員函數的參數大都是用邏輯坐標,但是CWnd的成員卻以設備坐標為參數
但是CDC成員中有函數
LPtoDP,將邏輯坐標轉換為設備坐標
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;
第三個例子關于滾動條
文檔視圖的工程建立向導中可以讓View繼承自CScrollView,使得View帶有滾動條
OnInitialUpdate函數在視圖建立后,OnDraw執行之前執行,所以對于滾動條的初始化可以放在這個函數中
void CScrollingViewWindowView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: 計算此視圖的合計大小
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);
}
雖然是初始化了滾動條,但是不能夠使用快捷鍵(上下左右,pagedown啥的),需要手動重載afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
需要用到CWnd::OnVScroll, CWnd::OnHScroll,分別控制縱向與橫向兩個滾動條
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