如何用C++编程获得某台机器的ip地址相同的两台机器

如何将通过VC程序获取的MAC地址和IP地址一一对应起来?
[问题点数:100分,结帖人kid5]
如何将通过VC程序获取的MAC地址和IP地址一一对应起来?
[问题点数:100分,结帖人kid5]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2011年11月 专题开发/技术/项目大版内专家分月排行榜第一2011年10月 专题开发/技术/项目大版内专家分月排行榜第一2011年9月 专题开发/技术/项目大版内专家分月排行榜第一2011年8月 专题开发/技术/项目大版内专家分月排行榜第一2011年7月 专题开发/技术/项目大版内专家分月排行榜第一2011年6月 C/C++大版内专家分月排行榜第一
2011年7月 C/C++大版内专家分月排行榜第二2011年5月 专题开发/技术/项目大版内专家分月排行榜第二
2012年9月 Windows专区大版内专家分月排行榜第一2012年9月 C/C++大版内专家分月排行榜第一2012年8月 Windows专区大版内专家分月排行榜第一
2012年9月 其他开发语言大版内专家分月排行榜第二2012年8月 VC/MFC大版内专家分月排行榜第二2012年8月 其他开发语言大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。MFC常用控件(二)
滚动条控件
滚动条(Scroll
Bar)主要用来从某一预定义值范围内快速有效地进行选择.滚动条分垂直滚动条和水平滚动条两种.在滚动条内有一个滚动框,用来表示当前的值.用鼠标单击滚动条,可以使滚动框移动一页或一行,也可以直接拖动滚动框.滚动条既可以作为一个独立控件存在,也可以作为窗口、列表框和组合框的一部分.Windows
95的滚动条支持比例滚动框,即用滚动框的大小来反映页相对于整个范围的大小.Windows 3.x使用单独的滚动条控件来调整调色板、键盘速度以及鼠标灵敏度,在Windows 95中,滚动条控件被轨道条取代(参见6.2.3)不提倡使用单独的滚动条控件.
需要指出的是,从性质上划分,滚动条可分为标准滚动条和滚动条控件两种.标准滚动条是由WS_HSCROLL或WS_VSCROLL风格指定的,它不是一个实际的窗口,而是窗口的一个组成部分(例如列表框中的滚动条),只能位于窗口的右侧(垂直滚动条)或底端(水平滚动条).标准滚动条是在窗口的非客户区中创建的.与之相反,滚动条控件并不是窗口的一个零件,而是一个实际的窗口,可以放置在窗口客户区的任意地方,它既可以独立存在,也可以与某一个窗口组合,行使滚动窗口的职能.由于滚动条控件是一个独立窗口,因此可以拥有输入焦点,可以响应光标控制键,如PgUp、PgDown、Home和End.
MFC的CScrollBar类封装了滚动条控件.CScrollBar类的Create成员函数负责创建控件,该函数的声明为
Create( DWORD dwStyle, const RECT& rect, CWnd*
pParentWnd, UINT nID );
参数dwStyle指定了控件的风格.rect说明了控件的位置和尺寸.pParentWnd指向父窗口,该参数不能为NULL。nID则说明了控件的ID。如果创建成功,该函数返回TRUE,否则返回FALSE.
要创建一个普通的水平滚动条控件,应指定风格WS_CHILD|WS_VISIBLE|BS_HORZ.要创建一个普通的垂直滚动条控件,应指定风格WS_CHILD|WS_VISIBLE|BS_VERT.
主要的CScrollBar类成员函数如下所示:
GetScrollPos( )该函数返回滚动框的当前位置.若操作失败则返回0.
SetScrollPos( int nPos, BOOL bRedraw = TRUE
);该函数将滚动框移动到指定位置.参数nPos指定了新的位置.参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之.函数返回滚动框原来的位置.若操作失败则返回0.
GetScrollRange( LPINT lpMinPos, LPINT lpMaxPos )
该函数对滚动条的滚动范围进行查询.参数lpMinPos和lpMaxPos分别指向滚动范围的最小最大值.
SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE
);该函数用于指定滚动条的滚动范围.参数nMinPos和nMaxPos分别指定了滚动范围的最小最大值.由这两者指定的滚动范围不得超过32767.当两者都为0时,滚动条将被隐藏.参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之.
GetScrollInfo( LPSCROLLINFO lpScrollInfo, UINT nMask
);该函数用来获取滚动条的各种状态,包括滚动范围、滚动框的位置和页尺寸.参数lpScrollInfo指向一个SCROLLINFO结构,该结构如下所示:typedef struct tagSCROLLINFO {
UINT cbS //结构的尺寸(字节为单位)UINT fM
int nM //滚动范围最大值,当fMask中包含SIF_RANGE时有效int
nM //滚动范围最小值,当fMask中包含SIF_RANGE时有效UINT
int nP //滚动框的位置,当fMask中包含SIF_POS有效int
} SCROLLINFO;
typedef SCROLLINFO FAR *LPSCROLLINFO;参数nMask的意义与SCROLLINFO结构中的fMask相同.函数在获得有效值后返回TRUE,否则返回FALSE.
SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE
);该函数用于设置滚动条的各种状态,一个重要用途是设定页尺寸从而实现比例滚动框.参数lpScrollInfo指向一个SCROLLINFO结构,参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之.若操作成功,该函数返回TRUE,否则返回FALSE.
CWnd类也提供了一些函数来查询和设置所属的标准滚动条.这些函数与CScrollBar类的函数同名,且功能相同,但每个函数都多了一个参数,用来选择滚动条.例如,CWnd:: GetScrollPos 的声明为
GetScrollPos( int nBar )参数nBar用来选择滚动条,可以为下列值:SB_HORZ //指定水平滚动条SB_VERT //指定垂直滚动条
无论是标准滚动条,还是滚动条控件,滚动条的通知消息都是用WM_HSCROLL和WM_VSCROLL消息发送出去的.对这两个消息的确省处理函数是CWnd::OnHScroll和CWnd::OnVScroll,它们几乎什么也不做.一般需要在派生类中对这两个函数从新设计,以实现滚动功能.这两个函数的声明为
void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar
afx_msg void OnVScroll( UINT nSBCode, UINT nPos,
CScrollBar* pScrollBar );
参数nSBCode是通知消息码,如表6.8所示.nPos是滚动框的位置,只有在nSBCode为SB_THUMBPOSITION或SB_THUMBTRACK时,该参数才有意义.如果通知消息是滚动条控件发来的,那么pScrollBar是指向该控件的指针,如果是标准滚动条发来的,则pScrollBar为NULL.
表6.8 滚动条的通知消息码
/ SB_RIGHT(二者的消息码是一样的,因此可以混用,下同)
滚动到底端(右端).
滚动到顶端(左端).
SB_LINEDOWN / SB_LINERIGHT
向下(向右)滚动一行(列).
/ SB_LINELEFT
向上(向左)滚动一行(列).
SB_PAGEDOWN / SB_PAGERIGHT
向下(向右)滚动一页.
/ SB_PAGELEFT
向上(向左)滚动一页.
SB_THUMBPOSITION
滚动到指定位置.
SB_THUMBTRACK
滚动框被拖动.可利用该消息来跟踪对滚动框的拖动.
SB_ENDSCROLL
滚动结束.
6.1.8小节的例子中,读者将学会如何使用滚动条以及如何编写自己的OnHScroll函数.
6.1.6 列表框控件
列表框主要用于输入,它允许用户从所列出的表项中进行单项或多项选择,被选择的项呈高亮度显示.列表框具有边框,并且一般带有一个垂直滚动条.列表框分单选列表框和多重选择列表框两种.单选列表框一次只能选择一个列表项,而多重选择列表框可以进行多重选择.对于列表项的选择,微软公司有如下建议:
单击鼠标选择一个列表项,单击一个按钮来处理选择的项.
双击鼠标选择一个列表项是处理选择项的快捷方法.
列表框会向父窗口发送如表6.9所示的通知消息.
列表框控件的通知消息
LBN_DBLCLK
用户用鼠标双击了一列表项.只有具有LBS_NOTIFY的列表框才能发送该消息.
LBN_ERRSPACE
列表框不能申请足够的动态内存来满足需要.
LBN_KILLFOCUS
列表框失去输入焦点.
LBN_SELCANCEL
当前的选择被取消.只有具有LBS_NOTIFY的列表框才能发送该消息.
LBN_SELCHANGE
单击鼠标选择了一列表项.只有具有LBS_NOTIFY的列表框才能发送该消息.
LBN_SETFOCUS
列表框获得输入焦点.
WM_CHARTOITEM
当列表框收到WM_CHAR消息后,向父窗口发送该消息.只有具有LBS_WANTKEYBOARDINPUT风格的列表框才会发送该消息.
WM_VKEYTOITEM
当列表框收到WM_KEYDOWN消息后,向父窗口发送该消息.只有具有LBS_WANTKEYBOARDINPUT风格的列表框才会发送该消息.
MFC的CListBox类封装了列表框.CListBox类的Create成员函数负责列表框的创建,该函数的声明是
Create( DWORD dwStyle, const RECT& rect, CWnd*
pParentWnd, UINT nID );
参数dwStyle指定了列表框控件的风格,如表6.10所示,dwStyle可以是这些风格的组合.rect说明了控件的位置和尺寸.pParentWnd指向父窗口,该参数不能为NULL。nID则说明了控件的ID。如果创建成功,该函数返回TRUE,否则返回FALSE.
表6.10 列表框控件的风格
LBS_EXTENDEDSEL
支持多重选择.在点击列表项时按住Shift键或Ctrl键即可选择多个项.
LBS_HASSTRINGS
指定一个含有字符串的自绘式列表框.
LBS_MULTICOLUMN
指定一个水平滚动的多列列表框,通过调用CListBox::SetColumnWidth来设置每列的宽度.
LBS_MULTIPLESEL
支持多重选择.列表项的选择状态随着用户对该项单击或双击鼠标而翻转.
LBS_NOINTEGRALHEIGHT
列表框的尺寸由应用程序而不是Windows指定.通常,Windows指定尺寸会使列表项的某些部分隐藏起来.
LBS_NOREDRAW
当选择发生变化时防止列表框被更新,可发送WM_SETREDRAW来改变该风格.
LBS_NOTIFY
当用户单击或双击鼠标时通知父窗口.
LBS_OWNERDRAWFIXED
指定自绘式列表框,即由父窗口负责绘制列表框的内容,并且列表项有相同的高度.
LBS_OWNERDRAWVARIABLE
指定自绘式列表框,并且列表项有不同的高度.
使插入列表框中的项按升序排列.
LBS_STANDARD
相当于指定了WS_BORDER|WS_VSCROLL|LBS_SORT
|LBS_NOTIFY.
LBS_USETABSTOPS
使列表框在显示列表项时识别并扩展制表符(‘\t’),缺省的制表宽度是32个对话框单位.
LBS_WANTKEYBOARDINPUT
允许列表框的父窗口接收WM_VKEYTOITEM和WM_CHARTOITEM消息,以响应键盘输入.
LBS_DISABLENOSCROLL
使列表框在不需要滚动时显示一个禁止的垂直滚动条.
除了上表中的风格外,一般还要为列表框控件指定WS_CHILD、WS_VISIBLE、WS_TABSTOP、WS_BORDER和WS_VSCROLL风格.要创建一个普通的单选择列表框,应指定的风格为WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_STANDARD.要创建一个多重选择列表框,应该在单选择列表框风格的基础上再加上
LBS_MULTIPLESEL或LBS_
EXTENDEDSEL.如果不希望列表框排序,就不能使用LBS_STANDARD风格.
对于用对话框模板编辑器创建的列表框控件,可以在控件的属性对话框中指定表6.10中列出的控件风格。例如,在属性对话框中选择Sort项,相当与指定了LBS_SORT风格。
CListBox类的成员函数有数十个之多.我们可以把一些常用的函数分为三类,在下面列出.需要说明的是,可以用索引来指定列表项,索引是从零开始的.
首先,CListBox成员函数提供了下列函数用于插入和删除列表项.
AddString( LPCTSTR lpszItem );该函数用来往列表框中加入字符串,其中参数lpszItem指定了要添加的字符串.函数的返回值是加入的字符串在列表框中的位置,如果发生错误,会返回LB_ERR或LB_ERRSPACE(内存不够).如果列表框未设置LBS_SORT风格,那么字符串将被添加到列表的末尾,如果设置了LBS_SORT风格,字符串会按排序规律插入到列表中.
InsertString( int nIndex, LPCTSTR lpszItem
);该函数用来在列表框中的指定位置插入字符串.参数nIndex给出了插入位置(索引),如果值为-1,则字符串将被添加到列表的末尾.参数lpszItem指定了要插入的字符串.函数返回实际的插入位置,若发生错误,会返回LB_ERR或LB_ERRSPACE.与AddString函数不同,InsertString函数不会导致LBS_SORT风格的列表框重新排序.不要在具有LBS_SORT风格的列表框中使用InsertString函数,以免破坏列表项的次序.
DeleteString( UINT nIndex );该函数用于删除指定的列表项,其中参数nIndex指定了要删除项的索引.函数的返回值为剩下的表项数目,如果nIndex超过了实际的表项总数,则返回LB_ERR.
ResetContent( );该函数用于清除所有列表项.
UINT attr, LPCTSTR lpszWildCard );该函数用来向列表项中加入所有与指定通配符相匹配的文件名或驱动器名.参数attr为文件类型的组合,如表6.11所示.参数lpszWildCard指定了通配符(如*.cpp,*.*等).
Dir函数attr参数的含义
普通文件(可读写的文件).
只读文件.
隐藏文件.
系统文件.
文件的归档位已被设置.
包括了所有与通配符相匹配的驱动器.
排除标志.若指定该标志,则只列出指定类型的文件名,否则,先要列出普通文件,然后再列出指定的文件.
下列的CListBox成员函数用于搜索、查询和设置列表框.
GetCount( )该函数返回列表项的总数,若出错则返回LB_ERR.
FindString( int nStartAfter, LPCTSTR lpszItem )
该函数用于对列表项进行与大小写无关的搜索.参数nStartAfter指定了开始搜索的位置,
合理指定nStartAfter可以加快搜索速度,若nStartAfter为-1,则从头开始搜索整个列表.参数lpszItem指定了要搜索的字符串.函数返回与lpszItem指定的字符串相匹配的列表项的索引,若没有找到匹配项或发生了错误,函数会返回LB_ERR.FindString函数先从nStartAfter指定的位置开始搜索,若没有找到匹配项,则会从头开始搜索列表.只有找到匹配项,或对整个列表搜索完一遍后,搜索过程才会停止,所以不必担心会漏掉要搜索的列表项.
GetText( int nIndex, LPTSTR lpszBuffer )
void GetText( int nIndex, CString& rString )
用于获取指定列表项的字符串.参数nIndex指定了列表项的索引.参数lpszBuffer指向一个接收字符串的缓冲区.引用参数rString则指定了接收字符串的CString对象.第一个版本的函数会返回获得的字符串的长度,若出错,则返回LB_ERR.
GetTextLen( int nIndex )该函数返回指定列表项的字符串的字节长度.参数nIndex指定了列表项的索引.若出错则返回LB_ERR.
GetItemData( int nIndex )每个列表项都有一个32位的附加数据.该函数返回指定列表项的附加数据,参数nIndex指定了列表项的索引.若出错则函数返回LB_ERR.
SetItemData( int nIndex, DWORD dwItemData
);该函数用来指定某一列表项的32位附加数据.参数nIndex指定了列表项的索引.dwItemData是要设置的附加数据值.
提示:列表项的32位附加数据可用来存储与列表项相关的数据,也可以放置指向相关数据的指针.这样,当用户选择了一个列表项时,程序可以从附加数据中快速方便地获得与列表项相关的数据.
int GetTopIndex( )
该函数返回列表框中第一个可见项的索引,若出错则返回LB_ERR.
SetTopIndex( int nIndex );用来将指定的列表项设置为列表框的第一个可见项,该函数会将列表框滚动到合适的位置.参数nIndex指定了列表项的索引.若操作成功,函数返回0值,否则返回LB_ERR.
提示:由于列表项的内容一般是不变的,故CListBox未提供更新列表项字符串的函数.如果要改变某列表项的内容,可以先调用DeleteString删除该项,然后再用InsertString或AddString将更新后的内容插入到原来的位置.
下列CListBox的成员函数与列表项的选择有关.
GetSel( int nIndex )该函数返回指定列表项的状态.参数nIndex指定了列表项的索引.如果查询的列表项被选择了,函数返回一个正值,否则返回0,若出错则返回LB_ERR.
GetCurSel( )该函数仅适用于单选择列表框,用来返回当前被选择项的索引,如果没有列表项被选择或有错误发生,则函数返回LB_ERR.
SetCurSel( int nSelect );该函数仅适用于单选择列表框,用来选择指定的列表项.该函数会滚动列表框以使选择项可见.参数nIndex指定了列表项的索引,若为-1,那么将清除列表框中的选择.若出错函数返回LB_ERR.
SelectString( int nStartAfter, LPCTSTR lpszItem
);该函数仅适用于单选择列表框,用来选择与指定字符串相匹配的列表项.该函数会滚动列表框以使选择项可见.参数的意义及搜索的方法与函数FindString类似.如果找到了匹配的项,函数返回该项的索引,如果没有匹配的项,函数返回LB_ERR并且当前的选择不被改变.
GetSelCount( )该函数仅用于多重选择列表框,它返回选择项的数目,若出错函数返回LB_ERR.
SetSel( int nIndex, BOOL bSelect = TRUE );该函数仅适用于多重选择列表框,它使指定的列表项选中或落选.参数nIndex指定了列表项的索引,若为-1,则相当于指定了所有的项.参数bSelect为TRUE时选中列表项,否则使之落选.若出错则返回LB_ERR.
GetSelItems( int nMaxItems, LPINT rgIndex )
该函数仅用于多重选择列表框,用来获得选中的项的数目及位置.参数nMaxItems说明了参数rgIndex指向的数组的大小.参数rgIndex指向一个缓冲区,该数组是一个整型数组,用来存放选中的列表项的索引.函数返回放在缓冲区中的选择项的实际数目,若出错函数返回LB_ERR.
SelItemRange( BOOL bSelect, int nFirstItem, int nLastItem
);该函数仅用于多重选择列表框,用来使指定范围内的列表项选中或落选.参数nFirstItem和nLastItem指定了列表项索引的范围.如果参数bSelect为TRUE,那么就选择这些列表项,否则就使它们落选.若出错函数返回LB_ERR.
在6.1.8小节的例子中,读者将会看到对列表框的测试.
6.1.7 组合框控件
组合框把一个编辑框和一个单选择列表框结合在了一起.用户既可以在编辑框中输入,也可以从列表框中选择一个列表项来完成输入.如上一章所提到的,组合框分为简易式(Simple)、下拉式(Dropdown)和下拉列表式(Drop
List)三种.简易式组合框包含一个编辑框和一个总是显示的列表框。下拉式组合框同简易式组合框类似,二者的区别在于仅当单击下滚箭头后列表框才会弹出。下拉列表式组合框也有一个下拉的列表框,但它的编辑框是只读的,不能输入字符。
Windows中比较常用的是下拉式和下拉列表式组合框,在Developer Studio中就大量使用了这两种组合框.二者都具有占地小的特点,这在界面日益复杂的今天是十分重要的.下拉列表式组合框的功能与列表框类似.下拉式组合框的典型应用是作为记事列表框使用,既把用户在编辑框中敲入的东西存储到列表框组件中,这样当用户要重复同样的输入时,可以从列表框组件中选取而不必在编辑框组件中从新输入.在Developer Studio中的Find对话框中就可以找到一个典型的下拉式组合框.
要设计一个记事列表框,应采取下列原则:
在创建组合框时指定CBS_DROPDOWNLIST风格.
要限制列表项的数目,以防止内存不够.
如果在编辑框中输入的字符串不能与列表框组件中的列表项匹配,那么应该把该字符串插入到列表框中的0位置处.最老的项处于列表的末尾.如果列表项的数目超出了限制,则应把最老的项删除.
如果在编辑框中输入的字符串可以与列表框组件中的某一项完全匹配,则应该先把该项从列表的当前位置删除,然后在将其插入道列表的0位置处.
组合框控件会向父窗口发送表6.12所示的通知消息.
表6.12 组合框控件的通知消息
CBN_CLOSEUP
组合框的列表框组件被关闭.简易式组合框不会发出该消息.
CBN_DBLCLK
用户在某列表项上双击鼠标.只有简易式组合框才会发出该消息.
CBN_DROPDOWN
组合框的列表框组件下拉.简易式组合框不会发出该消息.
CBN_EDITCHANGE
编辑框的内容被用户改变了。与CBN_EDITUPDATE不同,该消息是在编辑框显示的正文被刷新后才发出的。下拉列表式组合框不会发出该消息.
CBN_EDITUPDATE
在编辑框准备显示改变了的正文时发送该消息。下拉列表式组合框不会发出该消息.
CBN_ERRSPACE
组合框无法申请足够的内存来容纳列表项.
CBN_SELENDCANCEL
表明用户的选择应该取消.当用户在列表框中选择了一项,然后又在组合框控件外单击鼠标时就会导致该消息的发送.
CBN_SELENDOK
用户选择了一项,然后按了回车键或单击了下滚箭头.该消息表明用户确认了自己所作的选择.
CBN_KILLFOCUS
组合框失去了输入焦点.
CBN_SELCHANGE
用户通过点击或移动箭头键改变了列表的选择.
CBN_SETFOCUS
组合框获得了输入焦点.
MFC的CComboBox类封装了组合框.需要指出的是,虽然组合框是编辑框和列表框的选择,但是CComboBox类并不是CEdit类和CListBox类的派生类,而是CWnd类的派生类.
CComboBox的成员函数Create负责创建组合框,该函数的说明如下:
Create( DWORD dwStyle, const RECT& rect, CWnd*
pParentWnd, UINT nID );
参数dwStyle指定了组合框控件的风格,如表6.10所示,dwStyle可以是这些风格的组合.rect说明的是列表框组件下拉后组合框的位置和尺寸.pParentWnd指向父窗口,该参数不能为NULL。nID则说明了控件的ID。如果创建成功,该函数返回TRUE,否则返回FALSE.
提示:在用Create函数创建组合框时,参数rect说明的是包括列表框组件在内的组合框的位置和尺寸,而不是列表框组件隐藏时的编辑框组件尺寸.要设置编辑框组件的高度,可以调用成员函数SetItemHeight(-1,cyItemHeight),其中参数cyItemHeight指定了编辑框的高度(以像素为单位).
表6.13 组合框的风格
CBS_AUTOHSCROLL
使编辑框组件具有水平滚动的风格.
CBS_DROPDOWN
指定一个下拉式组合框.
CBS_DROPDOWNLIST
指定一个下拉列表式组合框.
CBS_HASSTRINGS
指定一个含有字符串的自绘式组合框.
CBS_OEMCONVERT
使编辑框组件中的正文可以在ANSI字符集和OEM字符集之间相互转换。这在编辑框中包含文件名时是很有用的。
CBS_OWNERDRAWFIXED
指定自绘式组合框,即由父窗口负责绘制列表框的内容,并且列表项有相同的高度.
CBS_OWNERDRAWVARIABLE
指定自绘式组合框,并且列表项有不同的高度.
CBS_SIIMPLE
指定一个简易式组合框.
自动对列表框组件中的项进行排序.
CBS_DISABLENOSCROLL
使列表框在不需要滚动时显示一个禁止的垂直滚动条.
CBS_NOINTEGRALHEIGHT
组合框的尺寸由应用程序而不是Windows指定.通常,由Windows指定尺寸会使列表项的某些部分隐藏起来.
CBS_SIMPLE、CBS_DROPDOWN和CBS_DROPDOWNLIST分别用来将组合框指定为简易式、下拉式和下拉列表式.一般还要为组合框指定WS_CHILD、WS_VISIBLE、WS_TABSTOP、WS_VSCROLL和CBS_AUTOHSCROLL风格.如果要求自动排序,还应指定CBS_SORT风格.
对于用对话框模板编辑器创建的组合框控件,可以在控件的属性对话框中指定上表中列出的控件风格。例如,在属性对话框中选择Dropdown,相当于指定了CBS_DROPDOWN.
CComboBox类的成员函数较多.其中常用的函数可粗分为两类,分别针对编辑框组件和列表框组件.可以想象,这些函数与CEdit类和CListBox类的成员函数肯定有很多类似之处,但它们也会有一些不同的特点.如果读者能从"组合框是由编辑框和列表框组成"这一概念出发,就能够很快的掌握CComboBox的主要成员函数.
事实上,绝大部分CComboBox的成员函数都可以看成是CEdit或CListBox成员函数的翻版.函数的功能,函数名,甚至函数的参数都是类似的.为了方便学习,在下面列出CComboBox类的成员函数时,采用了与对应的CEdit或CListBox成员函数相比较的做法.在成员函数的列表中,分别列出了成员函数名,对应的CEdit或CListBox成员函数,以及二者之间的不同之处.不同之处是指函数的功能、参数以及返回值有什么差别.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。找学校,搜学校,学校口碑早知道!
您可以免费发布教育培训信息,找学校,找课程,找老师,学校建站,发布新闻动态,招生培训等。
推荐学校:
LOADING...
您当前的位置: >>
>> C/C++教程 >> 如何用C++编程获得某台机器的IP地址946ea5acc824e7ed
如何用C++编程获得某台机器的IP地址
更新日期: 来源:网友投搞 作者:佚名 分享1560次
核心提示:新闻资讯频道所转载文章、数据等内容纯属作者个人观点,仅供学习参考使用。本文《如何用C++编程获得某台机器的IP地址》来源于网络并非原创内容,请读者以官方内容为准,如果您发现本资料有侵犯您的知识产权,请立即联系我们,我们将第一时间内删除该资料,以保障您的知识产权。
  编译:Northtibet  下载源代码(zip压缩文件, 1K)
  对于这个古老的问题,VC知识库的精华区以及以往的在线杂志中都有详尽不一的描述。本文提供的方法是一个比较完整的解决方案,并附有具体的实现细节。希望大家对这个问题有彻底的熟悉。其实,假如你熟悉 Windows 的Sockets API,并了解一些底层的Winsock知识。那么要获得某台机器的IP地址并不是什么难事。一台机器可以装多块网卡,因此它就可能有多个IP地址。目前很多发烧友的PC机都装有多块网卡。其中一块网卡与调制解调器(MODEM)或者ADSL适配器相连,另一块与家里的局域网(LAN)相连。对于有宽带连接条件的家庭,这更是一种典型的配置。任何事情,一旦你知道了解决的方法,一切都会变得如此简单。下面是本文提供的一个简单的控制台程序(程序名为getip1),其功能就是显示本机的IP地址。如图一所示: 图一 getip1的运行画面   下面是 getip1 程序的代码,很简单: ////////////////////////////////////////////////////////////////// getip1.cpp//// 本程序报告本机上每一块网卡的IP地址// 命令行编译命令为://// cl getip1.cpp wsock32.lib//// 请一定要在环境变量中正确指定LIB库的路径;可以运行vcvars32.bat//#include &winsock.h&#include &wsipx.h&#include &wsnwlink.h&#include &stdio.h&int main(){ //////////////// // 初始化 Windows sockets API. 要求版本为 version 1.1 // Word wVersionRequested = MAKEWORD(1, 1); WSADATA wsaD if (WSAStartup(wVersionRequested, &wsaData)) { printf("WSAStartup failed %s\n", WSAGetLastError()); return -1; } ////////////////// // 获得主机名. // char hostname[256]; int res = gethostname(hostname, sizeof(hostname)); if (res != 0) { printf("Error: %u\n", WSAGetLastError()); return -1; } printf("hostname=%s\n", hostname); //////////////// // 根据主机名获取主机信息.
