VC++学习笔记

第1讲 VC++开发环境介绍
特点:增加了自动化和宏的功能、可定制的工具栏和菜单、增加了调试器、支持Internet连接、增加了项目工作区和文件、在工作区内可以包含多个并列的工程文件、增加了资源编辑器、增加了文本编辑器
第2讲 菜单、工具条的使用
只有设置了消息函数的菜单才是可以点击的
第3讲 菜单的使用
画线:CPen newPen;
    CPen *oldPen;
    newPen.CreatePen(PS_SOLID,m_line,m_color);

    CClientDC dc(this);
    
    CRect rect;
    GetClientRect(&rect);
    dc.FillRect(&rect,CBrush::FromHandle((HBRUSH)GetStockObject(BLACK_BRUSH)));

    oldPen = dc.SelectObject(&newPen);
    dc.MoveTo(30,30);
    dc.LineTo(300,200);
    dc.SelectObject(oldPen);
画矩形:CPen newPen;
    CPen *oldPen;
    newPen.CreatePen(PS_SOLID,m_line,m_color);

    CClientDC dc(this);
    
    CRect rect;
    GetClientRect(&rect);
    dc.FillRect(&rect,CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

    oldPen = dc.SelectObject(&newPen);
    dc.Rectangle(30,30,200,200);
    dc.SelectObject(&oldPen);
画圆:CPen newPen;
    CPen *oldPen;
    newPen.CreatePen(PS_SOLID,m_line,m_color);
    
    CClientDC dc(this);
    
    CRect rect;
    GetClientRect(&rect);
    dc.FillRect(&rect,CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

    oldPen = dc.SelectObject(&newPen);
    dc.Ellipse(50,50,120,120);//椭圆dc.Ellipse(50,50,120,180);
    dc.SelectObject(&oldPen);
浮动(弹出)菜单:Insert->Resource->Menu->New,在资源视图Menu中.先定义菜单,然后在View类中添加消息鼠标右键消息.菜单可以直接从主菜单复制粘贴过来就行了。
具体实现代码:CMenu dMenu;
    if(!dMenu.LoadMenu(IDR_POPUP))
        AfxThrowResourceException();
    CMenu *popupMenu = dMenu.GetSubMenu(0);
    ASSERT(popupMenu!=NULL);

    ClientToScreen(&point);
    popupMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,AfxGetMainWnd());
创建图形菜单:添加相应的图形资源Bitmap;然后在MainFrame中为创建的Bitmap声明变量;在MainFrame初始化时将变量.LoadBitmap(资源ID);在InitMenu的初始化中,为菜单修改图标,如pMenu->ModifyMenu(ID值,MF_BITMAP,ID值,&图标变量);
具体实现代码:pMenu->ModifyMenu(ID_TOOL_LINE,MF_BITMAP,ID_TOOL_LINE,&m_bitmap_line);
    pMenu->ModifyMenu(ID_TOOL_RECTANGLE,MF_BITMAP,ID_TOOL_RECTANGLE,&m_bitmap_rectangle);
    pMenu->ModifyMenu(ID_TOOL_ELLIPSE,MF_BITMAP,ID_TOOL_ELLIPSE,&m_bitmap_ellipse);
第4讲 工具条Toolbar和状态条CStatusBar的使用
工具条:先绘制工具条,然后为工具条定义变量,在MainFrame的Create函数里创建工具条.
具体代码实现:if(!m_toolbar.Create(this)||!m_toolbar.LoadToolBar(IDR_MAINFRAME))
        return -1;
    m_toolbar.EnableDocking(CBRS_ALIGN_ANY);//工具条随意停放
    EnableDocking(CBRS_ALIGN_ANY);//主窗口允许工具条随意停放
    DockControlBar(&m_toolbar);//讲工具条定位到窗体的最上方
    m_toolbar.SetBarStyle(m_toolbar.GetBarStyle()|CBRS_TOOLTIPS|CBRS_FLYBY);//CBRS_TOOLTIPS可以显示提示信息CBRS_FLYBY可以显示命令提示
状态条:定义状态条变量,然后在MainFrame消息映射的END_MESSAGE_MAP()下方加入static UINT IndicatorIDs[]={ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL};然后在MainFrame的Create中加入如下代码:if(!m_statusbar.Create(this)||!m_statusbar.SetIndicators(IndicatorIDs,sizeof(IndicatorIDs)/sizeof(UINT)))
        return -1;
画自己的状态条或者为自己的状态条添加提示信息:在View->Resource Symbols里New一个自己的变量名如ID_MYSELF,然后在String Table里的最后一行双击选择ID为ID_MYSELF,输入Caption为VC++6.0学习教程.然后将ID_MYSELF添加到IndicatorIDs里,就可以进行显示了。
如何显示选中的菜单?在菜单对应的UPDATE_COMMAND_UI命令里实现,它是在菜单触发后进行处理。
第5讲
如何显示选中的菜单?在菜单对应的UPDATE_COMMAND_UI命令里实现,它是在菜单触发后进行处理。m_Line_Index记录你所点击的菜单,然后设置就可以了。具体代码如下:pCmdUI->SetCheck(m_Line_Index == ID_LINE_SINGLE?1:0);
修改主窗体图标和标题:在App文件里修改,代码如下m_pMainWnd->SetWindowText("VC++ 6.0软件学习");
    HICON myIcon;
    myIcon = AfxGetApp()->LoadIcon(IDI_myIcon);
    m_pMainWnd->SetIcon(myIcon,TRUE);
第6讲 登录对话框
登录对话框放在CMainFrame的Create里
UpdateData(TRUE)控件值传递给变量
UpdateData(FALSE)变量值传递给控件
登录失败后:AfxGetMainWnd()->PostMessage(WM_QUIT);EndDialog(IDCANCEL);
第7讲 模式、非模式、向导对话框
非模式对话:定义对应的指针变量,初始化为NULL,具体实现放在CMainFrame和View类都可以。在单击菜单时执行如下代码:if(pFrmModelless == NULL)
    {
        pFrmModelless = new CFrmModelless1();
        pFrmModelless->Create(IDD_DIALOG_MODELLESS);
        //pFrmModelless.
    }
    pFrmModelless->ShowWindow(TRUE);
向导对话框:多个对话框的连接实现,对话框的Styles属性中Style设为Child,Border设为Thin,取消System menu。为对话框创建类时,一定要选择基类为CPropertyPage。在第一个页面OnSetActive里添加CPropertySheet * pSheet = (CPropertySheet *)GetParent();
    pSheet->SetWizardButtons(PSWIZB_NEXT);//设置下一步按钮
在最后一个页面OnSetActive里添加CPropertySheet *pSheet = (CPropertySheet *)GetParent();
    pSheet->SetFinishText("完成");//设置为最后一页
也可以用pSheet->SetWizardButtons(PSWIZB_FINISH);设置为最后一页,两者之间有点小区别
在OnWizardFinish里添加MessageBox("你已经完成安装向导!","信息提示");
然后创建一个新类CTrySheet,基类为CPropertySheet,在类中定义相关属性也CTryPage1 m_TryPage1;
    CTryPage2 m_TryPage2;
    CTryPage3 m_TryPage3;
    CTryPage4 m_TryPage4;
    CTryPage5 m_TryPage5;
    CTryPage6 m_TryPage6;
将属性页添加进去CTrySheet::CTrySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
    :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
    AddPage(&m_TryPage1);//添加第一页
    AddPage(&m_TryPage2);
    AddPage(&m_TryPage3);
    AddPage(&m_TryPage4);
    AddPage(&m_TryPage5);
    AddPage(&m_TryPage6);//添加最后一页
}
最后在菜单中实现代码就可以了CTrySheet sheet("");
    sheet.SetWizardMode();
    sheet.DoModal();
