2014-02-12 72 views
0

我試圖從我的客戶端矩形中使用成員變量,但他們持有極其負值,如-858993460。即使當我調用rect.Width()時,它也會返回一個極其負數的數字。當我選擇我在屏幕上繪製的波時,我需要這些值來確定要播放的波形文件的相應部分。有誰會碰巧知道爲什麼可以這樣做?CRect成員變量有奇怪的值

注意:爲了看看它們保留的是什麼值,我拋出了int的右,左和寬。我真的只需要rect.Width()來縮放選擇,以便能夠訪問我的wave文件的數據數組。

void CWaveEditView::OnToolsPlay32775() 
{ 
    // TODO: Add your command handler code here 
    CWaveEditDoc* pDoc = GetDocument(); 
    ASSERT_VALID(pDoc); 
    if(!pDoc){ 
     return; 
    } 
    if(pDoc->wave.hdr==NULL){ 
     return; 
    } 
    if(selectionStart!=selectionEnd){ 
     CRect rect; 
     GetClientRect(&rect); 
     rect.NormalizeRect(); 
     int right = rect.right; 
     int left = rect.left; 
     int width = rect.Width(); 
     int startms=(1000.0*pDoc->wave.lastSample/pDoc->wave.sampleRate)*selectionStart/rect.Width(); 
     int endms=(1000.0*pDoc->wave.lastSample/pDoc->wave.sampleRate)*selectionEnd/rect.Width(); 
     WaveFile * selection = new WaveFile(pDoc->wave.numChannels, pDoc->wave.sampleRate, pDoc->wave.bitsPerSample); 

     while(startms<=endms){ 
      selection->add_sample(pDoc->wave.get_sample(startms)); 
      startms++; 
     } 
     selection->updateHeader(); 
     selection->play(); 
     delete selection; 
    } 
+4

-858993460是0xCCCCCCCC,這是調試器表達「未初始化的變量」的方式。我的猜測是'GetClientRect'調用由於某種原因失敗,並且使'rect'未初始化。或許你的觀點在某種程度上目前還沒有一個有效的'HWND'。 –

+0

你知道會導致什麼嗎?我的觀點工作得很好,因爲它吸收了它應有的一切。 – Otto45

+1

那麼,你可以先檢查'GetClientRect'的返回值,如果失敗,用'GetLastError'檢查原因。 –

回答

0

CRect的默認構造函數不會初始化其成員(因爲它是RECT結構的薄包裝)。您可以將它初始化爲(0,0,0,0),並在您調用GetClientRect之後檢查它是否爲空。

由於GetClientRect似乎失敗,您可能需要使用GetSafeHwnd()檢查窗口句柄是否有效。

+0

請注意:從Visual Studio 2013開始,'CRect'的默認構造函數實際上將其成員初始化爲零。文檔仍然不正確(甚至VS2017文檔),但查看源代碼(atltypes.h)證明'CRect :: CRect()'將所有成員設置爲零。 – zett42