// hostent* pHostent = gethostbyname(hostname); if (pHostent==NULL) { printf("Error: %u\n", WSAGetLastError()); return -1; } ////////////////// // 解析返回的hostent信息. // hostent& he = *pH printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n",
he.h_name, he.h_aliases, he.h_addrtype, he.h_length); sockaddr_ for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) { memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length); // 输出机器的IP地址. printf("Address: %s\n", inet_ntoa(sa.sin_addr)); // 显示地址串 } ////////////////// // 终止 Windows sockets API // WSACleanup(); return 0;}
更多内容请看C/C++技术专题IP地址知识普及专题Java编程开发手册专题,或
  要使用Winsock,首先必须调用WSAStartup,最后结束时不要忘了调用WSACleanup。要获取IP地址,首先必须得到机器的主机名(host name),调用gethostname就可以实现,有了主机名,接下来调用gethostbyname来获取包括IP地址在内的更多的主机信息。
gethostbyname返回一个指向hostent数据结构的指针,这个结构在&winsock.h&文件中是这样定义的: // 来自winsock.hstrUCt hostent { char FAR * h_ /* 正式的主机名*/ char FAR * FAR * h_ /* 别名列表*/ short h_ /* 主机地址类型*/ short h_ /* 地址长度*/ char FAR * FAR * h_addr_ /* 地址清单*/};  这是个典型的底层APIs使用的数据结构,很多人都不是很熟悉它。实际上,hostent是一个变长的数据结构,h_name是主机名,在例子程序中的值为 "zxn.hangwire.sdb"。没有别名(h_aliases)。h_addrtype是地址类型(或者也叫地址家族),在例子程序中的值为2(AF_INET = internet,其它内容参见winsock.h)。h_length是每一个地址的长度,以字节为单位。因为IP地址的长度是4个字节,所以在例子程序中的值为4,h_addr_list是地址数组的开始点,它们一个接着一个存放,结尾是一个null。每一个x.y.z.w数字占一个字节。为了将IP地址格式化为x.y.z.w的形式,必须将地址数组先拷贝到一个叫sockaddr的数据结构中,然后调用一个非凡的函数inet_ntoa。 图二是hostent 结构在内存中存放示意图: 图二 hostent 结构在内存中的存放示意图   相信以上的解释再辅以阅读代码,你以后不再会对hostent结构感到生疏。
  最后,顺祝编程愉快!
更多内容请看C/C++技术专题IP地址知识普及专题Java编程开发手册专题,或
阅读上一篇:
阅读下一篇:

我要回帖

更多关于 获得ip地址 的文章

 

随机推荐