在中间的属性页的OnSetActive里添加CPropertySheet * pSheet = (CPropertySheet *)GetParent();
    pSheet->SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);//设置上一步和下一步按钮,或者在第一个属性页的OnSetActive里添加pSheet->SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
通用对话框:打印对话框,先定义一个菜单,在菜单消息中实现代码:CPrintDialog dlg(FALSE,PD_NOSELECTION|PD_NOPAGENUMS,this);
    if(dlg.DoModal() == IDOK)
        return ;
查找对话框:CFindReplaceDialog *dlg = new CFindReplaceDialog();
    dlg->Create(FALSE,"1","2",FR_DOWN,this);//TRUE和FALSE分别代表查找和查找/替换对话框。FR_DOWN设置查找方向。
第9讲
文件对话框:char szFilters[] = "数据文件(*.dat)|*.dat|所有文件 (*.*)|*.*||";
    CFileDialog dlg(TRUE,"数据文件",".dat",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,szFilters);//为TRUE时是打开对话框,为FALSE时是保存对话框。
    dlg.DoModal();
颜色对话框:CColorDialog dlg;
    dlg.DoModal();
第10讲
部分代码:RECT m_pRect;GetDlgItem(IDC_SAMPLE)->GetWindowRect(&m_pRect);ScreenToClient(&m_Rect);InvalidateRect(&m_pRect);UpdateWindow();CBrush NewBrush(RGB(255,0,0));CClientDC dc(this);dc.FillRect(&m_pRect,&NewBrush);
((CButton *)GetDlgItem(IDC_RADIO_RED))->SetCheck(TRUE);//设置默认选中,为FALSE为不选中
((CButton *)GetDlgItem(IDC_RADIO_RED))->GetCheck();返回1表示选上,0表示没选上
可以为RadioButton设一个Control类型变量,然后设置Check状态;也可以为一组RadioButton设一个int型变量,然后再窗体构造函数中指定默认选择的RadioButton,0为第一个,以此类推;设置选中状态和获取选中状态只需要看int变量的值,然后进行UpdateData();
RadioButton分组:现将其的TAB ORDER排序,用Ctrl D,然后点击鼠标就可以了。将每一组的第一个RadioButton的Group属性选中就可以分组了。每一组只能定义一个变量。

