opencvbase 實現opencv開啟網路攝影機和初步處理等效果操作(附源碼)

來源:互聯網
上載者:User

標籤:des   class   blog   http   color   com   

// TwoCameraOnTimer2Dlg.cpp : 實現檔案/*CvMat, Mat, IplImage之間的互相轉換IpIImage -> CvMatCvMat matheader;CvMat * mat = cvGetMat(img, &matheader);CvMat * mat = cvCreateMat(img->height, img->width, CV_64FC3);cvConvert(img, mat)IplImage -> MatMat::Mat(const IplImage* img, bool copyData=false);IplImage* iplImg = cvLoadImage("greatwave.jpg", 1);Mat mtx(iplImg);Mat -> IplImageMat MIplImage iplimage = M;CvMat -> MatMat::Mat(const CvMat* m, bool copyData=false);Mat -> CvMat例子(假設Mat類型的imgMat映像資料存在):CvMat cvMat = imgMat;*/#include "stdafx.h"#include "TwoCameraOnTimer2.h"#include "TwoCameraOnTimer2Dlg.h"#include "afxdialogex.h"#include <opencv/cv.h>#include <opencv/highgui.h>#ifdef _DEBUG#define new DEBUG_NEW#endif// 用於應用程式“關於”功能表項目的 CAboutDlg 對話方塊class CAboutDlg : public CDialogEx{public:CAboutDlg();// 對話方塊資料enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支援// 實現protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// CTwoCameraOnTimer2Dlg 對話方塊CTwoCameraOnTimer2Dlg::CTwoCameraOnTimer2Dlg(CWnd* pParent /*=NULL*/): CDialogEx(CTwoCameraOnTimer2Dlg::IDD, pParent), m_nCamCount(0), m_nLeftCamCount(0), m_nRightCamCount(0), m_nRAD_SELECT(0){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CTwoCameraOnTimer2Dlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_COMBO1, m_CBNCamList);//  DDX_Control(pDX, IDC_IMG_LOGO, m_imglogo);}BEGIN_MESSAGE_MAP(CTwoCameraOnTimer2Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BTN_OPENCAM, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnOpencam)ON_CBN_SELCHANGE(IDC_COMBO1, &CTwoCameraOnTimer2Dlg::OnCbnSelchangeCombo1)ON_WM_TIMER()ON_BN_CLICKED(IDC_BTN_CLOSECAM, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnClosecam)ON_BN_CLICKED(IDC_BTN_CAPTURE, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnCapture)ON_BN_CLICKED(IDC_BTN_SAVE, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnSave)ON_BN_CLICKED(IDC_BTN_MIRROR, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnMirror)ON_BN_CLICKED(IDC_BTN_MIRROR2, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnMirror2)ON_BN_CLICKED(IDC_BTN_ROTATE, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnRotate)ON_BN_CLICKED(IDC_BTN_PRINT, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnPrint)ON_WM_DESTROY()ON_BN_CLICKED(IDC_BTN_OPENCAM3, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnOpencam3) ON_BN_CLICKED(IDC_BTN_SOBEL, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnSobel)ON_BN_CLICKED(IDC_BTN_EMPTY, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnEmpty)ON_BN_CLICKED(IDC_BTN_CANNY, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnCanny)ON_BN_CLICKED(IDC_BTN_BLACK, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnBlack)ON_BN_CLICKED(IDC_BTN_OPENCAM2, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnOpencam2)ON_BN_CLICKED(IDC_BTN_BIN, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnBin)ON_BN_CLICKED(IDC_BTN_PREWITTE, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnPrewitte)ON_BN_CLICKED(IDC_BTN_AUTOBIN, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnAutobin) ON_BN_CLICKED(IDC_BTN_LOG, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnLog) ON_BN_CLICKED(IDC_BTN_HIST, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnHist)ON_BN_CLICKED(IDC_BTN_WATER, &CTwoCameraOnTimer2Dlg::OnBnClickedBtnWater)END_MESSAGE_MAP()// CTwoCameraOnTimer2Dlg 訊息處理常式BOOL CTwoCameraOnTimer2Dlg::OnInitDialog(){CDialogEx::OnInitDialog();// 將“關於...”功能表項目添加到系統功能表中。// IDM_ABOUTBOX 必須在系統命令範圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設定此對話方塊的表徵圖。當應用程式主視窗不是對話方塊時,架構將自動//  執行此操作SetIcon(m_hIcon, TRUE);// 設定大表徵圖SetIcon(m_hIcon, FALSE);// 設定小表徵圖// TODO: 在此添加額外的初始化代碼//設定logo m_nCamCount = CCameraDS::CameraCount();//網路攝影機總數m_nLeftCamCount = 1;//左邊網路攝影機預設為1m_nRightCamCount = 0;//右邊網路攝影機預設為0//在listbox中添加資料char camera_name[1024];char istr[25];CString camstr;for(int i=0; i < m_nCamCount; i++){  int retval = CCameraDS::CameraName(i, camera_name, sizeof(camera_name) );sprintf_s(istr, " # %d", i);strcat_s( camera_name, istr );  camstr = camera_name;if(retval >0)m_CBNCamList.AddString(camstr);elseAfxMessageBox(_T("不能擷取網路攝影機的名稱"));}camstr.ReleaseBuffer();// 初始化映像顯示控制項的映像CRect rect;GetDlgItem(IDC_PBRIGHT)->GetClientRect(&rect);m_lfimage = Mat::zeros(rect.Height(),rect.Width(),CV_8UC3);GetDlgItem(IDC_PBRIGHT)->GetClientRect(&rect); m_rightimage = Mat::zeros(rect.Height(),rect.Width(),CV_8UC3);return TRUE;  // 除非將焦點設定到控制項,否則返回 TRUE}void CTwoCameraOnTimer2Dlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}}// 如果向對話方塊添加最小化按鈕,則需要下面的代碼//  來繪製該表徵圖。對於使用文檔/視圖模型的 MFC 應用程式,//  這將由架構自動完成。void CTwoCameraOnTimer2Dlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用於繪製的裝置上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使表徵圖在工作區矩形中置中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 繪製表徵圖dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}//繪製logoCString fileName="1.png";std::string str = fileName;Mat mat = imread(str);F_ShowImage(mat,mat,IDC_IMG_LOGO);//開啟並寫入m_rightimage }//當使用者拖動已最小化的視窗時系統調用此函數取得游標//顯示。HCURSOR CTwoCameraOnTimer2Dlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}//開啟網路攝影機void CTwoCameraOnTimer2Dlg::OnBnClickedBtnOpencam(){  if (!leftcam.open(m_nLeftCamCount)) { AfxMessageBox(_T("網路攝影機開啟失敗")); } else { AfxMessageBox(_T("網路攝影機開啟成功")); QueryCam();//開始網路攝影機 }//  if (m_nCamCount>=1)//  {//  //如果兩個網路攝影機的開啟號是不一樣的//  if (m_nLeftCamCount != m_nRightCamCount)//  {//  if (!leftcam.open(m_nLeftCamCount))//  {//   AfxMessageBox(_T("左網路攝影機開啟失敗"));//  }//  //  if (!rightcam.open(m_nRightCamCount))//  {//   AfxMessageBox(_T("右網路攝影機開啟失敗"));//  }//  //  QueryCam();//開始網路攝影機//  }//  else//  {// AfxMessageBox(_T("兩個網路攝影機不能設定的一樣"));//  }//  }//  else//  {//  AfxMessageBox(_T("請確認至少有一個網路攝影機連上了"));//  }}void CTwoCameraOnTimer2Dlg::OnCbnSelchangeCombo1(){// TODO: 在此添加控制項通知處理常式代碼// m_nRAD_SELECT = GetCheckedRadioButton(IDC_RADIOLEFT,IDC_PBRIGHT);// if (m_nRAD_SELECT == IDC_RADIOLEFT)// {m_nLeftCamCount = m_CBNCamList.GetCurSel();// }// else// {// m_nRightCamCount = m_CBNCamList.GetCurSel();// }}//開啟timer,開始相機擷取void CTwoCameraOnTimer2Dlg::QueryCam(void){SetTimer(1,50,NULL);//採用timer觸發,進行網路攝影機操作}void CTwoCameraOnTimer2Dlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加訊息處理常式代碼和/或調用預設值if (leftcam.isOpened()){Mat leftframe;leftcam >>leftframe;F_ShowImage(leftframe,m_lfimage,IDC_PBLEFT);} F_ShowImage(m_rightimage,m_rightimage,IDC_PBRIGHT);// if (rightcam.isOpened())// {// Mat rightframe;// rightcam>>rightframe;// F_ShowImage(rightframe,m_rightimage,IDC_PBRIGHT);// }CDialogEx::OnTimer(nIDEvent);}/*---------------------------- * 功能 : 顯示映像 * 將要繪製的映像 src 複製到 des,然後繪製到控制項號為 ID 的 Picture 控制項 *---------------------------- * 函數 : CStereoVisionDlg::F_ShowImage * 訪問 : private  * 返回 : void * * 參數 : src[in]待顯示映像 * 參數 : des[in]視窗映像 * 參數 : ID[in]映像視窗控制項ID */void CTwoCameraOnTimer2Dlg::F_ShowImage(Mat& src, Mat& des, UINT ID){if (src.empty()){return;}// 計算將圖片縮放到 Image 地區所需的比例因素double wRatio = des.cols / (double)src.cols;double hRatio = des.rows / (double)src.rows;double srcWH = src.cols / (double)src.rows;double desWH = des.cols / (double)des.rows;double scale = srcWH > desWH ? wRatio : hRatio;// 縮放後圖片的寬和高int nw = (int)( src.cols * scale );int nh = (int)( src.rows * scale );// 為了將縮放後的圖片存入 des 的正中部位,需計算圖片在 des 左上方的期望座標值int tlx = (int)((des.cols - nw) / 2);int tly = (int)((des.rows - nh) / 2);// 設定 des 的 ROI 地區,用來存入圖片 imgMat desRoi = des(Rect(tlx, tly, nw, nh));// 如果src是單通道映像,則轉換為三通道映像if (src.channels() == 1){Mat src_c;cvtColor(src, src_c, CV_GRAY2BGR);// 對圖片 src_t 進行縮放,並存入到 des 中resize(src_c, desRoi, desRoi.size());}else{// 對圖片 src 進行縮放,並存入到 des 中resize( src, desRoi, desRoi.size() );}CDC* pDC = GetDlgItem( ID ) ->GetDC();// 獲得顯示控制項的 DCHDC hDC = pDC ->GetSafeHdc();// 擷取 HDC(裝置控制代碼) 來進行繪圖操作CRect rect;GetDlgItem(ID) ->GetClientRect( &rect );// 擷取控制項尺寸位置CvvImage cimg;IplImage cpy = des;cimg.CopyOf( &cpy );// 複製圖片cimg.DrawToHDC( hDC, &rect );// 將圖片繪製到顯示控制項的指定地區內ReleaseDC( pDC );}//關閉網路攝影機void CTwoCameraOnTimer2Dlg::OnBnClickedBtnClosecam(){KillTimer(1);if (leftcam.isOpened()){m_lfimage = Scalar(0);F_ShowImage(m_lfimage,m_lfimage,IDC_PBLEFT);leftcam.release();AfxMessageBox(_T("網路攝影機關閉成功"));}// if (rightcam.isOpened())// {// m_rightimage = Scalar(0);// F_ShowImage(m_rightimage,m_rightimage,IDC_PBRIGHT);// rightcam.release();// }}//截獲當前畫面void CTwoCameraOnTimer2Dlg::OnBnClickedBtnCapture(){// TODO: 在此添加控制項通知處理常式代碼m_rightimage = NULL;Mat rightframe;leftcam >>rightframe;F_ShowImage(rightframe,m_rightimage,IDC_PBRIGHT);}//儲存當前畫面void CTwoCameraOnTimer2Dlg::OnBnClickedBtnSave(){// TODO: 在此添加控制項通知處理常式代碼// Mat rightframe;// leftcam >>rightframIplImage iplimage =m_lfimage;//開啟儲存介面,獲得儲存的地址CString fileName;CString szFilters="jpg(*.jpg)|*.jpg||";CFileDialog dlgFile(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilters,NULL,0,TRUE); const int c_cMaxFiles = 100;const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;dlgFile.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize);dlgFile.GetOFN().nMaxFile = c_cMaxFiles;dlgFile.DoModal();fileName.ReleaseBuffer();fileName = fileName+".jpg";//加個尾碼名int i = cvSaveImage(fileName,&iplimage);if (i!=0){AfxMessageBox(_T("檔案儲存成功"));}}//鏡像1void CTwoCameraOnTimer2Dlg::OnBnClickedBtnMirror(){IplImage iplimage =m_rightimage;cvFlip(&iplimage,&iplimage,1);//鏡像Mat img(&iplimage,0);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}//鏡像2void CTwoCameraOnTimer2Dlg::OnBnClickedBtnMirror2(){IplImage iplimage =m_rightimage;cvFlip(&iplimage,&iplimage,0);//鏡像Mat img(&iplimage,0);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}//旋轉void CTwoCameraOnTimer2Dlg::OnBnClickedBtnRotate(){// TODO: 在此添加控制項通知處理常式代碼int rotation_degrees = 30;Mat M = getRotationMatrix2D(Point(m_rightimage.cols/2,m_rightimage.rows/2),rotation_degrees,1);warpAffine(m_rightimage,m_rightimage,M,m_rightimage.size(),INTER_LINEAR);F_ShowImage(m_rightimage,m_rightimage,IDC_PBRIGHT);}//printvoid CTwoCameraOnTimer2Dlg::OnBnClickedBtnPrint(){ }//destory就是關閉時候的情況void CTwoCameraOnTimer2Dlg::OnDestroy(){CDialogEx::OnDestroy();KillTimer(1);if (leftcam.isOpened()){m_lfimage = Scalar(0);F_ShowImage(m_lfimage,m_lfimage,IDC_PBLEFT);leftcam.release();AfxMessageBox(_T("網路攝影機關閉成功"));} }//儲存檔案void CTwoCameraOnTimer2Dlg::OnBnClickedBtnOpencam3(){// TODO: 在此添加控制項通知處理常式代碼IplImage iplimage =m_rightimage;//開啟儲存介面,獲得儲存的地址CString fileName;CString szFilters="jpg(*.jpg)|*.jpg||";CFileDialog dlgFile(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilters,NULL,0,TRUE); const int c_cMaxFiles = 100;const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;dlgFile.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize);dlgFile.GetOFN().nMaxFile = c_cMaxFiles;dlgFile.DoModal();fileName.ReleaseBuffer();fileName = fileName+".jpg";//加個尾碼名int i = cvSaveImage(fileName,&iplimage);if (i!=0){AfxMessageBox(_T("檔案儲存成功"));}} //sobelvoid CTwoCameraOnTimer2Dlg::OnBnClickedBtnSobel(){IplImage iplimage =m_rightimage;cvSobel(&iplimage,&iplimage,1,0,3);   Mat img(&iplimage,0);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}//清空void CTwoCameraOnTimer2Dlg::OnBnClickedBtnEmpty(){IplImage iplimage =m_rightimage;    m_rightimage = NULL;F_ShowImage(m_rightimage,m_rightimage,IDC_PBRIGHT);}//cannyvoid CTwoCameraOnTimer2Dlg::OnBnClickedBtnCanny(){IplImage iplimage =m_rightimage;IplImage *src = &iplimage;IplImage* src1=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);cvCvtColor(src, src1, CV_BGR2GRAY);  cvCanny(src1,src1,50,200,3);//參數可以設定Mat img(src1);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}//黑白void CTwoCameraOnTimer2Dlg::OnBnClickedBtnBlack(){IplImage iplimage =m_rightimage;IplImage *src = &iplimage;IplImage* src1=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);cvCvtColor(src, src1, CV_BGR2GRAY);  Mat img(src1);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}//開啟檔案void CTwoCameraOnTimer2Dlg::OnBnClickedBtnOpencam2(){m_rightimage = NULL;CString fileName;CString szFilters="jpg(*.jpg)|*.jpg||bmp(*.bmp)|*.bmp";CFileDialog dlgFile(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilters,NULL,0,TRUE); const int c_cMaxFiles = 100;const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;dlgFile.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize);dlgFile.GetOFN().nMaxFile = c_cMaxFiles;dlgFile.DoModal();fileName.ReleaseBuffer();std::string str = fileName;    Mat mat = imread(str);F_ShowImage(mat,m_rightimage,IDC_PBRIGHT);//開啟並寫入m_rightimageSetTimer(1,50,NULL);//採用timer觸發}//二值化void CTwoCameraOnTimer2Dlg::OnBnClickedBtnBin(){// TODO: 在此添加控制項通知處理常式代碼IplImage iplimage =m_rightimage;IplImage *src = &iplimage;IplImage* src1=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);cvCvtColor(src, src1, CV_BGR2GRAY);  cvThreshold(src1,src1,0,150,0);Mat img(src1);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}//prewitte???void CTwoCameraOnTimer2Dlg::OnBnClickedBtnPrewitte(){IplImage iplimage =m_rightimage;IplImage *src = &iplimage;IplImage* src1=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);cvCvtColor(src, src1, CV_BGR2GRAY);  cvCanny(src1,src1,50,200,3);//參數可以設定Mat img(src1);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}void CTwoCameraOnTimer2Dlg::OnBnClickedBtnAutobin(){IplImage iplimage =m_rightimage;IplImage *src = &iplimage;IplImage* src1=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);cvCvtColor(src, src1, CV_BGR2GRAY);  cvAdaptiveThreshold( src1, src1, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 5 );Mat img(src1);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}  void CTwoCameraOnTimer2Dlg::OnBnClickedBtnLog(){// TODO: 在此添加控制項通知處理常式代碼IplImage iplimage =m_rightimage;IplImage *src = &iplimage; IplImage* dst = cvCreateImage(cvGetSize(src),8,3);//注意相關參數的設定cvLogPolar(src,dst,cvPoint2D32f(10,10),40,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS);Mat img(dst);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}void CTwoCameraOnTimer2Dlg::OnBnClickedBtnFouier(){// TODO: 在此添加控制項通知處理常式代碼IplImage iplimage =m_rightimage;IplImage *src = &iplimage; //注意相關參數的設定cvDFT(&src,&src,CV_DXT_FORWARD,src->height);Mat img(src);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}void CTwoCameraOnTimer2Dlg::OnBnClickedBtnHist(){IplImage iplimage =m_rightimage;IplImage *src = &iplimage;IplImage* dst = cvCreateImage(cvGetSize(src),8,1);//必須為灰色//注意相關參數的設定cvCvtColor(src,dst,CV_RGB2GRAY);    cvEqualizeHist(dst,dst);Mat img(dst);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}void CTwoCameraOnTimer2Dlg::OnBnClickedBtnWater(){// TODO: 在此添加控制項通知處理常式代碼IplImage iplimage =m_rightimage;IplImage *src = &iplimage; IplImage* dst = cvCreateImage(cvGetSize(src),8,1);//必須為灰色 cvWatershed(dst,dst);  Mat img(dst);F_ShowImage(img,m_rightimage,IDC_PBRIGHT);}

 

程式碼視頻 http://pan.baidu.com/s/1dDINRnr o2p3

任何問題,請聯絡qq:1755311380

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.