MFC中对话框类型为 Popup 如何动态的改变为child类型并内嵌到别的对话框中

#pragma pack(push, 1)
typedef struct {
    WORD   dlgVer;
    WORD   signature;
    DWORD  helpID;
    DWORD  exStyle;
    DWORD  style;
    WORD   cDlgItems;
    short  x;
    short  y;
    short  cx;
    short  cy;
#if 0
    WORD   menu;       // if this word=0 no menu elseif this=0xFFFF follows another word stand for ID
    WORD   windowClass;// elseif not 0 | not -1 then follows the name
    WCHAR  title[1];   // title string of the dialog box
    short  pointsize;  // only if DS_SETFONT flag is set
    short  weight;     // only if DS_SETFONT flag is set
    short  bItalic;    // only if DS_SETFONT flag is set
    WCHAR  font[];     // typeface name, if DS_SETFONT is set
#endif
} DLGTEMPLATEEX, *LPDLGTEMPLATEEX;
//
typedef struct {
    DWORD  helpID;
    DWORD  exStyle;
    DWORD  style;
    short  x;
    short  y;
    short  cx;
    short  cy;
    DWORD  id;//not WORD !
#if 0
    WORD windowClass; // name or ordinal of a window class
    WORD title;       // title string or ordinal of a resource
    WORD extraCount;  // bytes? of following creation data
#endif
}DLGITEMTEMPLATEEX, *LPDLGITEMTEMPLATEEX;
#pragma pack()

//Make point DWORD alignment
LPDWORD lpdwAlign(LPDWORD lpIn)
{
    ULONG ul;
    ul = (ULONG)lpIn;
    ul += 3;
    ul >>= 2;
    ul <<= 2;
    return((LPDWORD)ul);
}

#define TEMPLATE_SIZE 2048  // increate it if the dlg has many items
BOOL CDlgExceptionData::ChangeDlgStyle(int resInt, CDialogEx *pDlg)
{
    if (NULL == pDlg)
    {
        return FALSE;
    }

    HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(resInt), RT_DIALOG);
    HRSRC hRes = ::FindResource(hInst, MAKEINTRESOURCE(resInt), RT_DIALOG);
    HGLOBAL hTemplate = ::LoadResource(hInst, hRes);
    DLGTEMPLATEEX *pTemplate = (DLGTEMPLATEEX *)LockResource(hTemplate);
    HWND hDlg = 0;
    BYTE *pByte = new BYTE[TEMPLATE_SIZE];
    //
    if (pTemplate->signature == 0xFFFF)
    {//ex
        DLGTEMPLATEEX *pNewTmp = (DLGTEMPLATEEX *)lpdwAlign((LPDWORD)pByte);
        CopyMemory(pNewTmp, pTemplate, TEMPLATE_SIZE);
        pNewTmp->style &= ~WS_CAPTION;
        pNewTmp->style &= ~DS_MODALFRAME;
        pNewTmp->style &= ~WS_POPUP;
        pNewTmp->style &= ~WS_VISIBLE;
        pNewTmp->style &= ~WS_BORDER;
        pNewTmp->style |= WS_CHILD;
        hDlg = CreateDialogIndirect(hInst,     // handle to application instance
            (const DLGTEMPLATE *)pNewTmp, // pointer to dialog box template
            this->m_hWnd, // handle to owner window
            0);           // pointer to dialog box procedure
    }
    else
    {//
        DLGTEMPLATE *pNewTmp = (DLGTEMPLATE *)lpdwAlign((LPDWORD)pByte);
        CopyMemory(pNewTmp, pTemplate, TEMPLATE_SIZE);
        pNewTmp->style &= ~WS_CAPTION;
        pNewTmp->style &= ~DS_MODALFRAME;
        pNewTmp->style &= ~WS_POPUP;
        pNewTmp->style &= ~WS_VISIBLE;
        pNewTmp->style &= ~WS_BORDER;
        pNewTmp->style |= WS_CHILD;
        hDlg = CreateDialogIndirect(hInst,     // handle to application instance
            (const DLGTEMPLATE *)pNewTmp, // pointer to dialog box template
            this->m_hWnd, // handle to owner window
            0);           // pointer to dialog box procedure
    }
    UnlockResource(hTemplate);
    FreeResource(hTemplate);
    delete[] pByte;
    //
    if (hDlg)
    {
        pDlg->SubclassWindow(hDlg);
        return TRUE;
    }

    return FALSE;

}


//实例

在头文件中声明

CDlgImgManager                     m_dlgImgShowManager;


在cpp的 OnInitDialog()中加入

if (!m_dlgImgShowManager.m_hWnd)
    {
        ChangeDlgStyle(CDlgImgManager::IDD, &m_dlgImgShowManager);  //改变串口类型为 child
        //m_dlgImgShowManager.SetDlgPopUpFlag(FALSE);   
        m_dlgImgShowManager.OnInitDialog();

       m_dlgImgShowManager.ShowWindow(SW_SHOW);

    }


m_dlgImgShowManager.MoveWindow(rectImgShowDlg);


//当模态对话框使用方法 依旧





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wumingqilin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值