第11讲
在排序属性在Styles里的Sort
m_Listbox.InsertString(-1,"ID1");//index为-1时,总是插入到ListBox的末尾,index的值要小于等于ListBox的行数才行。
m_Listbox.AddString("AddString");//在最后的位置添加行
m_Listbox.DeleteString(3);//删除指定行
m_Listbox.ResetContent();//清空所有数据
m_Listbox.GetCount();//获取行数
m_Listbox.FindString(index,string);//查找指定index后的指定字符串的index值;
m_Listbox.GetText(index,string);//获取指定index的值
m_Listbox.GetTextLen(index);//获取指定index的字符串的长度
m_Listbox.SetItemData(index,dword);//设置相应的index的附加值
m_Listbox.GetItemData(index);//返回相应index对于的附加的dword值
m_Listbox.GetCurSel();//获取选中的行号;
m_Listbox.SetCurSel(index);//设置对应行被选中;
m_Listbox.GetSelCount();//当多选时返回选中的数
第12讲
ComboBox的用法基本上同ListBox的用法相同
m_combo.AddString(string);//在最后的位置添加行
m_combo.InsertString(index,string);//index为-1时,总是插入到ListBox的末尾,index的值要小于等于ComboBox的行数才行。
m_combo.DeleteString(index);//删除指定行
m_combo.ResetContent();//清空所有数据
m_combo.GetLBText(index,string);//获取指定index的值
m_combo.GetLBTextLen(index);//获取指定index的字符串的长度
m_combo.SetCurSel(index);//设置对应行被选中;
m_combo.GetCurSel();//获取选中的行号;
m_combo.SetItemData(index,dword);//设置相应的index的附加值
m_combo.GetItemData(index);//返回相应index对于的附加的dword值
第13讲
m_ListCtrl的Styles的View设置为Report
LV_COLUMN列数据结构
LV_COLUMN m_col;
定义列:m_col.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;
m_col.pszText="姓名";
m_col.fmt=LVCFMT_CENTER;
m_col.cx=100;
m_col.iSubItem=0;
m_ListCtrl.InsertColumn(1,&m_col);

m_col.pszText="年龄";
m_col.iSubItem=1;
m_ListCtrl.InsertColumn(2,&m_col);

