● 補(bǔ)充小知識:枚舉類型的使用
每個控件(比如列表)都對應(yīng)一個自己的唯一的變量
使用枚舉類型可以將變量名與編號進(jìn)行綁定,以后程序需要擴(kuò)展的時候,只需要在定義枚舉變量的位置重新修改編號就可以了,這樣全局的所有變量的編號就都跟著修改了
由于列表這個數(shù)據(jù)結(jié)構(gòu)在本項(xiàng)目中十分重要,所有需要放在一個每一個文件都能訪問到的文件當(dāng)中,比如"pcb.h"
示例1:默認(rèn)是0 1 2 3 4 5這樣和數(shù)組一樣遞增的
enum Day {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
int main() {
// 使用枚舉類型
Day today = Wednesday;
// 輸出枚舉常量的值
std::cout << "Today is: " << today << std::endl;
return 0;
}
示例2:也可以是亂序使用的
enum Color {
Red = 1,
Green = 2,
Blue = 6
};
6、為列表控件添加條目
寫代碼的時候找不到對話框,如何轉(zhuǎn)到資源視圖?
為列表控件添加初始化函數(shù),如果代碼都寫在OnInitDlg()函數(shù)里面,顯得太過于臃腫了,于是我們考慮在CPCRemoteDlg類里面添加一個成員函數(shù)initList()用來初始化列表
??
在initList()函數(shù)中實(shí)現(xiàn)為列表添加條目
// 初始化對話框中的列表
int CPCRemoteDlg::initList()
{
// TODO: 在此處添加實(shí)現(xiàn)代碼.
//為Online_List添加條目
for (int i = 0; i < ONLINELIST_LEN; i++) {
m_CList_Online.InsertColumn(i, g_Column_Data_Onlie[i].title, LVCFMT_CENTER, g_Column_Data_Onlie[i].nWidth);
}
//為MessageList添加條目
for (int i = 0; i < MESSAGELIST_LEN; i++) {
m_CList_Message.InsertColumn(i, g_Column_Data_Message[i].title, LVCFMT_CENTER, g_Column_Data_Message[i].nWidth);
}
return 0;
}
數(shù)據(jù)結(jié)構(gòu)的定義:
2個枚舉類型的列表定義在"pcb.h"文件當(dāng)中:
enum
{
ONLINELIST_IP = 0, //IP的列順序
ONLINELIST_ADDR, //地址
ONLINELIST_COMPUTER_NAME, //計(jì)算機(jī)名/備注
ONLINELIST_OS, //操作系統(tǒng)
ONLINELIST_CPU, //CPU
ONLINELIST_VIDEO, //攝像頭
ONLINELIST_PING, //PING
ONLINELIST_LEN //OnlineList的總長度
};
enum
{
MESSAGELIST_TYPE, //信息類型
MESSAGELIST_TIME, //時間
MESSAGELIST_INFO, //信息
MESSAGELIST_LEN //MessageList的總長度
};
列表項(xiàng)定義在PCRemoteDlg.cpp文件當(dāng)中:
typedef struct
{
char* title; //列表的名稱
int nWidth; //列表的寬度
}COLUMNSTRUCT;
COLUMNSTRUCT g_Column_Data_Onlie[] =
{
{"IP", 148 },
{"區(qū)域", 150 },
{"計(jì)算機(jī)名/備注", 160 },
{"操作系統(tǒng)", 128 },
{"CPU", 80 },
{"攝像頭", 81 },
{"PING", 81 }
};
COLUMNSTRUCT g_Column_Data_Message[] =
{
{"信息類型", 148 },
{"時間", 100 },
{"信息內(nèi)容", 660 }
};
此時運(yùn)行項(xiàng)目還是顯示不出來?xiàng)l目,我們需要將2個列表的屬性》視圖:ICon 改為 Report:
然后運(yùn)行起來就OK了:
注意:不要忘記在CPCRemoteDlg的initDlg函數(shù)里面調(diào)用??????
結(jié)果報(bào)C005錯誤
經(jīng)排查是因?yàn)閙_CList_Online錯誤地寫成了m_CList_Message導(dǎo)致數(shù)組越界引發(fā)報(bào)錯
修改為:
//為Online_List添加條目
for (int i = 0; i < ONLINELIST_LEN; i++) {
m_CList_Online.InsertColumn(i, g_Column_Data_Message[i].title, LVCFMT_CENTER, g_Column_Data_Message[i].nWidth);
}
最終運(yùn)行結(jié)果截圖:
但是對窗口進(jìn)行放大縮小,列表的條目大小不隨著變化,如何解決?
想不到使用什么函數(shù),首先要知道這個函數(shù)一定是CList的成員函數(shù),然后去查MSDN,或者可以再具體到你想改變列的大小,就在CList里面再查和Column相關(guān)的內(nèi)容/SetXXX之類的
只有當(dāng)前列表?xiàng)l目寬度需要設(shè)置為double類型,這個自行體會
1)定義兩個列表初始寬度為全局變量
int g_Online_List_InitWidth = 0;
int g_Message_List_InitWidth = 0;
2)在initList當(dāng)中分別計(jì)算出兩個列表的初始寬度
// 初始化對話框中的列表
int CPCRemoteDlg::initList()
{
// TODO: 在此處添加實(shí)現(xiàn)代碼.
//為Online_List添加條目
for (int i = 0; i < ONLINELIST_LEN; i++) {
m_CList_Online.InsertColumn(i, g_Column_Data_Onlie[i].title, LVCFMT_CENTER, g_Column_Data_Onlie[i].nWidth);
g_Online_List_InitWidth += g_Column_Data_Onlie[i].nWidth;
}
//為MessageList添加條目
for (int i = 0; i < MESSAGELIST_LEN; i++) {
m_CList_Message.InsertColumn(i, g_Column_Data_Message[i].title, LVCFMT_CENTER, g_Column_Data_Message[i].nWidth);
g_Message_List_InitWidth += g_Column_Data_Message[i].nWidth;
}
return 0;
}
3)在OnSize函數(shù)當(dāng)中實(shí)現(xiàn)列表的條目隨著窗體的大小自由伸縮?
void CPCRemoteDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此處添加消息處理程序代碼
//使列表的位置隨窗口自動變化
double wndCurWidth = cx; //使用double類型來重新表示當(dāng)前窗口大小
double dTmp = 0;
if (m_CList_Online.m_hWnd != NULL)
{
CRect rc;
rc.left = 1; //列表的左坐標(biāo)
rc.top = 80; //列表的上坐標(biāo)
rc.right = cx - 1; //列表的右坐標(biāo)
rc.bottom = cy - 160; //列表的下坐標(biāo)
m_CList_Online.MoveWindow(rc);
//使列表?xiàng)l目的大小也適應(yīng)窗口的變化
for (int i = 0; i < ONLINELIST_LEN; i++) {
dTmp = g_Column_Data_Onlie[i].nWidth * wndCurWidth;
dTmp /= g_Online_List_InitWidth;
int nCurWidth = (int)dTmp;
m_CList_Online.SetColumnWidth(i, nCurWidth);
}
}
//使列表的位置隨窗口自動變化
if (m_CList_Message.m_hWnd != NULL)
{
CRect rc;
rc.left = 1; //列表的左坐標(biāo)
rc.top = cy - 156; //列表的上坐標(biāo)
rc.right = cx - 1; //列表的右坐標(biāo)
rc.bottom = cy - 6; //列表的下坐標(biāo)
m_CList_Message.MoveWindow(rc);
//使列表?xiàng)l目的大小也適應(yīng)窗口的變化
for (int i = 0; i < MESSAGELIST_LEN; i++) {
dTmp = g_Column_Data_Message[i].nWidth * wndCurWidth;
dTmp /= g_Message_List_InitWidth;
int nCurWidth = (int)dTmp;
m_CList_Message.SetColumnWidth(i, nCurWidth);
}
}
}
運(yùn)行效果截圖:?
?
補(bǔ)充編程小技巧:
在類視圖下無法直接刪除成員函數(shù),想要刪除成員函數(shù)需要手動轉(zhuǎn)到它的定義和引用處刪除文章來源:http://www.zghlxwxcb.cn/news/detail-807851.html
運(yùn)行程序發(fā)現(xiàn)功能沒有體現(xiàn),程序沒有什么變化,需要考慮是否調(diào)用了該函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-807851.html
到了這里,關(guān)于gh0st遠(yuǎn)程控制——客戶端界面編寫(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!