程序作者:zhoujiamurong 個人郵箱:[email protected]
作者保留作品的所有權利,如需轉載請聯系作者。
大家都在催我繼續寫,我真得很想寫快點,不過我寫這一篇文章得3-4個小時。我不希望大家看了不懂,或者沒學到什麼東西。寫該系列文章,另一個原因就是想還Vchelp站長聞怡洋和雷神的人情,我在學VC很困難的時候,學習了雷神的文章和教程和聞站長的教程.有了很好的學習效果,在市面上很多的書籍一上來就是向導,很多人就是看不明白而放棄學VC。我希望大家也不要放棄,我又將我的這點爛文章發到網站去了.希望有更多的人來學習VC,也希望大家有什麼體會和心得或發現也能夠寫出來大家共享。
下面我接著上一節的內容來講,我們已經將工具條和狀態條的外觀畫好,現在要為這個工具條和狀態欄加上響應,也就是消息映射和處理函數,我們先將一些無關緊要的消息框去掉。然後添加消息映射:
ON_COMMAND(ID_DISPLAY_UP, up)
ON_COMMAND(ID_DISPLAY_DOWN,down)
ON_COMMAND(ID_DISPLAY_LEFT,left)
ON_COMMAND(ID_DISPLAY_RIGHT,right)
void up()
{
::MessageBox(0,"up","消息",MB_OK);
}
void down()
{
::MessageBox(0,"down","消息",MB_OK);
}
void left()
{
::MessageBox(0,"left","消息",MB_OK);
}
void right()
{
::MessageBox(0,"right","消息",MB_OK);
}
我們再運行一下程序,我們發現工具條變靓了,因為有了消息映射,所以工具條和菜單都從無效變成有效了。
下面,我們想在狀態欄裡顯示鼠標的坐標。翻譯成計算機的語言,也就是說,在鼠標移動的時候,我們獲得鼠標的坐標,將這個坐標(整型)轉換成字符串,然後,將這個字符串賦值給狀態欄的一個窗格。
下面我們來實現它,首現我們要在狀態欄添加一個網格,更改代碼
UINT stat[]={0,ID_INDICATOR_NUM,ID_INDICATOR_CAPS};
UINT stat[]={0,0,ID_INDICATOR_NUM,ID_INDICATOR_CAPS};
s.SetIndicators(stat,3);
s.SetIndicators(stat,4);
我們就添加了一個窗格,我們還要為鼠標移動添加消息映射,使用MFC定義好的宏ON_WM_MOUSEMOVE(),直接放到消息映射裡面就可以了,下面添加消息映射的處理函數void
OnMouseMove(UINT nFlags, CPoint point) 通過這個函數我們可以得到兩個參數:uFlags和point,這兩個參數.我們在MSDN種查到對這兩個參數的描述:
nFlags
Indicates whether various virtual keys are down. This parameter can
be any combination of the following values:
指示哪些鍵被按下。這個參數可以是以下值的任意組合:
• MK_CONTROL Set if the CTRL key is down. //CTRL鍵
• MK_LBUTTON Set if the left mouse button is down.//鼠標左鍵
• MK_MBUTTON Set if the middle mouse button is down.//鼠標中鍵
• MK_RBUTTON Set if the right mouse button is down.//鼠標右鍵
• MK_SHIFT Set if the SHIFT key is down. //SHIFT鍵
point
Specifies the x- and y-coordinate of the cursor. These coordinates
are always relative to the upper-left corner of the window.
指示光標的坐標。這個光標是相對於窗體的左上角的。
這是我們要找的參數就是point,那麼這個參數是CPoint 類型的,我們再查CPoint 類型,如何查呢?一種查MSDN,另一種在工程中,右鍵點擊CPoint這個文字,出來的右鍵菜單中,點擊goto
the definition of CPoint 。我們看到了MFC的源碼,CPoint本身是一個類,但是它是繼承於一個結構的(tagPOINT)。我們看它的原始定義:
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
CString str;//這是我們最後要賦值的字符串;
CString str_x;//X坐標
CString str_y;//Y坐標
str_x.Format("%d",point.x);//轉換point.x到str_x
str_y.Format("%d",point.y); //轉換point.y到str_y
str+="X: ";
str+=str_x;
str+=" ";
str+="Y: ";
str+=str_y;//以上是連接字符串到str中
s.SetPaneText(1,str,TRUE);//最後賦值給窗格
str_x.Empty();//下面是釋放空間
str_y.Empty();
str.Empty();