VC++開發(fā)的應(yīng)用技巧三則放送

字號:

1、創(chuàng)建向?qū)υ捒?BR>    在使用具體某個軟件的時候,我們常常會在該程序中使用向?qū)J絹斫⑿碌奈募?,最典型的例子就是在Frontpage2000中或者Word2000中使用向?qū)Х绞絹硇陆ㄒ粋€網(wǎng)頁文件或者Word文檔。那么看到別的程序都能提供人性化的向?qū)υ捒蚝?,不知您有沒有什么沖動?如果有的話,不妨使用下面的代碼來創(chuàng)建一個向?qū)υ捒颍?BR>    以下是引用片段:
    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();
    }
    2、在計算機之間實現(xiàn)收發(fā)數(shù)據(jù)
    大家知道,計算機之間相互通信時,一般都是通過TCP協(xié)議來與指定IP地址的主機來建立聯(lián)系,并進(jìn)行相互通信的,在這個過程中,必需有一方扮演服務(wù)器的角色等待另一方(客戶端)的連接請求,所以服務(wù)器端需要建立一個監(jiān)聽套接口,然后在此套接口上等待連接。當(dāng)連接建立后會產(chǎn)生一個新的套接口用于通信。而客戶端在創(chuàng)建套接口后只需要簡單的調(diào)用連接函數(shù)就可以創(chuàng)建連接。對于有連接的通信不論是數(shù)據(jù)的發(fā)送還是發(fā)送與接收的順序都是有保證的。下面的代碼就是利用VC++提供的CSocket來實現(xiàn)數(shù)據(jù)收發(fā)功能的:
    以下是引用片段:
    /*
    服務(wù)器方在端口6802上等待連接,當(dāng)連接建立后關(guān)閉監(jiān)聽套接口
    客戶方向服務(wù)器端口6802發(fā)起連接請求
    */
    BOOL CMy63_s1_serverDlg::OnInitDialog()
    {
     CDialog::OnInitDialog();
     CSocket sockListen;
     //創(chuàng)建本地套接口
     sockListen.Create(6802,SOCK_STREAM,"127.0.0.1");
     //綁定參數(shù)
     sockListen.Bind(6802,"127.0.0.1");
     sockListen.Listen(5);
     //等待連接請求,m_sockSend為成員變量,用于通信
     sockListen.Accept(m_sockSend);
     //關(guān)閉監(jiān)聽套接口
     sockListen.Close();
     //啟動定時器,定時發(fā)送數(shù)據(jù)
     SetTimer(1,3000,NULL);
    }
    void CMy63_s1_serverDlg::OnTimer(UINT nIDEvent)
    {
     static iIndex=0;
     char szSend[20];
     sprintf(szSend,"%010d",iIndex++);
     //發(fā)送TCP數(shù)據(jù)
     int iSend= m_sockSend.Send(szSend,10,0);
    }
    BOOL CMy63_s1_clientDlg::OnInitDialog()
    {
     CDialog::OnInitDialog();
     //創(chuàng)建本地套接口
     m_sockRecv.Create();
     //發(fā)起連接請求
     BOOL fC=m_sockRecv.Connect("127.0.0.1",6802);
     TRACE("connect is %s ",(fC)?"OK":"Error");
     //啟動定時器,定時接收數(shù)據(jù)
     SetTimer(1,3000,NULL);
    }
    void CMy63_s1_clientDlg::OnTimer(UINT nIDEvent)
    {
     char szRecv[20];
     //接收TCP數(shù)據(jù)
     int iRecv =m_sockRecv.Receive(szRecv,10,0);
     TRACE("received %d byte ",iRecv);
     if(iRecv>=0)
     {
     szRecv[iRecv]='';
     m_szRecv=szRecv;
     UpdateData(FALSE);
     }
    }
     3、讓工具欄并列顯示
    假設(shè)在Windows程序窗口中有幾個工具欄,現(xiàn)在我們希望讓這些多個工具欄并列顯示,該怎么實現(xiàn)呢?在這里,我們可以使用下面的函數(shù)來實現(xiàn)該功能,此函數(shù)是從CJ60Lib函數(shù)庫弄下來的。筆者在下面的程序中實現(xiàn)的功能是,讓LeftOf工具欄顯示在Bar工具欄的左側(cè),同時還要并列顯示在一起,下面就是實現(xiàn)其功能的主要代碼:
    以下是引用片段:
    void CCJMDIFrameWnd::DockControlBarLeftOf(CControlBar* Bar,
    CControlBar* LeftOf)
    {
     CRect rect;
     DWORD dw;
     UINT n;
     // 使用MFC來調(diào)整所有工具欄的尺寸
     // 確保GetWindowRec準(zhǔn)確
     RecalcLayout(TRUE);
     LeftOf->GetWindowRect(&rect);
     rect.OffsetRect(1,0);
     dw=LeftOf->GetBarStyle();
     n = 0;
     n = (dw&CBRS_ALIGN_) ? AFX_IDW_DOCKBAR_: 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);
    }