mfc dialog hide

請問在MFC中

主要的dialog call 第二個dialog

但想把第一個給隱藏

該怎麼做?

另一個問題是

請問2個dialog的edit box的值能不能傳遞?

該怎麼做呢?

Update:

請問怎麼判斷按下了 右上角那個X的結束紐?

代碼是?

例如預設的

確定按鈕就是 IDOK

取消按鈕就是 IDCANCEL

Update 2:

請問MFC中的Thread怎麼使用?

能提供簡單的範例嗎?

Update 3:

我的程式碼

int ret;

CString aa;

ShowWindow(SW_HIDE);

Ctest12Dlg adlg(this);

adlg.m_edit1="12345";

ret=adlg.DoModal(); //產生另一視窗

if (ret == -1)

{

//對話方塊無法正常顯示

}

Update 4:

if (ret == IDOK)

{

//按下確定按鈕後的處理

ShowWindow(SW_RESTORE);

m_edit1.SetWindowText(adlg.m_edit1); //取得另一視窗的資料,前提另一視窗必須是CString型態

}

else if (ret == IDCANCEL)

{

//按下取消按鈕後的處理

ShowWindow(SW_RESTORE);

}

Update 5:

上述那樣子 就可以將主要的隱藏

次要的產生

當次要的結束

主要的恢復

但是只有當按下次要的 確定或取消按鈕才行

按下右上角的X就不行了

所以才問右上角的X的代碼?

Update 6:

再來是將主要跟次要的資料傳遞

將次要的edit box 設成CString 才行用我上述的方法做

如果改成control 也就是CEdit 這樣子的話

adlg.m_edit1="12345";

m_edit1.SetWindowText(adlg.m_edit1);

改成

adlg.m_edit1.SetWindowText("12345");

adlg.m_edit1.GetWindowText(aa);

m_edit1.SetWindowText(aa);

這樣子就會錯耶!

為何?

Update 7:

Thread 我是這樣用

UINT Thread(LPVOID pParam)

{

CTest1Dlg *l_aThread = (CTest1Dlg*)pParam;

return l_aThread->aaa();

}

Update 8:

int CTest1Dlg::aaa()

{

int i;

CString aa;

for(i=0;i<15;i++)

{

m_edit1.SetWindowText((CString)(i+48));

m_edit1.GetWindowText(aa);

m_list1.AddString(aa);

}

return 0;

}

Update 9:

void CTest1Dlg::OnButton11()

{

// TODO: Add your control notification handler code here

AfxBeginThread(Thread,this,THREAD_PRIORITY_NORMAL,0,0,NULL);

}

Update 10:

我這樣用 並沒有關掉

請問該怎麼關閉!!

我這個是看一些網路範例自己修改成簡單測試用的

Update 11:

我知道有UpdateData()的方式傳遞2個Dialog的值

請問能舉例簡單的範例嗎?

Update 12:

還是說UpdateData()不是用在這的?

那UpdateData()的使用是什麼?

不太懂!

我的書說明很短就帶過去了

Update 13:

to wanwan.yu

我使用你說的Thread

class CThreadProc : public CWinThread

{

if (m_chkbox2.GetCheck() == 1)

{

m_list1.AddString("1");

m_chkbox2.SetCheck(0);

}

}

Update 14:

void CTest1Dlg::OnButton12()

{

// TODO: Add your control notification handler code here

AfxBeginThread(RUNTIME_CLASS(CThreadProc) );

}

結果錯誤7項

怪怪的!

我不會用!

Update 15:

發現我用錯了

是個CLASS

那我改成.....

怎麼改都有問題!

不會改!

Update 16:

改成空的應該可以吧!

class CThreadProc : public CWinThread

{

};

還是有錯誤!

Update 17:

改成空的變成錯在

AfxBeginThread(RUNTIME_CLASS(CThreadProc) );

顯示classCThreadProc並不是CThreadProc的成員

請求高手解惑!

完全不會用!!

Update 18:

那我就改他一個classCThreadProc的成員

錯誤又換成

rror C2440: 'type cast' : cannot convert from 'void (__thiscall CThreadProc::*)(void)' to 'struct CRuntimeClass *'

There is no context in which this conversion is possible

Update 19:

to wanwan.yu

你說的

宣告兩個public *,

當物件生成時就把指標存進public *中,

意思是說

在A跟B的 dialog.h裡面都宣告一個指標變數

然後A跟B dialog.cpp 都互相引用對方的.h

這樣就能相互使用這個變數是這樣嗎?

3 Answers

