MFC動態建立dialog,純程式碼建立dialog
阿新 • • 發佈:2018-11-09
參考:https://www.cnblogs.com/lidabo/p/3447007.html
大概思路:新增一個類,作為對話方塊模板
DlgTemplate.h
#pragma once #include "afx.h" #define DLG_TEMPLATE_BUFFER_MAX_LENGT 1024 class CDlgTemplate { public: CDlgTemplate(int nBufferLength = DLG_TEMPLATE_BUFFER_MAX_LENGT); ~CDlgTemplate(); private: WORD* m_pBuffer; public: DLGTEMPLATE* CreateTemplate(DWORD dwStyle, CRect& rect, CString strCaption, DWORD dwStyleEx = 0); };
DlgTemplate.cpp
#include "DlgTemplate.h" CDlgTemplate::CDlgTemplate(int nBufferLength) { m_pBuffer = new WORD[nBufferLength]; if ((!m_pBuffer) || (DLG_TEMPLATE_BUFFER_MAX_LENGT > nBufferLength)) { exit(0); } } CDlgTemplate::~CDlgTemplate() { if (m_pBuffer) { delete m_pBuffer; m_pBuffer = NULL; } } DLGTEMPLATE* CDlgTemplate::CreateTemplate(DWORD dwStyle, CRect& rect, CString strCaption, DWORD dwStyleEx) { WORD* pTemp = m_pBuffer; DLGTEMPLATE* pDlgTemp = (DLGTEMPLATE*)pTemp; // 對話方塊模版 pDlgTemp->style = dwStyle; pDlgTemp->dwExtendedStyle = dwStyleEx; pDlgTemp->cdit = 0; pDlgTemp->cx = rect.Width(); pDlgTemp->cy = rect.Height(); pDlgTemp->x = (short)rect.left; pDlgTemp->y = (short)rect.top; pTemp = (WORD*)(pDlgTemp + 1); // 選單 *pTemp++ = 0; // class *pTemp++ = 0; // caption wcscpy((WCHAR*)pTemp, strCaption); pTemp += strCaption.GetLength() + 1; // font return pDlgTemp; }
自己的對話方塊
myDlg.h
#pragma once #include <afxdialogex.h> #include "DlgTemplate.h" class myDlg : public CDialog { public: myDlg(); ~myDlg(); public: BOOL CreateModeDlg(CString strCaption, CRect rect, BOOL bMode = TRUE, CWnd* pParent = NULL); private: CDlgTemplate m_dlgTemp; CEdit m_ctrlEdit; private: HICON m_hIcon; enum { IDICON = 1 }; virtual BOOL OnInitDialog(); virtual void OnOK(); virtual void DoDataExchange(CDataExchange* pDX); };
myDlg.cpp
#include "myDlg.h"
#include "commonlog.h"
#include "DlgTemplate.h"
myDlg::myDlg()
{
m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_APPLICATION);
}
myDlg::~myDlg()
{
}
void myDlg::DoDataExchange(CDataExchange* pDX)
{
}
BOOL myDlg::CreateModeDlg(CString strCaption, CRect rect, BOOL bMode, CWnd* pParent)
{
BOOL bResult = FALSE;
DLGTEMPLATE* pTemp = NULL;
pTemp = m_dlgTemp.CreateTemplate(WS_POPUPWINDOW | DS_MODALFRAME | WS_CAPTION, rect, strCaption);
if (bMode)
{
bResult = InitModalIndirect(pTemp, pParent);
}
else
{
bResult = CreateIndirect(pTemp, pParent);
}
return bResult;
}
BOOL myDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_hIcon)
{
SetIcon(m_hIcon, TRUE); // 設定大圖示
SetIcon(m_hIcon, FALSE); // 設定小圖示
}
return TRUE;
}
void myDlg::OnOK()
{
CDialog::OnOK();
}
呼叫模態對話方塊:
myDlg am;
am.CreateModeDlg(_T("ttt"), CRect(0, 0, 100, 100), TRUE, this);
am.DoModal();
DoModal()有返回值,可以處理一下
對用非模態對話方塊
就是bMode改為false
顯示就是am.ShowWindow(SW_SHOW);