MFC筆記 初始化tab控制項一點改進

2021-10-01 15:29:21 字數 3986 閱讀 9303

背景:

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有兩種...