2015-10-22 122 views
1

我有什麼應該是一個非常簡單的目標,但它似乎棘手。我必須得到一些精確大小的屏幕圖像文件,所以我認爲這是有道理的,添加一個控件來調整我的應用程序的窗口的大小,我想要的確切尺寸。Windows API SetWindowSize()似乎沒有效果

我正在使用VS2010。

下面是從我的嚮導生成對話框中的相關代碼:

DlgSetWindowSize::DlgSetWindowSize(CWnd* pParent /*=NULL*/) 
    : CDialogEx(DlgSetWindowSize::IDD, pParent) 
{ 
    m_width = 0; 
    m_height = 0; 
    m_parent = pParent; 
} 

void DlgSetWindowSize::OnBnClickedOk() 
{ 
    CDialogEx::OnOK(); 
    SetWindowPos(m_parent, 0, 0, m_width, m_height, SWP_NOMOVE|SWP_NOZORDER|SWP_NOOWNERZORDER); 
} 

,這裏是對它的調用:

void CMyAppView::OnWindowSize() 
{ 
    DlgSetWindowSize d(this); 
    if (IDOK == d.DoModal()) 
    { 
     Invalidate(); 
    } 
} 

SetWindowPos返回一個非零值,表明成功根據文檔(click here)。當然,在運行對話框時,我輸入我想要的寬度和高度的像素值。調試器驗證預期值是傳遞給SetWindowPos,還有SetWindowPos給出非零返回。位於SetWindowPos的最後一個參數中的位開關被設置爲忽略位置參數,並且只在該調用中表示size參數,以便窗口的大小可以根據需要調整,而不必改變位置。

一切似乎都是按順序的,但窗口大小不變。我已經將這個邏輯應用到了我的應用程序的文檔窗口中,並且當它不起作用時,我也將它應用於應用程序的MainFrame窗口。零動作。

我在這裏錯過了什麼,或者是否有一些完全不同的方法我應該使用?

回答

2

通過使用CDialogEx和命名約定來判斷,我猜你正在使用MFC,對吧?

您對SetWindowPos()的調用在對話窗口本身上運行,因爲這是一個類方法。

如果你想打電話給父母的SetWindowPos(),你可以這樣做:

m_parent->SetWindowPos(0, 0, 0, m_width, m_height, 
SWP_NOMOVE|SWP_NOZORDER|SWP_NOOWNERZORDER); 

同時請注意,在MFC文檔 - 視圖架構,該文件沒有一個窗口。

或者,您可以用Win API調用:

::SetWindowPos(m_parent->GetSafeHwnd(), 0, 0, 0, m_width, m_height, 
SWP_NOMOVE|SWP_NOZORDER|SWP_NOOWNERZORDER); 
+0

是的,我應該提到MFC和窗戶是我的文檔的查看窗口。你在所有方面都是正確的。當您應用於CMainFrame窗口時,您所陳述的解決方案都可以正常工作。 – vacuumhead

+0

奇怪的是,當我將您的解決方案應用於文檔的「視圖」窗口時,滾動條以新大小重新繪製,但視圖的可視邊框仍然擴展到MainFrame視圖的邊緣。 – vacuumhead

+0

@vacuumhead - 當時在您的主機中最大化了View嗎?或者它是一個單文檔(SDI)界面,它是唯一的選擇? –