Rating
  • 1 decade ago
    Favorite Answer

    請問在MFC中

    主要的dialog call 第二個dialog

    但想把第一個給隱藏

    該怎麼做?

    A:用modeless dialog,就是

    CDialog2 adlg2;

    adlg2=new CDialog2(......);

    adlg2.ShowWindow(SW_SHOW);

    CDialog1 adlg1=new CDialog1(......);

    adlg1.SetDialog2(adlg2);

    adlg1.ShowWindow(SW_SHOW);

    CDialog2* m_adlg2;//in CDialog1;

    void CDialog1::SetDialog2(CDialog2* adlg2)

    {

    m_adlg2=adlg2;

    }

    void CDialog1::CloseDialog2()

    {

    m_adlg2.ShowWindow(SW_HIDE);

    }

    void CDialog2::SendEdit()

    {

    WCHAR str[MAXPATH];

    m_adlg2.EditControl1.GetWindowText(str);

    EditControl1.SetWindowText(str);

    }

    一個問題是

    請問2個dialog的edit box的值能不能傳遞?

    該怎麼做呢?

    SendMessage或傳另一個dialog的pointer給另一個(如上)

    我建議你程式還不熟的時候先不要用thread,等你對thread很了解的時候再用,你可以買MFC相關的書來看,都應該有介紹到thread,"精通 視窗程式設計"這本書有出到2008版,你可以參考一下

    2009-05-12 20:48:51 補充:

    DoModal是Modal,就是必須等到使用者按下ok或cancel

    Modeless不用等使用者按下ok或cancel,只要用ShowWindow(SW_SHOW)或ShowWindow(SW_HIDE)就可以顯示與隱藏

  • 1 decade ago

    好難懂!

    我在第一視窗產生第二視窗

    好像只能用DoModal的方法

    第一視窗才能用ShowWindow的方法耶!

    我在試試看!

  • 1 decade ago

    你顯然對win32的create視窗方式不很熟.

    CDialog也是CWnd的一種,找到宣告改一改就行了.

    x的呼叫有好幾個,串在WM_DESTORY試試吧.

    CThread大約是這樣使用

    // call 的一方

    AfxBeginThread(RUNTIME_CLASS(CThreadProc) );

    // 被call的thread

    class CThreadProc : public CWinThread{...}

    2009-05-06 22:59:39 補充:

    記得thread自己要能有自己結束得乾乾淨淨的機制,

    因為thread要靠別的thread來結束會很麻煩.

    2009-05-06 23:03:54 補充:

    兩個editbox可以收到變動後,

    主動去更新另一個的變數,然後更叫另一個editbox自己再show一次自己.

    2009-05-07 11:01:50 補充:

    你在reource editor裡找到訊息選項,不是在事件選項裡,

    點了後會有個OnDestroy的函數,覆寫它就行了.

    訊息和win32 sdk的行為是一樣的.

    2009-05-07 11:36:56 補充:

    你不能在thread使用原來的訊息或物件,它看不見的.

    常見用法該是當thread啟動時,主動送一個訊息給原來的程式處理,

    用postmessage或sendmessage試試,

    thread要看成一個完全獨立的程式,與原程式一點關係也沒有,

    要和原程式溝通就要使用行程通訊,沒有捷徑.

    2009-05-07 11:43:56 補充:

    CThreadProc是我用CWinThread繼承出來的class,

    只要是用CWinThread繼承出來的class都很方便可以用在thread裡,

    關鍵只在於宣告項DECLARE_DYNCREATE(...)

    這是用在多人伺服器常有user進進出出最方便的動態thread生成方法.

    2009-05-07 12:24:10 補充:

    兩個看不見對方的物件彼此要互通多半是靠public.

    宣告兩個public *,

    當物件生成時就把指標存進public *中,

    這樣就可以方便使用另一個物件的一切功能.

    我習慣會把所有public放同file.*都設成void *

    想使用的地方再轉換成合適的type指標,免去include與宣告的麻煩.

    2009-05-09 05:52:06 補充:

    A.cpp

    extern void *ptr; // 告訴compiler變數宣告在別的地方

    CEdit aa;

    ptr=(void *)&aa; // 將editbox的指標保存下來

    B.cpp

    public void *ptr; // public變數會在程式載入就佔了位址

    ...

    ...

    // 要用時先確定A.cpp執行過.

    CEdit *bb=(CEdit *)ptr;

    bb->setwinxxx // 當自己的editbox用吧

    2009-05-09 05:57:13 補充:

    你想知道的不是隱藏,而是按x後沒法知道,

    這是windows的訊息,

    當按下x後系統會丟出好幾個訊息,

    其中有一個會是WM_DESTROY.

    WM_RESTROY在MFC的frame被遇先寫成叫用OnDestroy()

    你可以覆寫這訊息處理函數,也可以欄走x的功能.

Still have questions? Get your answers by asking now.