<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    MFC不使用對話框資源模版創建對話框

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 在MFC程序中使用對話框時首先在資源模版里創建對話框資源,然后DoModal()或者CReate顯示出模式對話框或者非模式對話框,這樣創建出的對話框移植性差,從一個工程移動到另一個工程比較麻煩。

        在MFC中還有另一種創建對話框的方法:
    1 在內存中建立對話框資源模版DLGTEMPLATE結構體。
    2 使用InitModalIndirect API函數即可創建模式對話框,非模式對話框使用CreateDialog API函數創建。

    代碼如下:

     

    // 創建內存對話框資源模版類,H文件

    #pragma once

    #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);
    };

    // CPP文件

    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;
    }

    // 例子


    class CMyDlg: public CDialog
    {
    public:
     CMyDlg();
     ~CMyDlg();

    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);
    };

    CMyDlg::CMyDlg()
    {
     m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_APPLICATION);
    }

    CMyDlg::~CMyDlg()
    {

    }

    void CMyDlg::DoDataExchange(CDataExchange* pDX)
    {
    }

    BOOL CMyDlg::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 CMyDlg::OnInitDialog()
    {
     CDialog::OnInitDialog();

     if (m_hIcon)
     {
      SetIcon(m_hIcon, TRUE);   // 設置大圖標
      SetIcon(m_hIcon, FALSE);  // 設置小圖標
     }

     // 創建編輯框
     CRect rect(0,0,50,20);
     if (!m_ctrlEdit.Create(WS_CHILD|WS_VISIBLE|WS_BORDER,rect,this,2))
     {
      return FALSE;
     }

     return TRUE;
    }

    void CMyDlg::OnOK()
    {
     CDialog::OnOK();
    }

     

    useage
    模式
    CMyDlg dlg;
    CString result;
    dlg.CreateModeDlg(_T("123"),CRect(0,0,100,100),this);
    if (IDOK==dlg.DoModal())
    {

    }

    非模式
    CMyDlg dlg;
    CString result;
    if(dlg.CreateModeDlg(_T("123"),CRect(0,0,100,100),FALSE,this))
    {
     dlg.ShowWindow(SW_SHOW);
    }

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全