m_col.pszText="民族";
m_col.iSubItem=2;
m_ListCtrl.InsertColumn(3,&m_col);
LV_ITEM行数据结构
插入行:
m_ListCtrl.InsertItem(index,string);
m_ListCtrl.SetItemText(行index,列index,string);
m_ListCtrl.DeleteItem(index);//删除指定行
m_ListCtrl.GetItemText(item,subitem);//获取指定行
m_ListCtrl.DeleteColumn(index);//删除指定列
Tree的使用
HTREEITEM ht,ht1;
ht=m_tree.InsertItem("A");
ht1=m_tree.InsertItem("A1",ht);
m_tree.InsertItem("A2",ht);
m_tree.InsertItem("A3",ht);
m_tree.InsertItem("A1a",ht1);
m_tree.InsertItem("A1b",ht1);
m_tree.InsertItem("B");
m_tree.InsertItem("C");
Tab的使用
m_tab.InsertItem(0,"第一页");
m_tab.InsertItem(1,"第二页");
m_tab.InsertItem(2,"第三页");

第14讲
定义类变量:CString m_szName;
    CFont m_font;
View类的构造函数实现:LOGFONT lf;
    lf.lfHeight = -250;//逻辑单位指定的高度
    lf.lfWidth = 0;
    lf.lfEscapement = 0;
    lf.lfOrientation =0;
    lf.lfWeight = FW_HEAVY;
    lf.lfItalic = TRUE;
    lf.lfUnderline = FALSE;
    lf.lfStrikeOut = FALSE;
    lf.lfCharSet = GB2312_CHARSET;
    lf.lfOutPrecision = OUT_STROKE_PRECIS;
    lf.lfClipPrecision = CLIP_STROKE_PRECIS;
    lf.lfQuality = DRAFT_QUALITY;
    lf.lfPitchAndFamily = VARIABLE_PITCH|FF_MODERN;
    strcpy(lf.lfFaceName,"楷体_GB2312");
    m_font.CreateFontIndirect(&lf);
    m_szName = _T("空心汉字");
在View的OnDraw里实现:if(m_font.GetSafeHandle()!= NULL)
    {
        CFont *pOldFont = (CFont *)pDC->SelectObject(&m_font);
        pDC->SetBkMode(TRANSPARENT);
        int cx = 100,cy = 100;
        CString sTemp = m_szName;
        cx+=3;
        cy+=3;
        pDC->SetTextColor(GetSysColor(COLOR_3DDKSHADOW));
        pDC->TextOut(cx + 2,cy - 2,sTemp);
        pDC->TextOut(cx + 2,cy + 2,sTemp);
        pDC->SetTextColor(GetSysColor(COLOR_3DHILIGHT));
        pDC->TextOut(cx + 1,cy -2,sTemp);
        pDC->TextOut(cx -2,cy + 1,sTemp);
        pDC->TextOut(cx -2,cy -2,sTemp);
        pDC->SetTextColor(GetSysColor(COLOR_3DSHADOW));
        pDC->TextOut(cx - 1,cy + 1,sTemp);
        pDC->TextOut(cx + 1,cy - 1,sTemp);
        pDC->TextOut(cx + 1,cy + 1,sTemp);
        pDC->SetTextColor(GetSysColor(COLOR_3DHILIGHT));
        pDC->TextOut(cx ,cy - 1,sTemp);
        pDC->TextOut(cx - 1,cy ,sTemp);
        pDC->TextOut(cx - 1,cy - 1,sTemp);
        pDC->BeginPath();
        pDC->TextOut(cx,cy,sTemp,8);
        pDC->EndPath();
        pDC->SetPolyFillMode(WINDING);
        pDC->StrokeAndFillPath();
        pDC->SelectObject(pOldFont);
    }
可以实现相应的字体

第15讲 滚动字幕已经时钟的使用
在对话框里定义:void DrawH();
    void DrawV();
    CString m_str;
    CBrush m_brush,m_brush1;
    UINT TIMER;
    CPen pen;
    int minWidth;
    int WidthX;
    int Heighty;
    int maxHeight;
在对话框的构造函数里:
WidthX = 200;
    minWidth = 10;
    Heighty = 15;
    maxHeight = 200;
    m_str = "欢迎使用本程序";
    TIMER = 0;
    m_brush.CreateSolidBrush(RGB(180,240,210));
    m_brush1.CreateSolidBrush(RGB(255,0,0));
