?? teach_road_32.htm
字號(hào):
<html><head><meta http-equiv="Content-Type"content="text/html; charset=gb_2312-80"><title>VC Road</title><style type="text/css" MEDIA="screen"><!--a {text-decoration: underline;}a:hover {color:red; text-decoration:underline}small {color: navy; font-size: 12px ; line-height:16px;}h1 {color: navy; font-size: 12px ; line-height:16px;}
big {color: navy; font-size: 22px ; line-height:26px;}
td {color: navy; font-size: 12px ; line-height:16px;bgcolor="#FFCFA3";}--></style></head>
<body background="../img/ground.gif">
<p align="center"><a
HREF="http://www.0828.com/pay/cgi-bin/random.cgi?job=go&id=820"
target="_blank">
<img SRC="http://www.0828.com/pay/cgi-bin/random.cgi?id=820" BORDER="0"
width="468" height="60"></a><br>
<font size="2"><a href="http://www.0828.com/pay/index.html" target=_blank><img border="0"
src="http://www.0828.com/pay/code.gif" width="468" height="15"></a><br><small>你每點(diǎn)一下上面的廣告我就能有更多的上網(wǎng)時(shí)間為大家尋找資料</small></font>
</p>
<p align=center><big>3.2 接收用戶輸入</big></p>
<table border=0 align=center width=80%>
<tr><td>
<p><b>在視中接收鼠標(biāo)輸入:</b></p>
<p>鼠標(biāo)消息是我們常需要處理的消息,消息分為:鼠標(biāo)移動(dòng),按鈕按下/松開,雙擊。利用ClassWizard可以輕松的添加這幾種消息映射,下面分別講解每種消息的處理。</p>
<p>WM_MOUSEMOVE對應(yīng)的函數(shù)為OnMouseMove( UINT nFlags, CPoint point ),nFlags表明了當(dāng)前一些按鍵的消息,你可以通過“位與”操作進(jìn)行檢測。
<ul type=disc>
<li>
<b>MK_CONTROL</b> Ctrl鍵是否被按下 Set if the CTRL key is down.<br><br></li>
<li>
<b>MK_LBUTTON</b> 鼠標(biāo)左鍵是否被按下 Set if the left mouse button is down.<br><br></li>
<li>
<b>MK_MBUTTON</b> 鼠標(biāo)中間鍵是否被按下 Set if the middle mouse button is down.<br><br></li>
<li>
<b>MK_RBUTTON</b> 鼠標(biāo)右鍵是否被按下 Set if the right mouse button is down.<br><br></li>
<li>
<b>MK_SHIFT</b> Shift鍵是否被按下 Set if the SHIFT key is down.</li>
</ul>
point表示當(dāng)前鼠標(biāo)的<font color=red>設(shè)備坐標(biāo)</font>,坐標(biāo)原點(diǎn)對應(yīng)視左上角。</p>
<p>WM_LBUTTONDOWN/WM_RBUTTONDOWN(鼠標(biāo)左/右鍵按下)對應(yīng)的函數(shù)為OnLButtonDown/OnRButtonDown( UINT nFlags, CPoint point )參數(shù)意義和OnMouseMove相同。</p>
<p>WM_LBUTTONUP/WM_RBUTTONUP(鼠標(biāo)左/右鍵松開)對應(yīng)的函數(shù)為OnLButtonUp/OnRButtonUp( UINT nFlags, CPoint point )參數(shù)意義和OnMouseMove相同。</p>
<p>WM_LBUTTONDBLCLK/WM_RBUTTONDBLCLK(鼠標(biāo)左/右鍵雙擊)對應(yīng)的函數(shù)為OnLButtonDblClk/OnRButtonDblClk( UINT nFlags, CPoint point )參數(shù)意義和OnMouseMove相同。</p>
<p>下面我用一段偽代碼來講解一下這些消息的用法:
<pre>
代碼的作用是用鼠標(biāo)拉出一個(gè)矩形
global BOOL fDowned;//是否在拉動(dòng)
global CPoint ptDown;//按下位置
global CPoint ptUp;//松開位置
OnLButtonDown(UINT nFlags, CPoint point)
{
fDowned=TRUE;
ptUp=ptDown=point;
DrawRect();
...
}
OnMouseMove(UINT nFlags, CPoint point)
{
if(fDowned)
{
DrawRect();//恢復(fù)上次所畫的矩形
ptUp=point;
DrawRect();//畫新矩形
}
}
OnLButtonUp(UINT nFlags, CPoint point)
{
if(fDowned)
{
DrawRect();//恢復(fù)上次所畫的矩形
ptUp=point;
DrawRect();//畫新矩形
fDowned=FALSE;
}
}
DrawRect()
{//以反色屏幕的方法畫出ptDown,ptUp標(biāo)記的矩形
CClientDC dc(this);
MakeRect(ptDown,ptUp);
SetROP(NOT);
Rect();
}
</pre>
</p>
<p>坐標(biāo)間轉(zhuǎn)換:在以上的函數(shù)中point參數(shù)對應(yīng)的都是窗口的設(shè)備坐標(biāo),我們應(yīng)該將設(shè)備坐標(biāo)和邏輯坐標(biāo)相區(qū)別,在<a href=32_g1.jpg target=img>圖32_g1</a>由于窗口使用了滾動(dòng)條,所以傳入的設(shè)備坐標(biāo)是對應(yīng)于當(dāng)前窗口左上角的坐標(biāo),沒有考慮是否滾動(dòng),而邏輯坐標(biāo)必須考慮滾動(dòng)后對應(yīng)的坐標(biāo),所以我以黃線虛擬的表達(dá)一個(gè)邏輯坐標(biāo)的區(qū)域。可以看得出同一點(diǎn)在滾動(dòng)后的坐標(biāo)值是不同的,這一規(guī)則同樣適用于改變了映射方式的窗口,假設(shè)你將映射方式設(shè)置為每點(diǎn)為0.01毫米,那么設(shè)備坐標(biāo)所對應(yīng)的邏輯坐標(biāo)也需要重新計(jì)算。進(jìn)行這種轉(zhuǎn)換需要寫一段代碼,所幸的是系統(tǒng)提供了進(jìn)行轉(zhuǎn)換的功能DC的DPtoLP,LPtoDP,下面給出代碼完成由設(shè)備坐標(biāo)到邏輯坐標(biāo)的轉(zhuǎn)換。<pre>
CPoint CYourView::FromDP(CPoint point)
{
CClientDC dc(this);
CPoint ptRet=point;
dc.PrepareDC();//必須先準(zhǔn)備DC,這在使用滾動(dòng)時(shí)讓DC重新計(jì)算坐標(biāo)
//如果你作圖設(shè)置了不同的映射方式,則在下面需要設(shè)置
dc.SetMapMode(...)
//
dc.DPtoLP(&ptRet);//DP->LP進(jìn)行轉(zhuǎn)換
return ptRet;
}
</pre></p>
<p>在<a href=32_g1.jpg target=img>圖32_g1</a>中以藍(lán)線標(biāo)記的是屏幕區(qū)域,紅線標(biāo)記的客戶區(qū)域。利用ScreenToClient,ClientToScreen可以將坐標(biāo)在這兩個(gè)區(qū)域間轉(zhuǎn)換。</a></p>
<p><b>在視中接收鍵盤輸入:</b></p>
<p>鍵盤消息有三個(gè):鍵盤被按下/松開,輸入字符。其中輸入字符相當(dāng)于直接得到用戶輸入的字符這在不需要處理按鍵細(xì)節(jié)時(shí)使用,而鍵盤被按下/松開在按鍵狀態(tài)改變時(shí)發(fā)送。</p>
<p>WM_CHAR對應(yīng)的函數(shù)為OnChar( UINT nChar, UINT nRepCnt, UINT nFlags ),其中nChar為被按下的字符,nRepCnt表明在長時(shí)間為松開時(shí)相當(dāng)于的按鍵次數(shù),nFlags中的不同位代表不同的含義,在這里一般不使用。</p>
<p>WM_KEYDOWN/WM_KEYUP所對應(yīng)的函數(shù)為OnKeyDown/OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags )nChar代表按鍵的虛擬碼值,如VK_ALT為ALT鍵,VK_CONTROL為Ctrl鍵。nFlags各位的含義如下:
<table border=1 cellpadding=5 cols=2 frame=below rules=rows>
<tr valign=top>
<td class=label width=15%><b>Value</b></td>
<td class=label width=85%><b>Description</b></td>
</tr>
<tr valign=top>
<td width=15%>0
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -