背景:
mfc工具帶有tab標籤,作為導航。需要在對話方塊初始化時進行初始化。
實現此功能需要做如下事情:
下面先列出原始版本,分析問題,再解決問題。
本文省略mfc控制項布局的說明。
namespace nsonvif ;
} std::vectorm_pvpage;
nsonvif::page_type m_ncurtab;
cdiscover m_cdlgdiscover;
cdeviceservice m_cdlgdevice;
cmediaservice m_cdlgmedia;
cimagingservice m_cdlgimaging;
cdebuginfo m_cdlgdebug;
ctabctrl m_ctrtab;
使用m_pvpage存放子對話方塊指標。m_cdlg開頭的變數為子對話方塊。m_ctrtab為tab控制項關聯的類。
m_ctrtab.insertitem(0, "discover");
m_ctrtab.insertitem(1, "device");
m_ctrtab.insertitem(2, "media");
m_ctrtab.insertitem(3, "imaging");
m_ctrtab.insertitem(4, "debug");
m_pvpage.resize(nsonvif::page_max);
m_cdlgdiscover.create(idd_dlg_discover, &m_ctrtab);
m_pvpage[nsonvif::page_discover] = &m_cdlgdiscover;
m_cdlgdiscover.setonvifproxy(&m_cproxy);
m_cdlgdevice.create(idd_dlg_device, &m_ctrtab);
m_pvpage[nsonvif::page_device] = &m_cdlgdevice;
m_cdlgdevice.setonvifproxy(&m_cproxy);
m_cdlgmedia.create(idd_dlg_media, &m_ctrtab);
m_pvpage[nsonvif::page_media] = &m_cdlgmedia;
m_cdlgmedia.setonvifproxy(&m_cproxy);
m_cdlgimaging.create(idd_dlg_imaging, &m_ctrtab);
m_pvpage[nsonvif::page_imaging] = &m_cdlgimaging;
m_cdlgimaging.setonvifproxy(&m_cproxy);
m_cdlgdebug.create(idd_dlg_debug, &m_ctrtab);
m_pvpage[nsonvif::page_debug] = &m_cdlgdebug;
m_cdlgdebug.setonvifproxy(&m_cproxy);
crect rc;
m_ctrtab.getclientrect(rc);
rc.top += 22;
rc.bottom -= 1;
rc.left += 1;
rc.right -= 1;
for (unsigned int i = 0; i < m_pvpage.size(); i++)
// first page
m_ncurtab = nsonvif::page_discover;
m_pvpage[m_ncurtab]->showwindow(sw_show);
即新增ontcnselchangetab事件並實現
void convifclientdlg::ontcnselchangetab(nmhdr *pnmhdr, lresult *presult)
原始版本的**有點死板,不夠靈動:
std::vectorm_pvpage;
int m_ncurtab; // 直接用int即可
cdiscover m_cdlgdiscover;
cdeviceservice m_cdlgdevice;
cmediaservice m_cdlgmedia;
cimagingservice m_cdlgimaging;
cdebuginfo m_cdlgdebug;
ctabctrl m_ctrtab;
初始化
struct cdlgctrl_t ;
lpctstr lpname[10]; // make bigger...
int i = 0;
lpname[i++] = l"discover";
lpname[i++] = l"device";
lpname[i++] = l"media";
lpname[i++] = l"imaging";
lpname[i++] = l"debug";
i = 0;
struct cdlgctrl_t dlgctrls[10]; // make bigger...
dlgctrls[i].name = lpname[i];
dlgctrls[i].dlg = &m_cdlgdiscover;
dlgctrls[i].id = idd_dlg_discover;
dlgctrls[++i].name = lpname[i];
dlgctrls[i].dlg = &m_cdlgdevice;
dlgctrls[i].id = idd_dlg_device;
dlgctrls[++i].name = lpname[i];
dlgctrls[i].dlg = &m_cdlgmedia;
dlgctrls[i].id = idd_dlg_media;
dlgctrls[++i].name = lpname[i];
dlgctrls[i].dlg = &m_cdlgimaging;
dlgctrls[i].id = idd_dlg_imaging;
dlgctrls[++i].name = lpname[i];
dlgctrls[i].dlg = &m_cdlgdebug;
dlgctrls[i].id = idd_dlg_debug;
crect rc;
m_ctrtab.getclientrect(rc);
rc.top += 22;
rc.bottom -= 1;
rc.left += 1;
rc.right -= 1;
m_pvpage.resize(i+1);
for (unsigned int i = 0; i < m_pvpage.size(); i++)
m_ncurtab = 0;
m_pvpage[m_ncurtab]->showwindow(sw_show);
void convifclientdlg::ontcnselchangetab(nmhdr *pnmhdr, lresult *presult)
相對而言,改良後的**更好維護。
在初始化時,遍歷每個子對話方塊,並呼叫 create 建立視窗,注意,此時會呼叫到子對話方塊的oninitdialog函式(哪怕當時沒有顯示出來)。
當切換 tab 時,子對話方塊並不會再次初始化。因此,需要在切換響應函式 ontcnselchangetab 中顯示進行。示例如下:
void convifclientdlg::ontcnselchangetab(nmhdr *pnmhdr, lresult *presult)
}}
注:是否可以直接呼叫子對話方塊的 oninitdialog 函式,未測試。 MFC 控制項初始化的過程
之前為了學習mfc下瀏覽器的用法,參考博文 雖然按照作者的方法實現了瀏覽器的功能,但是作者在on size訊息中調整瀏覽器控制項大小的方法出現斷言錯誤,主要錯誤如下 在進入到下面函式段時,setwindowpos 出現錯誤。錯誤在此處,assert iswindow m hwnd m pctrlsi...
有關引用型別陣列初始化的一點總結
由於這節課因故沒有去上的緣故,在日後的程式設計中,我便飽受空指標異常之苦。因此,我很有必要把這個知識點寫成總結放在這裡。不同於值型別陣列的初始化,引用型別陣列的初始化時,其每個元素的初始值都是null。如我們定義乙個類student,其元素為int型的屬性age,以及string型的屬性name。即...
mtk平台關於lcm初始化code的一點總結
最近公司有個專案需要更換lcm,差別如下 原屏mipi 4lane 1280 720 新屏mipi 2lane 800 480 區別很少,按理說最多2天就能亮,結果沒有按理,折騰了8,9天,最後經fae指點發現平台mipi傳送code的方式有坑,又漲姿勢了,總結一下。mipi傳送初始化code有兩種...