由于這個問題困擾了我很長時間,所以我寫詳細一點,求大牛解答
廠家提供的demo, 是在主對話框中獲取主表單的各個控制元件上的默認值,比如一些初始化時寫進去的地址什么的,設備型號等;
現在我想修改在子表單中。就是我現在有個主表單,在主表單上面設定了一個按鈕,點擊此按鈕時,可以彈出子表單,然后在子表單上添加廠家提供的代碼。添加代碼的時候就遇到一個問題;
原代碼中用到一個陳述句:CAtPipDlg *dlg = (CAtPipDlg*) AfxGetApp()->GetMainWnd(); CAtPipDlg就是主表單類, 通過這句話,在指標dlg中寫入了很多值,其中就有我最需要的list control控制元件的東西,同時我也要往這里寫東西;
但是我現在要在子表單中使用,在使用上面這句話,完全獲取不到子表單各控制元件的默認值,而且CListCtrl 類對應的w_hWnd句柄對應的地址也是0x00000000,如果我要在子表單中完成類似這句 CAtPipDlg *dlg = (CAtPipDlg*) AfxGetApp()->GetMainWnd(); 的功能的話,我該怎么修改,求大牛指點。
uj5u.com熱心網友回復:
我已經試過 GetForegroundWindow(); GetActiveWindow();都獲取不到想要的結果;uj5u.com熱心網友回復:
用 Create 創建(非模態) 或 DoModal (模態)類似
CAtPipDlg *dlg = new CAtPipDlg;
dlg->DoModal();
delete dlg;
uj5u.com熱心網友回復:
這幾句代碼在哪里添加?是子表單里面 還是 主表單里面?
uj5u.com熱心網友回復:
彈出子表單 后 子表單 就是 控制元件的 容器 , 要 通過 子表單 來得到 控制元件uj5u.com熱心網友回復:
又試了一下,算是突然想到的一點想法吧,把問題解決了;解決程序如下:
先說明 CAtPipDlg為主表單類,CTestDlg為子表單類;
如果你想在子表單的執行緒函式中,仍然獲取子表單上各個控制元件的默認值,或者使用List control控制元件接收并顯示重繪資料;
首先,在你的主表單的頭檔案中,比如 CAtPipDlg.h中的CAtPipDlg中添加 CTestDlg m_testdlg;(可以為Public),
然后,我這邊是通過點擊一個按鈕彈出子對話框的,使用的是這兩句:CTestDlg dlg; dlg.DoModal();
現在不要再使用上面兩句了,要使用這兩句:m_testdlg.Create(IDD_TEST_DIALOG, this); m_testdlg.ShowWindow(SW_SHOW); 其中IDD_TEST_DIALOG 是你子表單的ID(看表單屬性就知道)。
然后,在你的執行緒函式中,仍然使用CAtPipDlg *dlg = (CAtPipDlg*) AfxGetApp()->GetMainWnd(); 這句話,你會發現,dlg中的成員m_testdlg已經包含了子表單上面所有的默認值,美滋滋;可能表達的不清楚;下面簡單貼一點代碼:
先在CAtPipDlg.h中添加:
class CAtPipDlg::public CDialog
{
/...../
public:
CTestDlg m_testdlg;
/..../
}
你點按鈕彈出子表單的函式:
在CAtPipDlg.cpp中
void CAtPipDlg::button1()
{
m_testdlg.Create(IDD_TEST_DIALOG, this);
m_testdlg.ShowWindow(SW_SHOW);//如果第二次按按鈕程式崩潰的話,自己解決吧。0.0
}
在子表單CTestDlg.cpp中,添加
void CTestDlg::ReciveThread()//或者是你需要的函式
{
CAtPipDlg *dlg = (CAtPipDlg*) AfxGetApp()->GetMainWnd();
dlg->m_testdlg;//這里就是我想要的東西了,接下來可以進行一系列的操作了,啦啦啦;
}
以上獻給像我一樣水平比較差的同學。
uj5u.com熱心網友回復:
你可以在子視窗某一個函式中給主視窗發送訊息,將相關的資料傳遞給主視窗~轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/35251.html