在初始化对话框里:TIMER = SetTimer(1,150,NULL);
在对话框的OnPaint里:CPaintDC dc(this);
    dc.SetTextColor(RGB(180,240,210));//字体颜色
    dc.SetBkMode(TRANSPARENT);//背景模式
    CRect rect;
    rect.left = 150;
    rect.right = 350;
    rect.top = 10;
    rect.bottom = 40;
    dc.Rectangle(&rect);
    dc.FillRect(&rect,&m_brush1);

    rect.left = 10;
    rect.right = 135;
    rect.top = 40;
    rect.bottom = 200;
    dc.Rectangle(&rect);
    dc.FillRect(&rect,&m_brush1);
    dc.TextOut(WidthX,15,m_str);//输出文字
    dc.TextOut(15,Heighty,m_str);
实现:void CFrmMove::DrawV()
{
    CRect rect;
    rect.left = 10;
    rect.right = m_str.GetLength() + rect.left + 120;
    CFont *font = GetFont();
    LOGFONT logFont;
    font->GetLogFont(&logFont);
    rect.top = Heighty;
    rect.bottom = rect.top + logFont.lfHeight + 40;
    InvalidateRect(&rect);
    Heighty+=logFont.lfHeight + 18;
    if(Heighty>=maxHeight)
        Heighty = 15;
    UpdateWindow();

}

void CFrmMove::DrawH()
{
    CRect rect;
    rect.top = 15;
    CFont *font = GetFont();
    LOGFONT logFont;
    font->GetLogFont(&logFont);
    rect.bottom = rect.top + logFont.lfHeight + 80;
    rect.left = WidthX - m_str.GetLength() - 10;
    rect.right = rect.left + m_str.GetLength() + 150;
    InvalidateRect(&rect);
    if(WidthX<10)
        WidthX = 350;
    WidthX-=6;
    UpdateWindow();
}
在OnTimer里:DrawH();
    DrawV();
在对话框的OnCtlColor里:
//return hbr;
return m_brush;//改变背景的颜色

第16讲
CFont类封装了Windows图形设备接口,并管理字体的成员函数

第17讲 图形的操作方法
pDC->SetPixel(100,100,RGB(0,0,255));
    pDC->MoveTo(100,100);
    pDC->LineTo(300,100);//画直线

    CRect rect1(200,300,300,400);
    POINT point1,point2;
    point1.x = 400;
    point1.y = 230;
    point2.x = 240;
    point2.y = 600;
    pDC->Rectangle(&rect1);//画矩形
    pDC->Arc(&rect1,point1,point2);//画弧
    CRect rect2(100,100,350,250);
    pDC->Ellipse(&rect2);//画椭圆和圆

    CRect rect3(150,300,50,350);
    POINT point3,point4;
    point3.x = 360;
    point3.y = 260;
    point4.x = 300;
    point4.y = 500;
    pDC->Pie(&rect3,point3,point4);//画扇形
    CRect rect1(100,100,300,300);
    pDC->DrawFocusRect(&rect1);//画边线为虚线的矩形

    CRect rect2(250,250,350,350);
    CBrush brush(RGB(0,123,222));
    pDC->FillRect(rect2,&brush);//用颜色填充矩形

    CRect rect3(200,200,400,400);
    pDC->FrameRect(rect3,&brush);//用颜色画出矩形框
    pDC->InvertRect(&rect3);//用黑色填充矩形
画笔的用法:CPen hRedPen(PS_SOLID,1,RGB(255,0,0));
    CPen *pBluePen;
    pBluePen = new CPen(PS_SOLID,1,RGB(0,0,255));
    CPen hGreenPen;
    hGreenPen.CreatePen(PS_SOLID,1,RGB(0,255,0));
    pDC->SelectObject(&hRedPen);
    pDC->Ellipse(110,110,300,250);
    pDC->SelectObject(pBluePen);
    pDC->Ellipse(130,110,280,250);
    pDC->SelectObject(&hGreenPen);
    pDC->Ellipse(150,110,260,250);

