天天看點

MFC基礎知識(六)——停靠視窗中添加控件

本文主要介紹:在MFC建立的停靠視窗中添加一些控件,浮動視窗中可以添加MFC自身的控件,也可以添加對話框。

一、建立對話框

對話框屬性做以下修改:

MFC基礎知識(六)——停靠視窗中添加控件

二、視窗中添加控件

ObjectWnd.h檔案:

#pragma once
#include "afxdockablepane.h"
#include "ObjectDlg.h"
#include "afxwin.h"

class CObjectWnd :
    public CDockablePane
{
public:
    CObjectWnd(void);
    ~CObjectWnd(void);
    DECLARE_MESSAGE_MAP()
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnDestroy();


    CEdit m_edit;
    CStatic m_static;
    CObjectDlg m_objectDlg; //對話框類

    void AdjustLayout();

};
           

ObjectWnd.cpp檔案:

#include "stdafx.h"
#include "ObjectWnd.h"
#include "resource.h"

CObjectWnd::CObjectWnd(void)
{
}


CObjectWnd::~CObjectWnd(void)
{
}

BEGIN_MESSAGE_MAP(CObjectWnd, CDockablePane)
    ON_WM_CREATE()
    ON_WM_SIZE()
    ON_WM_DESTROY()
END_MESSAGE_MAP()


void CObjectWnd::AdjustLayout()
{
    if (GetSafeHwnd () == NULL || (AfxGetMainWnd() != NULL && AfxGetMainWnd()->IsIconic()))
    {
        return;
    }
    CRect rectClient;
    GetClientRect(rectClient);

    int height = rectClient.Height()/3;
    //控件在視窗中所占空間大小
    m_edit.SetWindowPos(this,rectClient.left,rectClient.top,rectClient.Width(),rectClient.Height()/,SWP_NOACTIVATE | SWP_NOZORDER);
    m_static.SetWindowPos(this,rectClient.left,rectClient.top+height,rectClient.Width(),rectClient.Height()/,SWP_NOACTIVATE | SWP_NOZORDER);
    m_objectDlg.SetWindowPos(this,rectClient.left,rectClient.top+height*,rectClient.Width(),rectClient.Height()/,SWP_NOACTIVATE | SWP_NOZORDER);

}

int CObjectWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDockablePane::OnCreate(lpCreateStruct) == -)
        return -1;


    CRect rectDummy;
    rectDummy.SetRectEmpty();

    // 建立組合:
    const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

    if (!m_edit.Create(dwViewStyle, rectDummy, this, ))
    {
        TRACE0("未能建立CEdit控件 \n");
        return -1;      // 未能建立
    }


    if(!m_static.Create(NULL,dwViewStyle,rectDummy,this,))
    {
        TRACE0("未能建立CStatic控件\n");
        return -1; // 未能建立
    }

    // 建立對話框視窗:
    if (!m_objectDlg.Create(IDD_ObjectDlg,this))
    {
        TRACE0("未能建立對話框視窗\n");
        return -1;      // 未能建立
    }
    m_objectDlg.ShowWindow(SW_SHOW);
    AdjustLayout();

    //m_edit.SetWindowText(_T("CEdit控件"));
    //m_static.SetWindowText(_T("CStatic控件"));

    return 0;
}


void CObjectWnd::OnSize(UINT nType, int cx, int cy)
{
    CDockablePane::OnSize(nType, cx, cy);

    AdjustLayout();
}


void CObjectWnd::OnDestroy()
{
    CDockablePane::OnDestroy();
    m_objectDlg.DestroyWindow();
    // TODO: 在此處添加消息處理程式代碼
}

           

三、添加完成,運作如下:

MFC基礎知識(六)——停靠視窗中添加控件