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()/3,SWP_NOACTIVATE | SWP_NOZORDER);
    m_static.SetWindowPos(this,rectClient.left,rectClient.top+height,rectClient.Width(),rectClient.Height()/3,SWP_NOACTIVATE | SWP_NOZORDER);
    m_objectDlg.SetWindowPos(this,rectClient.left,rectClient.top+height*2,rectClient.Width(),rectClient.Height()/3,SWP_NOACTIVATE | SWP_NOZORDER);

}

int CObjectWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDockablePane::OnCreate(lpCreateStruct) == -1)
        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, 1))
    {
        TRACE0("未能創建CEdit控件 \n");
        return -1;      // 未能創建
    }


    if(!m_static.Create(NULL,dwViewStyle,rectDummy,this,6))
    {
        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: 在此處添加消息處理程序代碼
}

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

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章