CPen *pPen,hPen;
    LOGPEN logPen;
    POINT Width={20,0};
    logPen.lopnStyle=PS_DASH;
    logPen.lopnWidth=Width;
    logPen.lopnColor=RGB(0,255,0);
    hPen.CreatePenIndirect(&logPen);
    pPen = pDC->SelectObject(&hPen);
    pDC->Ellipse(110,70,300,260);
    pDC->SelectObject(pPen);

CRect rect(80,80,330,320);
CBrush *pBrush;
pBrush=(CBrush*)pDC->SelectStockObject(BLACK_BRUSH);
pDC->Ellipse(rect);
pDC->SelectObject(pBrush);
CBrush SolidBrush([HS_VERTICAL,HS_CROSS]RGB(255,0,0));
CBrush *pBrush;
CBrush NewBrush;
pBrush = pDC->SelectObject(&SolidBrush);
pDC->Rectangle(120,120,200,200);
NewBrush.CreateSolidBrush(RGB(0,0,255));
pDC->SelectObject(pBrush);

第18讲 Windows的坐标模式
MessageBeep可以付出响声
CRect rect;
GetClientRect(&rect);
pDC->SetMapMode(MM_ANISOTROPIC);//MM_ISOTROPIC
pDC->SetViewportOrg(0,0);
pDC->SetViewportExt(rect.right,rect.bottom);
pDC->SetWindowOrg(0,0);
pDC->SetWindowExt(20000,20000);
pDC->MoveTo(2000,2000);
pDC->LineTo(2000,19000);
pDC->LineTo(19000,19000);
pDC->LineTo(2000,2000);
以上代码图形随界面大小变化而变化
在View的OnCreate函数里(Caret为POINT的public变量)
TEXTMETRIC tm;
    CClientDC dc(this);
    dc.GetTextMetrics(&tm);
    CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
    Caret.x = 0;
    Caret.y=tm.tmHeight;
    SetCaretPos(Caret);
    ShowCaret();
在View的OnChar函数里(实现输入显示):
    SIZE size;
    static UINT dy = Caret.y;
    CString a;
    a = nChar;
    CClientDC dc(this);
    for(UINT i=0;i<nRepCnt;i++)
    {
        HideCaret();
        switch(nChar)
        {
            case '\r':
                Caret.x=0;
                Caret.y+=1;
                break;
            default:
                dc.TextOut(Caret.x,Caret.y,a,1);
                size=dc.GetTextExtent(a);
                Caret.x+=size.cx;
        }
        SetCaretPos(Caret);
        ShowCaret();

    }
第19讲
在Timer事件里绘制时钟
CRect rect(50,50,250,250);
    CBrush brush(RGB(255,0,0));
    CClientDC dc(this);
    dc.Ellipse(&rect);
    dc.MoveTo(150,150);
    x = 150 + (int)(100 * sin(arc));
    y = 150 - (int)(100 * cos(arc));
    arc += 0.10471;
    dc.LineTo(x,y);
通过SIZE和DRAW事件,可以随着窗体大小的变化而绘制相应大学的图片
OnDraw函数里:
CBrush brush(RGB(0,0,255));
    pDC->SelectObject(&brush);
    pDC->Rectangle(0,0,m_cx,m_cy);
OnSize函数里:
m_cx = cx;
    m_cy = cy;
用鼠标事件实现选取颜色画图:
CRect picRect,rect;
    m_pic.GetWindowRect(&picRect);
    ScreenToClient(&picRect);//转换区域
    if(picRect.PtInRect(point))
    {
        m_rect.GetWindowRect(&rect);
        ScreenToClient(&rect);
        COLORREF rgb;
        CBrush brush;
        CClientDC dc(this);
        rgb = dc.GetPixel(point);
        brush.CreateSolidBrush(rgb);
        dc.SelectObject(&brush);
        dc.FillRect(&rect,&brush);
    }

第20讲 用鼠标实现绘图
主要用到三个函数(可以限定画图区域和鼠标光标):
OnRButtonDown:m_start = point;
    m_stop = point;
    bDrawing = true;
OnMouseMove:    if(bDrawing)
    {
        CClientDC dc(this);
        dc.SetROP2(R2_NOT);//以当前背景颜色的相反颜色作为线条颜色
        dc.MoveTo(m_start);
        dc.LineTo(m_stop);
        m_stop = point;
        dc.MoveTo(m_start);
        dc.LineTo(m_stop);
    }
