2012-09-08 21 views
2

我的mfc程序在客戶區中繪製了以下形狀 - 現在我想在此旁邊放置一個按鈕以重新排列形狀。如何在MFC應用程序中放置按鈕?

enter image description here

我知道我可以使用一個工具欄或菜單按鈕,但有什麼辦法可以把旁邊的盒子上的按鈕?是這樣的:

enter image description here

回答

5

所有你需要做的就是創建一個CButton,並適當地定位它。

//.h 
#define MYBUTTONID 10000 //or whatever doesn't conflict with your existing resources 

public class CMyVew : public CView 
{ 
    CButton m_Button; 

    virtual void OnInitialUpdate(); 
    void RepositionButton(); 
} 

//.cpp 
void CMyVew::OnInitialUpdate() 
{ 
    //this creates the actual button GUI window 
    m_Button.Create("Rearrange", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(0,0,0,0), this, MYBUTTONID); 
    RepositionButton(); 
} 

void CMyVew::RepositionButton() 
{ 
    //work out button position you need 
    m_Button.MoveWindow(x, y, width, height); 
} 

請注意,該按鈕只創建一次,並負責繪圖本身。你不需要擔心它在OnDraw()或類似的東西。

你唯一需要擔心的是按鈕應該移動的位置。這就是爲什麼我將RepositionButton()函數分離出來的原因。例如,如果您使用的是CScrollView和用戶滾動,按鈕窗口沒有這方面的知識,所以你需要作出反應,滾動事件,並呼籲RepositionButton()

可以反應按鈕的信息,就像你任何其他按鈕通過添加ON_BTN_CLICKED消息映射。

+0

你好,Gaz,我正在製作一個sdi MFC解決方案。我按照你的建議創建按鈕時沒有問題,但是當我單擊「創建新文檔」時,那些代碼m_Button.Create(...)將再次運行,然後我在該行出現錯誤。如何解決它?或者我不應該那樣使用它? – sflee

0

您可以通過使用Windows API創建自己的按鈕。最主要的是獲取客戶區的窗口句柄,然後在創建按鈕時使用它作爲父句柄。

例如,下面是使用Windows API創建按鈕的示例。

Create()方法是CWnd類的一部分。

CRect windRect (xColumn, xRow, xColumn + nWidth, xRow + nHeight); 
Create (_T("BUTTON"), myCaption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_MULTILINE, windRect, pParentWnd, m_myId); 

您將需要知道多大和高度來製作按鈕以及標識符。該id是需要的,以便您可以在父窗口上找到它並處理來自按鈕操作的消息。

看看Windows API documentation on CreateWindow

+0

CButton有問題嗎? – GazTheDestroyer

+1

但我怎樣才能做到這一點與MFC? – Ghost

相關問題