天天看點

vs2010修改狀态欄的CStatusBar指針的的SetPaneText()方法時死活不對問題

vs2010的mfc在有些地方不太一樣不容易注意到,今天在修改狀态欄的時候,就碰見了問題,死活修改不了。

參照下面的文章:

<a target="_blank" href="http://www.cnblogs.com/madhenry/archive/2011/04/19/2021317.html">點選打開連結</a>

:

2011-04-19 17:12 by 憤怒的青蛙,

<a target="_blank" href="http://i.cnblogs.com/EditPosts.aspx?postid=2021317">編輯</a>

這兩天試了不想再用惡心的VC6.0,改用VS2010試了一下,發現差別不大,但是在細節上,貌似VS2010可以使用原來的MFC類,但是似乎總是有問題,不太好用。今天就遇到一個問題,本來是最簡單的在狀态欄顯示滑鼠坐标,但是使用CStatusBar指針的的SetPaneText()方法時死活不對,總是報錯,Google了半天貌似沒有遇到這個問題的,當時我就哭了。。。,難道我的人品這麼背,不甘心下,有看了一下CMainFrame代碼,發現使用的竟然是CMFCStatusBar,難道這是原因?抱着試一試的想法,把CStatusBar換成CMFCStatusBar,運作一下,沒問題了。看來有問題不要怕,多看看代碼,問題自然解決。。。

附上在狀态欄添加滑鼠坐标的過程:

1.在String Table中添加一個新項,名字為IDS_MOUSE_POINT(具體什麼名字可以随便起),将其Caption設為"X=0000,Y=0000"(不包括引号)

2.在MainFrm.cpp中indicators聲明處添加IDS_MOUSE_POINT,注意不要添加到第一行(如果添加後果我不太清楚),代碼如下:

<a target="_blank" href="http://www.cnblogs.com/madhenry/archive/2011/04/19/2021317.html#">?</a>

1

2

3

4

5

6

7

8

<code>static</code>

<code>UINT</code> <code>indicators[] =</code>

<code>{</code>

<code>    </code><code>ID_SEPARATOR,          </code><code>// 狀态行訓示器</code>

<code>    </code><code>ID_INDICATOR_CAPS,</code>

<code>    </code><code>ID_INDICATOR_NUM,</code>

<code>    </code><code>ID_INDICATOR_SCRL,</code>

<code>    </code><code>IDS_MOUSE_POINT,</code>

<code>};</code>

3.使用Class Wizard添加WM_MOUSEMOVE的相應函數

4.在相應函數中添加代碼如下(注意由于我是基于MapX做二次開發,這是MapX的mousemove的相應函數,不過和windows的大同小異,可以參考使用):

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code>void</code> <code>CMy2008302590145View::MouseMoveMapMain(</code><code>short</code>

<code>Button,</code><code>short</code>

<code>Shift,</code><code>float</code> <code>X,</code><code>float</code> <code>Y)</code>

<code>    </code><code>// TODO: Add your message handler code here</code>

<code>    </code><code>double</code>

<code>dX,dY;</code>

<code>    </code><code>m_MapX.ConvertCoord(&amp;X, &amp;Y, &amp;dX, &amp;dY, miScreenToMap);</code><code>//将螢幕坐标換算為地理坐标</code>

<code>//  CString strMousePos;</code>

<code>//  strMousePos.Format(_T("X=%.4f,Y=%.4F"),dX,dY);</code>

<code>    </code><code>char</code><code>* strMousePos;</code>

<code>    </code><code>strMousePos =</code><code>new</code> <code>char</code><code>[256];</code>

<code>    </code><code>sprintf</code><code>(strMousePos,</code><code>"X=%.4f,Y=%.4f"</code><code>, dX, dY);</code>

<code>    </code><code>CString outStr;</code>

<code>    </code><code>outStr = strMousePos;</code>

<code>    </code><code>int</code>

<code>len = outStr.GetLength();</code>

<code>    </code><code>CMainFrame*   pFrame   =   (CMainFrame*)   AfxGetMainWnd();</code>

<code>    </code><code>CMFCStatusBar*   pStatusBar   =   (CMFCStatusBar*)   pFrame-&gt; GetDescendantWindow(AFX_IDW_STATUS_BAR);</code>

<code>    </code><code>pStatusBar-&gt;SetPaneWidth(pStatusBar-&gt;CommandToIndex(IDS_MOUSE_POINT), len * 6);</code>

<code>    </code><code>pStatusBar-&gt;SetPaneText(pStatusBar-&gt;CommandToIndex(IDS_MOUSE_POINT), outStr,TRUE);</code>

<code>}</code>

這樣就完成了,代碼比較簡單,沒寫注釋,不太明白的話可以查一下MSDN

才知道問題原因。

然後在view的消息響應函數中就可以修改了,注意注釋的代碼就是原來修改不成功的代碼。

繼續閱讀