OnRButtonUp:bDrawing = false;或者
if(bDrawing)
{
bDrawing = false;
CClientDC dc(this);
        dc.SetROP2(R2_NOT);//以当前背景颜色的相反颜色作为线条颜色
        dc.MoveTo(m_start);
        dc.LineTo(m_stop);
        dc.MoveTo(m_start);
        dc.LineTo(m_stop);
}
在PreCreateWindow里cs.lpszClass = AfxRegisterWndClass
        (CS_HREDRAW|CS_VREDRAW,0,(HBRUSH)::GetStockObject(WHITE_BRUSH),0);
消除鼠标抖动的问题。

第21讲 保存画的直线以及CPU使用率

第22讲 图形图像高级使用OpenCV
下载地址:www.opencv.org.cn
安装之后在系统中添加路径:OpenCV目录\bin;
在VC中Tools->Options->Directories里添加Include Files:CV、CVAUXCXCORE、ML、OTHERLIBS\HIGHGUI下Include
在Library Files里添加OpenCV\Lib
调用已有的demo,先加头文件Project->Setting->Link->Category (General)Object/Librarymodules中加入LIb里的文件,多个文件用空格分隔
在VC下编译要加入头文件cv.h和highgui.h,在VC中直接进行代码拷贝
2.0 没有找到libcv200.dll
1.0 没有找到cxcore100.dll

第23讲 摄像头的视频以及视频播放
第24讲 视频监控抓图比较报警功能
Open Computer Vision Library可以获取最新的OpenCV的版本

第25讲 文档文件类相关的操作
GetTitle获取文档标题
SetTitle设置文档标题
获取和设置路径GetPath、GetPathName、SetPathName
Addvise、RemoveView和UpdateAllViews都是处理视图

第26讲 文件操作
CFile::Write(char *,int);//写入
CFile::Flush();//
CFile::Seek文件指针的移动
CFileDialog::GetPathName()//获取选择文件名
CFile::modeCreate|modeNoTruncate|modeReadWrite

第27讲 复制删除文件
CFile::Remove(文件名)//指定文件名删除就可以了
TRY CATCH(CFileException,e) END_CATCH//异常处理
复制:CFile * pSrcFile = NULL;CFile * pDstFile = NULL;pSrcFile = new CFile(文件名,CFile::modeRead);
pDstFile = new CFile(文件名,CFile::modeCreate|CFile::modeWrite);
int nRead;char szBuffer[1024];
TRY{while(nRead=pSrcFile->Read(szBuffer,sizeof(szBuffer)))
pDstFile->Write(szBuffer,nRead);
pSrcFile->Close();pDstFile->Close();delete pSrcFile;delete pDstFile;}CATCH(CFileException e)
{if(pSrcFile != NULL) {pSrcFile->Abort();delete pSrcFile;}if(pDstFile != NULL) {pDstFile->Abort();delete pDstFilediH
}

第28讲 线程的使用
CreateThread创建线程,返回线程Handle
参数分别为:是否可以被继承、栈大小、线程函数名、参数、创建标志、存放线程标志的变量指针
TerminateThread停止、结束线程,返回BOOL
参数:线程句柄、线程终止码
SuspendThread挂起线程,成功返回该线程挂起计数
参数:线程句柄
ResumeThread:重新启动线程,参数为为线程句柄,成功返回线程挂起计数减一
线程可以通过Sleep进行休眠
互斥花费的时间比临界区多,但是可以跨进程使用,等待时可以有TimeOut
互斥器:CreateMutex,创建或打开有名或无名的Mutex对象,成功返回Mutex的句柄,参数:返回句柄是否可以被子进程继承、指定初始的拥有者、互斥器的名称,如果创建时已经被创建,则拥有者被忽略。
OpenMutex:打开存在名称的互斥器,参数:指定访问类型、是否可以被继承、互斥器名称
ReleaseMutex:是否互斥器,参数:互斥器句柄
示例:赛马

第29讲 线程赛马程序的实现

第30讲 线程赛马程序的实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值