VC++編程技巧三則

VC++編程技巧三則
(帷幄 2001年07月12日 11:49)

1、讓工具欄並列顯示

假設在Windows程序窗口中有幾個工具欄,現在我們希望讓這些多個工具欄並列顯示,該怎麼實現呢?在這裏,我們可以使用下面的函數來實現該功能,此函數是從CJ60Lib函數庫弄下來的。筆者在下面的程序中實現的功能是,讓LeftOf工具欄顯示在Bar工具欄的左側,同時還要並列顯示在一起,下面就是實現其功能的主要代碼:

void CCJMDIFrameWnd::DockControlBarLeftOf(CControlBar* Bar, CControlBar* LeftOf)
{
CRect rect;
DWORD dw;
UINT n;
// 使用MFC來調整所有工具欄的尺寸
// 確保GetWindowRec準確
RecalcLayout(TRUE);
LeftOf->GetWindowRect(&rect);
rect.OffsetRect(1,0);
dw=LeftOf->GetBarStyle();
n = 0;
n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP: n;
n = (dw&CBRS_ALIGN_BOTTOM&& n==0) ? AFX_IDW_DOCKBAR_BOTTOM:n;
n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT:n;
n = (dw&CBRS_ALIGN_RIGHT&& n==0) ? AFX_IDW_DOCKBAR_RIGHT:n;
DockControlBar(Bar,n,&rect);
}

2、創建嚮導對話框

在使用具體某個軟件的時候,我們常常會在該程序中使用嚮導模式來建立新的文件,最典型的例子就是在Frontpage2000中或者Word2000中使用嚮導方式來新建一個網頁文件或者Word文檔。那麼看到別的程序都能提供人性化的嚮導對話框後,不知您有沒有什麼衝動?如果有的話,不妨使用下面的代碼來創建一個嚮導對話框:

void CMy56_s1Dlg::OnWiz()
{
CSheet sheet;
sheet.SetWizardMode();
int iRet=sheet.DoModal();//返回ID_WIZFINISH或IDCANCEL
}
//重載BOOL CPropertyPage::OnSetActive( )來控制顯示的按鈕
BOOL CPage1::OnSetActive()
{
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
BOOL CPage2::OnSetActive()
{
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}

3、在計算機之間實現收發數據

大家知道,計算機之間相互通信時,一般都是通過TCP協議來與指定IP地址的主機來建立聯繫,並進行相互通信的,在這個過程中,必需有一方扮演服務器的角色等待另一方(客戶端)的連接請求,所以服務器端需要建立一個監聽套接口,然後在此套接口上等待連接。當連接建立後會產生一個新的套接口用於通信。而客戶端在創建套接口後只需要簡單的調用連接函數就可以創建連接。對於有連接的通信不論是數據的發送還是發送與接收的順序都是有保證的。下面的代碼就是利用VC++提供的CSocket來實現數據收發功能的:

/*
服務器方在端口6802上等待連接,當連接建立後關閉監聽套接口
客戶方向服務器端口6802發起連接請求
*/
BOOL CMy63_s1_serverDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CSocket sockListen;
//創建本地套接口
sockListen.Create(6802,SOCK_STREAM,"127.0.0.1");
//綁定參數
sockListen.Bind(6802,"127.0.0.1");
sockListen.Listen(5);
//等待連接請求,m_sockSend爲成員變量,用於通信
sockListen.Accept(m_sockSend);
//關閉監聽套接口
sockListen.Close();
//啓動定時器,定時發送數據
SetTimer(1,3000,NULL);
}
void CMy63_s1_serverDlg::OnTimer(UINT nIDEvent)
{
static iIndex=0;
char szSend[20];
sprintf(szSend,"%010d",iIndex++);
//發送TCP數據
int iSend= m_sockSend.Send(szSend,10,0);
}
BOOL CMy63_s1_clientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//創建本地套接口
m_sockRecv.Create();
//發起連接請求
BOOL fC=m_sockRecv.Connect("127.0.0.1",6802);
TRACE("connect is %s/n",(fC)?"OK":"Error");
//啓動定時器,定時接收數據
SetTimer(1,3000,NULL);
}
void CMy63_s1_clientDlg::OnTimer(UINT nIDEvent)
{
char szRecv[20];
//接收TCP數據
int iRecv =m_sockRecv.Receive(szRecv,10,0);
TRACE("received %d byte/n",iRecv);
if(iRecv>=0)
{
szRecv[iRecv]='/0';
m_szRecv=szRecv;
UpdateData(FALSE);
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章