MFC主要知识点

  WIN32
1. WM_COMMAND是由菜单,加速键,工具栏按钮,按钮发出;wParam包含ID,lParam包含句柄;
 
2  LOWORD()就是取低字节的,将DWORD转成WORD;


3  消息处理函数返回TRUE,表示你处理过的;return FALSE为系统帮你做;


4 标准客户区绘图,一定要在WM_PAINT中进行才能执行:客户区分为背景和前景
  STRUCTPAINT是一个绘图结构体数据类型(包含HDC等),BeginPaint()能够获得绘图句柄;必须和EndPaint()成对存在,解除关联关系的作用;只能在他们之间绘图;
  Ellipse()的坐标以矩形左上角右下角坐标画的椭圆;Rectangle()左上角右下角坐标画的矩形;以根据hdc的来源为基准,非客户区就以整个窗口的左上角为原点,客户区就以客户区的左上角为原点;
  MoveToEx()和LineTo()能够绘制一条线(直线或曲线),分别为起点和终点; 
  
  客户区的临时的绘图:
  GetDC()获取hdc,releasedc()解除hdc与窗口的关系;任何消息(除了WM_PAINT)下可执行,漂浮在窗口表面的图形,只能覆盖客户区,界面一更新就没了;只能管理到整个这个窗口的
  客户区域;如果参数是NULL,就是整个屏幕的hdc,那坐标基于屏幕;


  非客户区的绘图:
  GetWindowDC()和ReleaseDC()来获取分离hdc,要在WM_NCPAINT中执行(在这里,不会被刷新掉);管理到整个窗口的非客户区域;如果参数是NULL,就是整个屏幕的hdc,那坐标基于屏幕;
  自己不做时,return FALSE,用缺省;


5 TextOut()用来输出文字(需要绘图句柄);SetTextColor()来设置hdc所代表的客户区的文字颜色,刷新界面可通过WM_MOVE(非客户区的刷新通过SengMessage(),客户区的刷新通过InvalidateRect);
    
6: 设置图标在WM_INITDIALOG中发送WM_SETICON;


7: 在WIN32下的ID早期都是字符串型;


MFC 调试函数


TRACE()宏一般是用在mfc中的,用于将调试信息输出到vs的输出窗口中;


MFC
1:  CDialog类是在屏幕上显示的对话框基类。对话框有两类:模态对话框和非模态对话框。模态对话框在应用继续进行之前必须关闭。
    模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该
    对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。


2:  CListCtrl应用在作表格上最多,所以一般研究的功能都是Report view。InsertItem是向控件申请一行来放数据,记住只是申请,
   (但是可以完成第一列数据的放置)那么放数据的工作就又SetItemText来实现。列的增加是初始化时采用InsertColumn而行的增
    加是采用InsertItem,有多列时,每行的后面数据才采用setItemText来显示。


3:  winmain的第三个参数用于传参,就是在应用程序加载前传入数据,通过命令行或者debug中程序参量。第四个参数为窗口显示模式
   (最小化,最大化,常规窗口等显示)。加载对话框就要使用第一个参数,因为它包含了所有资源。


4: 缺省,又译“默认”。即系统默认状态。消息处理函数的返回值为true,就是自己处理;false则系统处理;
    ctrl+D能控制光标的位置;


5:  列表控制的成员函数CListCtrl::GetSelectionMark(单项)的返回值是列表中焦点所在的行数(从第0行开始记),如果没有焦点在列表
  上则返回-1和它对应的函数还有一个CListCtrl::SetSelectionMark,设置选中行;DeletItem删除列表行,参数为行数;
   GetFirstSelectedItemPosition(返回POSITION类型(空结构体))和GetNextSelectedItem(参数就是上面这个返回的,并且会被下一个位置更新,
  全部选完后,就变0)(返回int)可遍历每一行;CListControl中用DeleteItem()会使行发生改变,所以删除就要从后面开始删除(用个数组保存位置);
   如果没选第一个会返回NULL,那第二个返回-1,就跟前面的一样;还有GetSelectedCount(),表示选中的个数,如果和GetSelectionMark联合使用可以的(基于蓝线);
   (GetSelectionMark  让其)基于虚线,(另外两个让他)基于蓝字;


6: CListCtrl类的InsertItem(设置第一列,有它,才能插入)和SetItemText(设置除第一列)连用,InsertItem(加行要声明)是声明在这要加一行,在已有项
    上加,会把已有的排到下面去,SetItemText可直接设置某一行(没声明,有项时);还有GetItemCount函数获得已有的行数(个人理解:
    第一列的个数);


7: mfc中的消息框只有一个函数使用时,可以只调用AfxMessageBox(LPCTSTR lpszText)(全局函数);这样默认风格为AfxMessageBox(LPCTSTR lpszText
    ,MB_OK|MB_ICONEXCLAMATION ),用字符串表中ID一样;第一个参数为框内内容,可以字符串相加,第二个为风格,第三个是一般用默认;不能控制标题,
    标题是可执行文件的名字,MessageBox(窗口类函数)可控制;函数中是调用了CWinApp类的DoMessageBox(),所以它的名字是m_pszAppName,AfxMessageBox的返回值是按得键
     的ID;


8   窗口类的函数:GetDlgItemInt,SetDlgItemInt,GetDlgItem,GetDlgItemText(编辑框就是窗口类的,第二个参数要有字符串的格式,要有结束符,获取前字符串自动清0),
    SetDlgItemText()(设置前字符串自动清0);
    mfc中的类都继承了CWnd类;


9   谁调用了SengMessage/PostMessage函数,就将消息传给谁;WM_CLOSE消息是讲应用程序关闭;返回值不同,同步与异步,同线程与不同线程;也可向控件发送消息;
    SendMessage/PostMessage的附加消息第一个参数是附加消息,第二个附加数字(0x)(前四位为y,后四位为x);而且是这两个一一相对应相关函数。




10  FindWindow只负责查找主窗口;要在桌面存在,而CWnd的GetWindow()可获得父和子窗口,但不能确定哪一个,按照先后方的顺序;


11  GetDeskTopWindow()返回桌面句柄,能让非模式对话框脱离父窗口;


12  WM_CREAT,通用窗口初始化,就是一切窗口都要调用,窗口还未出现,只创建了主窗口,副窗口和控件未创建;WM_InitDialog创建了副窗口和控件,所以只能在它中对父窗口和控件进行操作;
    WM_Destroy,窗口消失了,这个用于消灭残余;OnCreat()比OnInitDialog(其中包括类向导控件关联变量)先调用;
  
    模式对话框的创建过程:构造函数->DoModal()->PreSubClass()(允许首先子类化一个窗口)-》OnCreat()-》OnSize()->OnMove()->OnSetFont(允许改变控件的颜色)
     ->OnInitDialog()->OnShowWindow()(被ShowWindoow()函数调用)->OnCtlColor()(在这里之前父窗口框架显示出来,每个控件都调用)->OnChileNotify()(作为WM_CTLCOLOR的结果发送)。
    OnPaint()比OnInitDialog()晚调用;OnEraseBkgnd()比OnInitDialog()晚调用(对话框还没弹出来);


    非模式对话框:PreSubClass()->OnCreate()->OnSize->OnMove->OnSetFont();所以要自己显示;
    
    OnInitDialog时控件就创建完成了,在这里可以对控件操作;CDialog::OnInitDialog函数中关联变量被关联,因为其中调用了DoDataExchange();


13  对控件名改写有(GetDlgItem()和SetWindowText())和(SetDlgItemText());GetDlgItem()获取的类指针是临时的,所以用SubClassDlgItem();


14  EndDialog,使对话框虽然存在但不可视,这个跟DoMadal()的返回值有关;窗口关闭过程:OnSysCommand()-->OnClose()-->OnCancel-->EndDialog()-->OnDestroy();执行最后一个
    无法终止关闭;


15 WM_SYSCOMMAND的映射函数管理所有系统菜单和系统按钮消息;


16 对模式对话框,DoModal函数自动调用DestroyWindow,而对非模式对话框,我们若要使用OK或者Cancle按钮结束对话框,必须重写OnOK按钮以使其调用DestroyWindow销毁窗口,将m_hWnd清0
   但对象的堆空间不删除,。OnOK()和OnCancel()消息响应函数并没有调用DestroyWindow,它们只是调用了EndDialog跳出循环RunModalLoop,并没有销毁窗库。模式对话框的底层为
   我们实现了对话框的create和destroywindow,所以我们可以只管dlg.domodal()来显示,然后调用EndDialog来结束。非模式对话框,直接删除对象的堆空间,析构函数自动调用
   DestroyWindow();CDialog::OnDestroy()是用于将控件容器清0;非模式对话框的显示用ShowWindow()或者设置属性可见;CDialog::Create()的第二个参数为NULL时,它的父窗口是主窗口;


17 虚函数不需再写映射机制了,因为在基类中映射了,而且是与函数名;??


18 非模式对话框的对象要生命期比较长,用new成堆(多个),或者为私有变量(但只能创一个);CDialog类的DoMadal()具有阻塞性,要等返回值;用的是CDialog类的,该类中能够将焦点
   移到任何控件上;


19 窗口类型名不区分大小写;


20 CWnd类有将对象自动转换为句柄的函数,所以获取窗口的句柄多了一个方法;有将句柄转换为临时CWnd*的函数FromHandle(HWND hWnd),不能保存,和GetDlgItem一样;


21 CWnd的GetDlgItem和GetSafeHWnd()能够得到一个窗口的指针,并且可以避免指针为空的情况(在使用指针的情况);


22 CWnd类中核心是m_hWnd;用CWnd类中的GetSafeHWnd()能够得到窗口句柄,如果没有窗口还没关联,就返回NULL;所以没关联之前用这个;


23 WS_什么是通用窗口风格,能在Create中用;


24 CWnd类的Attach()和Detach()连用;将窗口句柄与对象关联和分离;SubClassWindow()和UnSubClassWindow()(子类化)不仅有将窗口句柄与对象关联的作用,而且能够接收窗口消息
(不知是不是用一个派生类对象????);SubClassDlgItem是传入控件ID,容易一些,将对象与什么控件关联,不需要分离;


25 CWnd的GetStyle()和ModifyStyle()函数获取和修改窗口风格(取出和添加);还有GetExStyle()和ModifyStyleEx()获取和修改函数扩展风格;先要将原有风格清理,参数为WS_TOOLWINDOW时可以不在任务栏;可以通过SetWindowPos()将窗口置顶;
   eg:ModifyStyle(GetStyle(),0,0);ModifyStyleEx(GetExStyle(),0,0),修改成只有客户区(将窗口风格和扩展风格去掉);
   ModifyStyle()添加了WS_SYDMENU风格时,就是可以下面菜单,但是一直没有最大化和最小化;


26 CWnd有一个刷新函数Invalidate(),而InvalidateRect()更强大,包括了前面一个,能实现局部刷新,TRUE代表更新背景,fALSE代表更新前景(&rect为NULL,更新整个客户区);这两个函数
   是使窗口重画,调用WM_PAINT;重绘是先背景再前面绘图,在重绘背景的时候,前面的绘图就无效了,一刷新就没了;


27 窗口移动到特定位置的函数:GetWindowRect()(坐标系基于屏幕,原点为左上方),ScreenToClient()(哪个调用它就向哪个转换,这个根据API的,针对矩形)和MoveWindow()(控件坐标系基于父对话框,
原点为客户区左上方;父窗口基于屏幕);GetClientRect()获取用户区的区域,来处理越界问题(基于客户区);SetWindowPos()第一个参数是三维和前台显示,z轴向电脑里面,但需要刷新,可以设置窗口大小;
  最后一个参数是方便的东西,是不能移动等功能;API:GetSystemMetrics(int nIndex)能够通过它得到屏幕分辨率x,y(参数分别为SM_CXSCREEN,SM_CYSCREEN),获取系统的标准宽度;(滚动轴宽度和图标,屏幕的大小)
  屏幕分辨率是以屏幕左上角为坐标(0,0)。横向为x正轴,纵向为y正轴,所以为屏幕坐标。窗口坐标是窗口左上角那一点在屏幕上的坐标。窗口大小就是窗口横向宽度和纵向高度。
  MoveWindow()也能改变窗口大小,按比例改变,(在OnInitDialog())当窗口移到左上角为(0,0)时,移动会失败,就在自己原地方,但大小按比例变化,这个问题不仅是MFC窗口,其它的标准窗口程序也一样,
  应该是windows系统的问题;


   ClientRect 指 WindowRect 去掉边框和标题部分,就是用来摆放子控件的。只受边框风格影响,和子控件摆放无关。
28 风格有独自的标志符;


29 FlashWindow()让窗口闪烁一下;




30 CWnd类的SetTimer()启动计时器,调用OnTimer(),摧毁计时器KillTimer(int nIDEvent);timerID用于多个计时器;


31 CWnd的GetActiveWindow()能够获取正在活动窗口;


32 GetModuleName()用于获取执行文件或者DLL模块的具体路径和文件名


33 m_pszAppName的获取(a:执行文件名;b:AFX_IDS_APP_TITLE(字符串表);c:基类构造函数;优先顺序为从右到左);


34 Afx开头的MFC全局函数
AfxGetApp()用于获取theApp对象的地址;=AfxGetThread();
AfxGetMainWnd()调用了CWinApp类基类函数GetMainWnd();优先返回m_pMainWnd(基类成员) ,如果m_pMainWnd(基类成员)为空,则返回m_pActiveWnd;
AfxGetAppName()=theApp.m_pszAppName;获取AppName的名字字符串;
AFxGetInstanceHandle()获取theApp的m_HInstance进程句柄;
AfxGetResourceHandle()一般情况,ResourceHandle是InstanceHandle;


35 MAKEINTRESOURCE是能实现整数类型强制转换为字符串指针类型,其实还是强制转化语句(LPCTSTR什么);


36 系统内有图标(IDI开头),而且全部强制转化为LPCTSTR;


37 CWinApp类中获取应用程序图标LoadIcon,获取系统图标为LoadStandardIcon();


38 SetIcon()在CWnd类中,SetCursor()为API函数;设置光标在两个地方,OnMouseMove()和OnSetCursor()函数中,OnSetCursor()有基类缺省(IDC_ARROW),因为有回调函数,所以整个
   运行过程都调用,跟MouseMove()一样,能够获得光标所在的窗口;
   在WIN32中WM_SETICON直接帮你按上;


39CWnd类的GetDlgCtrlID()能够获取控件ID和自己的ID;


40 CWinApp类的WriteProfileInt()和WriteProfileString()用于写入.ini文件中保存;GetProfileInt()和GetProfileString()获取(第三个参数为缺省值).ini文件中的东西;
  如果有SetRegistryKey()(写在InitInstance()),则不再写入(工程名.ini文件)中,写入注册表中(这三个可以同时用);自动生成文件;配置文件保存在windows目录下和
  可执行文件名相同的INI文件中;


41 CWinApp类的SetDialogBKColor()修改对话框和控件文字颜色,大多数要在InitInstance()中用,文字颜色对按钮无效(对静态文本有效);


42 CWnd的SetFocus()将一个窗口设置为焦点窗口;调用他的窗口;主对话框调用缺省第一个控件;列表控件调用时就焦点在选择的项上;


43 atof()将字符串转化为float,atoi()将字符串转化为int型。;


44 用户点击按钮ID为IDOK和IDCANCEL时就调用OnOK()和OnCancel(),调用的是EndDialog(),用系统菜单是关闭,也调用OnCancel,Domodal的返回值就是IDCANCEL,OnOK也是一样(因为函数里面
   默认是这个ID);


45 CCombBox类的SetCurSel(),默认值,返回值是默认值的位置,从0开始,其中AddString()为加进选项,哪个先进,就那个先排在前面,也可在控件中加,但优先级低一些;
   CCombBox类的GetCurSel()获取所选的字符串的位置,类中GetLBText()来获取选中位置的字符串(LB是ListBox的意思,列表控件复杂些)。FinStringExact()能根据字符串找索引位置;
   


46 CFile的Open函数(与close成对使用,防止保存失败,中途的数据不能保存,会导致文件找不到)的第二个参数,第一个参数是./是写在本工程目录下,这个是文件名,包括文件路径,
   文件名主干,文件后缀;CFile::modeCreate是文件不存在就创建,文件存在则清空。CFile类中有GetFilePath()能得到完整的文件名;
   CFile::modeWrite:打开为只写入。错误与文件,盘,目录是否只读有关; write()将文件写入;CDialog::truncate类似C语言的"a"(add)功能;
   CFile类的read()的返回值是实际读取的字节,Read是从当前游标开始读取,默认是文件起始,当多于第二个参数时,第二次接着上次的读取,并且第一个参数指向的内存清空,因为游标变了,
   可以使用 Seek/ SeekToBegin / SeekToEnd 来定位,读取(CString)时不知道字节数(??),所以用char数组;第一参数为读取到哪个变量,第二个参数为读取的个数;
   与CFileDialog用比较方便(可能要用到GetPathName();CFile类中GetStatus()能够得到文件信息(得到CFileStatus结构体),得到有一个CFileStatus结构体(文件大小,时间等);
   CFile的GetLength()获取文件大小(字节),这个也可以;CFile写入字符串时,一定要写入结束符;CFile的Write()如果存在文件,先删在写入;文件不存在时,不能写入(目录要存在);
   CFile的GetRoot()能够获取该文件的根目录;有获得焦点的位置函数GetPosition();保存时为何不能用CString,其实是封装了一个指针,指向一个堆区域,程序结束后堆会被释放;


   以下为建立路径所使用的几个特殊符号,及其所代表的意义。
   "./"--代表目前所在的目录。
   "../"--代表上一层目录。
   "/"--代表根目录  。根目录是相对的,双击c盘后的文件的根目录是c盘,;每个目录下都有缺省的两个目录,名称分别为 '. '和 '.. ',分别代表本层目录和上一层目录;


47 要用其他类的控件,就将那个类的对象指针定义为成员;全局变量写在应用程序类(也可写在需要这个变量的类中,在自己的类中初始化)中(保存数据时);总是要使用某个控件,
   则可将一个CWnd类对象声明为成员,然后将它与某个控件关联;


48 资源名写不同的ID;


49 CFile类的核心句柄m_hFile值为(-1或4G-1(32位))就表示文件打开失败,其他一般表示打开状态;


50 按回车键默认按了IDOK按钮;


51 系统对话框:
 1>CFileDialog用于打开保存文件;第一个参数为true时(打开模式),为false时(另存模式);第二个参数为缺省后缀名(只需输入文件名),第三个为缺省文件名(只需输入后缀),
   第四个参数可以由GetPathName()获取文件路径获得;当另存为时,第四个参数使用默认参数HIDEONLYREAD|OVERWRITEPROMPT,前面一个用于打开(隐藏以只读方式打开按钮),
   后面这个用于另存(覆盖文件);第五个参数为文件筛选器,由显示文字和筛选类型两部分组成,中间用|隔开,结尾用|结束;所有文件类型为*.*;第六个参数设置父窗口,
   缺省为当前窗口(NULL);
   CFile::SeekToEnd()定位到文件尾部;
 2>有选择颜色的CColorDialog用于选颜色;通过类中GetColor()获取颜色,然后通过CWinApp的SetDialogBKColor()放进去(但是需要刷新)(因为是应用程序类,所以所有对话框都变了);


 3>选择字体CFontDialog;类中有GetCurrentFont()获取你选择的字体结构体;字体结构体类型LOGFONT,有各种字体信息;CFont类中有creatFontIndirect(),DeleteObject()用于删除
   已有的字体(当字体为成员变量时),用字体结构体初始化字体对象,CWnd::SetFont()用字体对象设置字体(字体不能是局部变量);CFont类中有GetLogFont(),通过对象初始化结构体;
   构造函数第一个参数用于确定字体位置,颜色对话框一样有,文件对话框初始化为对文件路径;CFontDialog::GetColor()获取颜色;
 4>打印方式设置;
 5>打印页面设置;
 6>在文本中查找或者替换的;


52  在自己基类中为保护类型,在其他类中调用它,要将它重写,改成公有类型;


53 当要保存某个变量时,将其声明为成员变量;


54 凡是在一个函数中,对同一个类对象进行重复调用,就将函数转移进该对象所属类中;


55 按钮消息与菜单消息的映射方法不一样;任何一个菜单ID都可以添加COMMAND消息,通过这个进行消息映射;工具栏按钮也有(用于截获点击事件),并且有update UI的消息映射函数,
   用于定时更新按钮的显示状态(内部可能有定时器);


56 GetModuleHandle(LPCTSTR lpModuleName)函数的作用是返回指定模块名的句柄,如果为NULL,则返回本模块的句柄,lpModuleName参数是一个指向含有模块名称字符串的指针;
   获取一个特定的应用程序或动态链接库的模块句柄,且这个模块必须已经被加载到调用者的进程空间中。


57 API函数SetCurrentDirectory()设置当前文件目录(如c:\形状);CFileFind类(先要确定是哪个目录)的FindFile()表示打开对某个类型的文件的搜索,FinfNextFile()表示从第一个
  那个类型的文件开始(最后一个文件时返回0,用这个变化遍历此目录下的文件(不管是否是文件夹),而且这个类有得到所处文件的文件信息的函数。(这些可用于得到目录下的任何类型的文件,
   FindFile()用于确定文件类型,FindNextFile()用于寻找从1开始遍历被确定类型的文件。)(目录默认为工程目录);CreateDirectory()创建目录;也可用FindFile()直接确定是哪个目录下的。 


58 没有编辑能力的控件的ID缺省-1,有需要时,就不是了;


59 一个分组框要有一个组长,只要对组长建立数值型关联变量,一般是第一个拖进的,组长后面连续加入的就是他的组员。


60 按钮,单选按钮,多选按钮,分组框都是用的CButton类;


61 控件名的多行显示一定要有multiply属性。


62 BitMap比Icon自由,能够控制大小。


63 组合控件要去掉sort属性,不方便,帮你排了序.


64 控件型关联变量,用UpdateData()没用:要对单个控件的数据输入输出,则可使用控件型关联变量或GetDlgItem();


 1> GetDlgItem()可以通过ID获得类指针和句柄(不是返回值);
 2>通过函数获得控件型关联变量;Attach()/Detach(),SubClassWindow()/UnSubClassWindow(),SubClassDlgItem();
 3>通过类向导获得控件型关联变量,所以可以通过类向导找到相关联的控件类;
 
65 CListCtrl类中有SetExtendedStyle(),设置通用窗口分格以外的分格,如网格(GRIDLINES),整行选取(FULLROWSELECT)等(这个是这个控件类的专用风格)


66 CEdit控件的关联消息EN_SETFOCUS每当焦点到了这个编辑框,就发出这个消息;控件也有消息映射函数;


67 消息与消息映射函数的桥梁是一个结构体对象,控件与变量的关联是一个函数(类向导能够自动为类内控件类成员变量建立与控件窗口的关联,这个函数在DoDataExchange()中(这个函数用于
   关联变量管理),将变量赋值),建错了,就delete;


68 BM_CLICK是其他窗口发送给按钮控件的消息,让按钮执行点击操作,可以模拟按钮点击;
   BN_CLICK是当按钮被点击时,按钮控件发送给按钮控件的父窗口的,告诉父窗口我被点击了。


69 任何控件都有相对应的控件类,有一些控件类是多个控件共用的,一少部分可以建立控件型关联变量或数值型关联变量,大多数只支持控件型关联变量;


70 数值型关联变量有缺省值,在构造函数中,可读的控件会显示出来,因为在OnInitialDialog()调用了UpdataExchange(FALSE),UpdateData(TRUE)将数据更新到相关联的控件变量里;
   所以在它显示之前可操作数据UpdateData(FALSE)将关联变量更新到控件,updatedata函数对全部数值型变量有效,不能单独对一个变量有用,因为它调用了DoDataExchange();
   如果要单独对一个变量操作,就不要用UpdateData函数,就建立控件型变量或者GetDlgItem();
   对话框以确定方式CDialog::OnOK()关闭,内部调用了UpdateExchange(TRUE);组合框的数值型变量的值是选择了第几个;
   关联变量比较方便,就不用GetDlgItem(),还可以随时存取变量;


71 有些按钮如单选(多选通过指针数组(LPCTSTR),因为字符串常量为首地址)多选(通过字符串,因为关联变量为bool类型)按钮一般只能使用数值型变量,很难使用控件型。


77 COleDateTime比CTime功能强大,它的核心数据成员为(DATE m_dt)为八个字节的,CTime的(time_t m_time)是四个字节的,CTime的有效时间少了;其中类中ParseDateTime()能将字符串解析
   成时间给调用它的对象(不支持中文);也有类中Format(可以控制什么样的时间格式)将COleDateTime转化为字符串,它返回cstring类型,有VAR_DATEVALUEONLY参数忽略时间部分;
   其中有一个设置当前时间的函数COleDateTiem::SetDateTime()设置时间;


78 组合框的drop的类型不同,就关联变量的限制不同。所以建立好后,在改风格,会使先前建立的关联变量类型存在(对于不同风格有不同关联变量类型的控件);


79 控件型关联变量在对话框启动前和关闭后,统统不能使用而数值型关联变量能使用,说明数值型关联变量比控件型关联变量生命期长。


80 CString类中有自动将对象转化为指向字符串的指针(LPCTSTR)的操作符函数;


81  一定义一个对象会使窗口的句柄hWnd为0;CWnd类中有使对象转为句柄的操作符函数;主窗口一creat,控件句柄变0;


82 CWnd类中有OnSize()用于调整窗口大小,前提要为可调整大小,有大小变化时调用,Create()创建窗口后调用它;


83 WM_SETCURSOR 当鼠标导致光标在窗口移动,就被发出这消息;


84 WM_MOUSEMOVE和WM_NCMOUSEMOVE的基于的坐标不同,分别是客户区和非客户区,是相对于鼠标所在的坐标;WM_LBUTTONDOWN(能够判断怎么点击的)是基于客户区坐标系(有点击的状态);
   WM_CONTEXTMENU基于屏幕坐标系;




二 绘图技术  (用的是GDI函数)


1: 窗口的非客户区为包括标题栏和外边框的整个窗口区域;窗口的客户区就是遮盖在非客户区的中央位置;
COLORREF 为颜色类型变量 DWORD类型十六进制格式为0x00bbggrr;RGB宏函数返回COLORREF变量;凡RGB三个分值相等都属于不同深浅的灰色,由深到浅;分别代表红绿蓝;反色就是就是拿255减;
GetRValue(rgb)能够得到红的分量,其他两个相应的;     


2: CDC类SetTextColor()设置文字颜色,返回上一个颜色,默认黑色;SetBKMode()设置背景模式(透不透明),可以使背景(默认白色)透明(这个针对有文字时)(文字背景),返回上一个字体模式,默认不透明;
   SetBKColor()设置文字背景颜色,返回上个字体后面背景的颜色,默认白色;


3: 几乎所有的GDI函数封装在CDC类中;


4: CPaintDc标准客户区绘图,窗口刷新不消失,在WM_PAINT(窗口一刷新,就发出这消息)中使用,封装了BeginPaint()和EndPaint()在构造函数中,继承了CDC类,成员有m_ps和m_hWnd,CDC类中m_hDc;
    
    CClientDC临时客户区绘图,窗口刷新消失,在任何情况下可以使用,封装了GetDC()和ReleaseDC()在构造函数中,继承了CDC类;
 
    CWindowDC也类似;只有在WM_NCPAINT中长期有效;


5: CRect的OffsetRect()能使屏幕坐标系转换为非客户区坐标系;


6:CDC类中有FillSolidRect()可以给某个矩形填充颜色,这个无边框;RoundRect()用于画圆角矩形,最后一个点用于画角;


7:CWND类中有OnNcHitTest()用于拖动客户区使用,返回值为MOUSE列举值,就是你点击了哪个地方,参数这点坐标基于屏幕坐标系;一般是拖动系统菜单时,可以移动窗口;
   当鼠标移动时发出该消息,并且窗口包含该光标;




8:CRECT类中有将对象自动转换为地址的操作符函数;还有PtInRect()判断坐标点是否在rect中;


9:CDC类DrawText()在一个矩形内写一行汉字,有居中(要三个风格连用,效果好)等功能;也有获取hDc的函数GetSafeHdc()
 
   GDI对象:它的句柄和m_hObject一样
10: CPen类能够修饰线段和边框的粗度,颜色,形状;要使用该画笔,就要使用CDC类中的SelectObject()(因为继承了CObject类),返回旧的东西(笔或其他);一般使用新画笔结束,
    就要恢复旧画笔,能选取所有GDI对象;缺省粗度为1和黑色;空画笔时,用CreatePen();用CreatePenIndirect()时LOGPEN的宽度为POINT,所以颜色要单独赋值;所以有三种方法
   创建画笔;还有获得画笔信息的函数GetLogPen();SelectObject()可通过GDI对象指针和句柄;


11:Polygon()的第一个参数是指向点的数组(该数组的店要按顺序); Arc()是一个椭圆被线切割的反时针方向(从开始点这边到结束点这边),截断实现到椭圆中心点再到结束点,
    这个是开放图形,chord()是闭合图形,这两个圆弧一样;它是按点的顺序画的;


12: CBrush类修饰一个闭合区域内部的填充内容(颜色,填充线条(交叉线等)和平铺位图);默认填充白色;第一个构造函数用于填充颜色,第二个用于填充线条(其中的参数包括线条颜色),
    第三个是用位图填充,从左上角(0,0)开始涂;画图形,可以先将它画出来,找出点来;空填充色是用CreateBrushIdirect(),LogBrush用BS_NULL,颜色就和原来对话框颜色一样;
    CBrush的CreateSystemColorBrush()能够代替第一个构造函数的功能,选取系统中的颜色,CORLOR_BTNFACE就是对话框的背景默认颜色(在API的GetSysColor函数(返回颜色)中找参数);


13:CBitMap类用于显示和处理点阵图像,加载位图资源或者创建空白位图用于存储画面;类中GetBitmap()通过对象得到结构体;
    位图的装载和显示过程:
    1》 位图的装载;CBitMap::LoadBitMap();一般在对话框的初始化的时候加载图片,这样防止总加载;位图插入时连续好使用,能够连续转载;位图不存在,返回FALSE;
    2》 创建兼容的内存DC;CDC::CreateCompatibleDC(),如果参数为NULL,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境;
    3》 使用内存DC选择装载了位图资源的对象;CDC::SelectObject();位图具体部分的输出是以位图左上角为原点,所以可以输出对称图形,从反方向输出到区域(输出的方式没变,从区域的开头第一行开始输出);
    4》 使用贴图函数显示内存DC中的位图内容;CDC::BitBlt();将指定部分区域位图输出函数,就是从来源dc上输出到目标dc;位图是由一行行点组成;比拉伸函数快10-100倍,所以要减少它的次数;那个区域,就以它为坐标;而且不覆盖控件;
    5》 如果要压缩或者拉伸原始图片则使用CDC::StretchBlt();将指定区域指定方向输出填满,最后一个参数是SRCCOPY;这个也是输出位图函数;增强效果就用SetStretchBltMode()(参数为HALFTONE是中间色),缺省最省计算,但效果最差;但空间的位置是不变的;
   eg:: 如果是要把窗口变全屏,就先把窗口做好全屏,再把图片拉伸为全图;    
   这样做能够防止屏幕闪烁;屏幕刷新的过程,在这个过程中首先是OnPaint()隐含调用了OnEraseBkGnd()用默认色填充背景,这是屏幕完全是白色,然后才是绘制对象,
   也就是说对于任何对象的显示都要进过这2个步骤。位图是点阵图像,所以对位图的显示都是一个点一个点依次绘制出来的,直接显示会闪烁,因为刷新很多次(图像空白图像空白);
   兼容DC里的位图(当然可以有其它对象)当做一个整体直接Copy到目的DC,这样就只刷新一次;


14 CDC类的SelectStockObject(),选用系统中的GDI对象;返回值是旧的东西;GetStockObject()获取系统中的GDI对象;GetSysColor()获取系统标准颜色;


15:CFont类用于修饰文字输出的形状,高度,粗度,倾斜度,字间距;跟其他的一样,用构造函数构造就是将LogFont结构体内容全部初始化,麻烦;或者用LogFont结构体
    初始化CreateFontIndirect();没有选择字体时,用缺省字体;字体结构体内容包括Height,width,escapement(以0.1为单位),orientation,weight(粗细),itatic,strikeout,
    charset(如果是中文简体,字符集(字符编码和字体形状的集合)就要是134(GB2132)),underline;自创字体时,用CreatePointFont()简单创建字体,CreateFontIndirect()复杂创建字体;


16:只要获得dc,就能对指定位置进行绘图,因为它是公用的虚拟设备;dc是画布,我们还需要画具;这些画具初始化好后,不能再利用函数初始化;


17 CWND类下的GetFont()能够得到对话框字体;用于和SetObject()连用设置文字字体;e


18 CRgn类用于修饰输出图像的不规则边界;一般要与这个BitBlt()的矩形大小一致,要不然是相交部分;
   类中CreatePolygonRgn()创建一个多边形区域;CreateRoundRectRgn()创建圆角矩形;CopyRgn()从已有的CRGN对象复制给自己(必须已有句柄,也就是创建空的(CreateRectRgn(0,0,0,0))),
  这个可以改变自己原有的;CombineRgn()将两个区域合并到一个对象中,有取交集,并集,对称差集(XOR),1不同2区域的功能;


19 CWnd类中有获取和设置窗口形状的函数GetWindowRgn和SetWindowRgn(),将窗口设置为你代入的区域;


20 CGdiObject类中DeleteObject()为GDI对象删除句柄,使它为0,这样可以重新创建GDI对象,GDI对象未初始化时,也可删除,就是句柄依然为0;


21 直接CRect对象基于屏幕坐标系;


22 CMemDC类用于加载位图资源,加载位图文件和创建空白位图内存画布;专门用于CBitmap的;


23: 执行文件外部加载Bitmap文件:API的LoadImage()(在执行文件外载入,第一个参数可以代入NULL),既可在进程内加载位图资源(图标,光标)(第一个参数不能为空,通过ID找到资源,但是最后一个参数不能指定在哪得到)(工程视图有该资源),
  可以代替CBitmap::LoadBitmap();也可在进程外加载位图文件(图标,光标)(因为它是通过文件路径)(工程视图没有该资源),可代替CWinApp类的LoadIcon()和LoadCursor()这样的要把GDI对象删除,
  利用DeleteObject(),防止占用资源; 图片的尺寸代入0,就按原尺寸;


24 GDI函数GetObject()能够得到GDI对象的详细信息;能代替::GetLogPen(),GetLogBrush(),GetLogFront()等,因为他们是封装了它;


25 CDC::GetCurrentBitmap()获取bitmap的指针;CDC::DeleteDC()删除当前dc,将m_hDC=0;当重复刷新时调用了OnPaint(),会有泄露问题,所以要删除dc和GDI对象;  ..


26 void*就是HANDLE


28 专用图像资源API函数:
   LoadBitmap();
   LoadIcon();没有SetIcon的API函数,只有通过发送WM_SETICON消息;,对系统内的图标,光标的加载无效还是使用专用函数;专用函数无法对进程外的进行加载(不知ID)
   LoadCursor();NULL,可用系统光标;SetCursor();
   loadImage()可以代替它们三个;


29 CBitmap::CreateCompatibleBitmap() 创建空白位图,缺省纯黑色,第一个参数不能为空;窗口位图的拉伸就要先在内存dc上拉伸好,再贴到要显示的dc上(一个加载来源dc的图,一个用于
   内存上的拉伸或压缩的和贴图);这是位图随窗口变化技术;


30 动画技术::
   
   帧——就是影像动画中最小单位的单幅影像画面;影片是由一张张连续的图片组成的;
   用个SetTimer()定时器来进行每个图片在客户区(临时和标准(用Ivalidate())都可以)的输出;


31 图像透明技术:用于透明动画:在Ontimer()中要用临时客户区,图片的移动要在背景图上(背景会把图片贴掉),要不然留下的痕迹,因为是临时客户区,要刷新才消失,先放背景,再放图片;
   透明图片为背景为固定颜色的位图;
   自定义CMemDC类中BitTrans()将图像透明,没有后面固定颜色,变成与对话框一样的颜色,具有输出功能;StretchTrans()拉伸图片,并将它透明化,显示出来;也可通过BitRgn()透明给CRgn;


32 CPoint类的Offset()能使点进行偏移;




33   解决闪烁问题(要有顺序输出)(位图输出)
   1》双缓冲防闪烁技术:
     闪烁问题:界面更新输出有超过一次,或者多次输出的区域有重叠;重叠面积越大或者输出次数越多就闪烁越严重;
     双缓冲技术:创建一个和窗口一样大的空白内存dc,再将所有的前景和背景都粘贴好在上面后再一次性输出到屏幕上;


   2》有Invalidate()时尽量使用FALSE,减少闪烁问题,只更新前景,不更新背景,只调用OnPaint(),用于前景更新;TRUE的话,先调用WM_ERASEBKGND(缺省灰色)用于背景更新,再调用WM_PAINT;
      所以尽量在在WM_PAINT中,或者让WM_ERASEBKGND不干缺省事;


   3>> 客户区的背景和前景不能同时更新所以造成闪烁,在WM_ERASEBKGND背景更新和WM_PAINT前景更新时,只选择一种消息绘画,另一个不绘画;或者打开另一个,清空,即使有标题栏也可以;
   4》 非客户区和客户区不能同时更新画面所以造成闪烁;可以去掉标题栏和边框,只在WM_PAINT中绘图,在WM_NCPAINT()中不绘图;
   
34 MFC数据集合类:
   CList 双向链表;插入数据比较快,是个mfc模板类
   CArray 动态数组;按索引访问比较快,为代入类型的该类型数组,是个mfc模板类,有add()添加进按顺序进arr(要添加堆对象才有用);GetSize()获取数组长度;GetData()返回动态数组的地址;RemoveAll()清除所有元素;
                    这该类中有个指针,指向一个数组(RemoveAll()用于这儿清除元素将它的长度归0),数组中的元素再指向一个数组(delete用于这儿)(这些数组都是堆);
                    RemoveAt()移除第几个元素,删除后顺序帮你改正过来了;动态数组的删除要删两个地方;
   CMap  映射类
   CString 串


   STL标准数据集合类(标准模板库)
   std::list 双向(环形链表)
   std::vect 动态数组
   std::map 映射类(二叉树)
   std::string  串 


35 <>头文件都放在一起,在stdfx中


36 画图工具能截图;
   UI: 用户界面;


37 工具栏按钮的OnUpdate什么函数用于更新按钮的显示状态(可能内部有个定时器);ON_COMMAND_UPDATE_UI_RANGE映射函数可以使多个菜单ID映射到一个函数(该函数要用CCmdUI*)


38 CCmdUI类仅用于ON_UPDATE_UI(在工具栏是用)这个,而且该类是CCmdTarget类的派生类;类中:(按钮为工具栏的按钮) Enable()使按钮禁用;SetRadio(TRUE)使按钮下陷,FALSE使按钮弹起。
   SetCheck()跟SetRadio()一样,但是在菜单上有区别,SetRadio()为单选(圆形的选择),SetCheck()为多选(勾形的选择);
   应用:总选择一个,就是添加一个成员判断ID是否相等;只有两个数判断时可用==返回真假;


39 图形软件架构:
   有一个纯虚函数,共同的功能,派生出几个所需的类;管理轻松;
   通过对鼠标的按和会弹记录点,在OnDraw()中画;虚函数的调用方法: 基类指针= new 派生类;然后通过该指针调用派生类;
   用一个抽象类CLayer多态派生出不同图形;


40 单文档中的OnDraw是在OnPaint()的函数,所以是在客户区的绘图,两个都是这样的;


41 Crect类中有TopLeft()得到左上角的点,并且可以通过它设置左上角,返回值是引用;BottomRight()类似;因为引用型的返回值,所以函数可以作为左值;
   类中还有Normalize()Rect()纠正矩形区域,当左大于右,上大于下时,就是点颠倒一下;


42 CDC类的SetROP2(),参数为R2_NOT用于绘制新线段的反色技术,通过将上个条线段重新画一遍(第一次不处理),去掉,因为R2_NOT使线段图由白变黑,黑变白;


43 CWnd::SetWindowRgn()将窗口不规则化,其中的区域参数只能使用一次,要再次使用时,要重新创一个,所以要使用临时变量好(当反复调用时),也就是要用一个临时变量;


44 CSpinButtonCtrl旋转按钮要有一个伙伴控件,可以在里面,也可在旁边,看起来想一个控件,单独使用无意义;属性要设置伙伴属性,整数数值(一般都是这个);它的伙伴是它前一个控件(在顺序上,对于自动结伴,这个是按下面加);
   设置对齐能使它嵌入里面;缺省0-100;设置Wrap能使循环加(0-100,100-0);NoThousand表示3位后无逗号;CSpinButtonCtrl::SetBuddy()设置伙伴窗口,SetRange32()设置整数范围(这个后,按上面加);


45 CRichEditCtrl高级编辑控件,加入了RichEdit,都需要在InitInstance()中加入AfxInitRichEdit()对RichEdit进行初始化,要不然窗口显示不出来;普通的有右键菜单,只能设置所有文字
   的颜色和字体,高级的无右键菜单,能设置不同段落和文字的字体和颜色;RichEdit多行是不到最大滚动栏不出来,普通的不行;CRichEditCtrl::SetDefaultCharFormat()设置所有文字的
   字体和颜色设置(包括已经输入的和将要输入的,要用个CHARFORMAT,第一个参数为结构体大小,第二个参数是打开开关,每次改风格,要重写打开),SetSelectionCharFormat()为选中的文字设置格式,
   SetWordCharFormat()为将要输入的设置文字格式,SetParaFormat()为当前选择的段落设置格式,ReplaceSel()用于追加文字(从焦点开始,焦点要到末尾);


46 CWnd::GetWindowTextLength()获取字符串长度;


47 CEdit和CRichEditCtrl都有设置选择的的字符串SetSel(),可以控制焦点的位置,-1能使从所设的开始全部选上;


48 分页技术:
   1> 向导窗口
   2> 设置为子非模式窗口,就像是控件一样,MoveWindow也是基于客户区,在InitDialog()对它操作;就是几个子对话框,然后通过数组循环显示输出,按钮控制上下翻转;
      当非模式对话框设置了child属性时,并且设置了父窗口,就是该父窗口的子窗口,相当于是它的控件;关闭父窗口,子窗口也关闭;child类型非模式子窗口在OnPaint()时已经显示出来了,运行时默认在主对话框左上角;
      用户资料注册用向导模式,用户资料修改和系统设置用标签控件管理模式(插入对话框时,缩小放入);
      


49 WM_PAINT消息仅用于以下两种情况:
   1. 当用户移动窗口或显示窗口,或用户改变窗口的大小,或滚动窗口用户区时,Windows会向窗口函数发送WM_PAINT消息当第一次显示窗口,当最大化和最小化时。
   2. 当Windows关闭覆盖窗口部分区域的对话框时,以及菜单下拉出来又被释放时,窗口用户区被临时覆盖,系统会试图恢复显示区域,可能向窗口函数发送一条WM_PAINT消息,
      要求应用程序刷新其用户区。


50 CTabCtrl::InsertItem()插入标签;GetItemRect()获取上面标签矩形,可以通过合适插入对话框;
   CTabCtrl的反射消息TCN_SELCHANGE切换标签时发出;


51 反射消息,都带一个N字,凡是子窗口往父窗口通知的这类消息都是反射消息(子窗口的),将子窗口消息与父窗口类成员函数关联;普通的消息映射是父窗口消息与类成员函数关联(这是父窗口的);
   反射性消息注意使用第一个参数NMHDR*通用指针,根据不同的控件可以传递当前节点的句柄或ID等有用的信息;


52 属性表和属性页,属性表将标签封装;属性页也是一个对话框只不过要继承了CPropertyPage类(这个类也继承了CDialog类),用于与子页面窗口关联;
   属性表用于关联管理子页的父窗口(就是是一个封装好的分页管理窗口,属性页的父窗口是属性表),默认使用标签模式管理多个页面,可以CPropertySheet::SetWizardMode()将属性表设置
   为向导模式;虚函数回调函数OnSetActive(),当属性页变为活动窗口调用;CPropertySheet::SetWizardButtons()设置向导模式的按钮的的组合,其他的为灰的(常在OnSetActive()用
   ,通过获取父窗口的到属性表);属性表的完成按钮帮我们封装了UpdateData(TRUE),但完成键这页的属性页没更新;虚函数回调函数OnWizardFinish()当在属性表中点击了完成键被调用,
    还用OnWizardBack(),OnWizardNext()类似;属性表当打开时封装了UpdateData(FALSE);编辑各个分页时选用系统默认字体(宋体,9);


53 回调函数分为虚函数回调函数和消息回调函数;


54 WM_SETFOCUS当窗口获得输入焦点时发出;WM_KILLFOCUS窗口失去焦点时发出;


55 列表控件的反射性消息NB_DBCLICK,双击列表项时响应;LVN_ITEMCHANGEED更改列表控件选项时响应;按钮的反射消息BN_CLICKED单击按钮响应;组合框CBN_SELCHANGE更改下拉列表选择项时响应;
   b编辑控件EN_CHANGE编辑文字响应;树形控件TVN_SELCHANGED更改树形控件选择项时响应,TVN_ITEMXPANDED展开树形控件节点时响应;


56 CTreeCtrl树形控件用于存储具有多层分类关系的数据;CTreeCtrl::InsertItem()插入节点(其中有父节点和子节点之分,可插入图像,并且可以设置两种状态(是否被选)),
   返回值是节点的句柄HTREEITEM;Expand()展开某个节点;GetParentIten()获取当前节点的父节点,当为根节点时返回句柄为0;GetItemText()获取节点的text;


57 SetImageList()用于控件项和列表标头的图标设置,对应的控件有列表控件,树形控件,标签控件等控件(都包含多个控件项),使控件与图标列表关联;有大小图标,选中状态图标功能;
   CImageList类用于图像列表的;CImageList::Create()建立图像列表,有参数能去透明色,所以要这个要注意;CImageList::Add()向图象列表添加位图,图标等;在列表控件中,
   缺省图像显示在第一列,所以修改时要第一列;ExtractIcon()获取图标列表的图标句柄;这个类可以当做装图标,可以随时取,再DrawIcon();
   
58 CListCtrl::InsertItem()在列表控件中新插入列表项,第三个参数指定图标索引,所以图标要按顺序,这个有两个同名函数;CListCtrl::SetItem()设置列表项信息,
   包含SetItemText()函数功能,能够修改text和图像,通过一个结构体,修改要打开开关,同时设置行列;CListCtrl::GetItem()(获取有哪些开关状态)能代替GetItemText()和GetItemData(),
   SetItemStaste()等;修改时为不把以前的去掉就用|=;


59 CString转c格式字符串要经过(LPSTR)(LPCSTR)这两次强制转换;


60 列表控件包含一个子控件标头控件CHeaderCtrl类(CListCtrl::GetHeaderCtrl()获得该控件对象指针);列表控件有反射消息LVN_COLUMMUCLICK当点击列标头时发出;标头和项的图标设置
   要分开写;这个先获得标头CHeaderCtrl::GetItem()获得标头信息进结构体,要打开主开关和子开关,再进行要显示的内容;CHeaderCtrl::GetItemCount()获取列数;去除图标就重新设置
   一下开关;CHeaderCtrl::GetItemRect()获取某列的矩形;


61 CListCtrl::SetItemData()在一个项里面寄存一个数据;CListCtrl::SetItemState()设置选中状态;


62 CListCtrl::SortItems()排序,一个参数是按哪种方式排序(ASC码或数字大小等)(为函数名,该函数有固定格式),第二个参数;传参(一般对话框对象),传给回调函数第三个参数,
   回调函数的前两个参数是ItemData,所以要为每行设定itemdata,并且和索引相同,SortItems函数帮你做好了排序(内部可能是二分法),你只需要设定排序方式(return 后二项>前一项,
   表示后一行大于前一行交换,返回0表示不交换,1表示交换(但不是真正排序,而是反序,所以要以某种方式));字符串就以asc码(汉字用汉语拼音,汉字比任何字母大,因为汉字的ASC码超过
   128以上,数字比任何字母小),int以大小比较;所以该函数是利用这个回调函数进行排序;回调函数一般要求全局函数的性质;


63 窗口颜色控制:
    父窗口和控件子窗口的颜色控制有三种方法;
    1》调用CWinApp::SetDialogBKColor()设置对话框背景颜色(包含了静态文本背景颜色)和静态文字颜色,一般用于InitInstance()中;这个对于父窗口和子窗口;可以改变颜色默认值,将灰色变成其他默认值;
    2> WM_ERASEBKGND 这个不进行任何操作,就是窗口默认颜色(系统灰色);只包括父窗口自身的背景和文字颜色;
    3》 WM_CTRLCLOLR包括父窗口自身的背景和文字颜色,而且包括静态文本控件,编辑控件和组合控件等;第一个参数cdc指针可以用于控件文字的颜色和背景管理(CDC类);函数返回值HBRUSH是
    用于设置控件背景填充颜色;要使静态文本控件透明;,要使用SetBKMode(),而且返回值改为NULL_BRUSH的系统画刷句柄(要在这个专业改控件颜色函数中);使编辑控件和组合控件透明,
    输入文字不方便,但是可以改变文字颜色;通过GetDlgCtrlID()区分;返回值也可是自己创建的CBrush的句柄,但是需要时背景透明下,防止被覆盖;
  在第二参数pWnd,代表控件指针,用于区分各种控件(pWnd->GetDlgCtrlID() == 什么控件ID,用switch也可以,因为每个控件都继承了CWnd类,都调用了OnCtrlColor()),可以获取ID或获取窗口
  类型名;(或许是控件调用该函数);该函数只能控制一些基础的控件;


64 自绘控件:大多数高级控件不能喝更改颜色;(窗口隐藏了,但没显示出来,显示内容有开发人员管理,键盘和鼠标操作仍由系统管理);
   1>建立控件类的派生类.
   2>重写DrawItem()自绘虚函数回调函数;参数是一个结构体,利用这个结构体自绘,该结构体有控件的类型,hdc(通过CDC::Attach),Crect(这些坐标基于控件),状态管理,nID等,处理比较方便;
     结构体:组合控件中有它的成员的索引和rect,组合框的自绘时,文字(CComboBox::addstring()的文字,GetWindowText())不可用,就是每个成员都会调用该函数,hdc坐标是以控件左上角;Fixed属性,系统
     自动设置每项高宽,MeasureItem()不会调用;Variable属性则每项用户自己设置,在MeasureItem()虚函数回调函数设置不同高宽列表项(列表类添加列表项时调用);
     该函数是由控件类的派生类调用(注意);按钮需画边缘,焦点(虚线);
            列表控件类似,但要得到列矩形做(用CHeaderCtrl类);插入列表项时才自绘;
   3>将对应类型控件,风格加入ownerDraw属性,通过关联派生类对象进行调用派生类的DrawItem();
   


65 CDC::DrawEdge()绘制矩形边缘(凸起或下陷),第一个参数是哪个矩形,第二个参数表示下陷还是凸起,第三个参数是矩形哪里下陷还是凸起;


66 CStdioFile类是CFile的派生类,有可以读取文件中焦点所在的一行文字的函数ReadString();读完没有文字的返回0;对于一般文件的读取,建议还是用CStdioFile来进行行的读与写操作,这样非常方便的;
   打开的模式带有CFile::modeNoTruncate,就打开存在的文件不删除;
   CStdioFile乱码的解决方法:
   若使得读取文件时按照 Unicode 方式读取,则需要添加:
   setlocale( LC_CTYPE, "chs" ); 其对应的头文件为 <locale.h>
   PS:该方法只能读ASCII文件,待研究!


67 窗口透明化处理:
  SetWindowLong(),用于设置窗口风格,第一个参数是窗口句柄,第二个参数是你要干什么,第三个参数是你要添加的风格;
  
  代码实现:
  SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
  GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
  HINSTANCE hInst = LoadLibrary("User32.DLL"); //要使用动态连接库(User32.dll,Kernel32.dll,GDI32.dll)里的函数,就需要使用LoadLibrary函数来加载动态连接库,使用函数GetProcAddress来获取动态链接库里的功能函数的地址;在MFC中是AfxLoadLibrary(),但需把库改成共享;
  if(hInst) 
  {            
  typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);   // #define WINAPI __stdcall  用于调用API函数; 这个是所需要调用的函数的指针,所以参数是这样;     
  MYFUNC fun = NULL;
 //取得SetLayeredWindowAttributes函数指针     
  fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");//这里是获得动态链接库的函数指针;在Windows 2000/XP中,User32.dll增加了一个新函数SetLayeredWindowAttributes。要使用该函数,我们必须在生成窗口或使用SetWindowLong函数中设置窗口风格WS_EX_LAYERED (0x00080000)。该风格一旦被设置,我们就可以调用该函数来透明化窗口。该函数所需参数如下:


                                                                HWND hWnd: 窗口句柄
COLORREF col: 透明化颜色
BYTE bAlpha: =0:整个窗口透明, =255 完全不透明
DWORD dwFlags: =1:仅颜色 col 透明, =2 :窗口按照bAlpha变量进行透明处理。
  if(fun)fun(this->GetSafeHwnd(),0,128,2);     
  FreeLibrary(hInst); //在MFC中是AfxFreeLibrary();当不再需要该 DLL 模块时,即调用此函数。此函数递减模块的引用数,如果引用数为零,此函数便从进程的地址空间中取消模块的映射。
  }


68 WM_DRAWITEM(当自绘子窗口刷新时响应)用于在父窗口建立映射函数;WM_PAINT执行后执行WM_DRAWITEM消息,执行完基类CWnd::OnDrawItem(),最后执行具有自绘属性的子窗口派生类的
   虚函数DrawItem()(这个过程要在有自绘属性的控件的前提下);WM_MEASUREITEM类似(要有具有自绘属性的列表控件添加列表项才发生);这两个消息可代替子窗口的派生类,就是不进入派生类中,直接在该消息中绘图;
    
69 CDC::DrawIcon()用于指定坐标点画一个图标;API函数DrawIconEx()可以将图标进行縮换,而前面那个不行;


70 控件的hdc就以控件的左上角为坐标系;


71 当无框架时,设置标题,SetWindowText()设置任务栏和系统菜单的标题,TextOut()/DrawText()设置对话框的标题;


72 CBitmapButton类可以实现四态按钮(未按,被按下,焦点状态,禁用状态),基于自绘的派生类,创建纯位图按钮;CComboBoxEx类,这个要用扩展风格的组合框;
   CButton::SetIcon()和SetBitmap()可以生成纯图片按钮;有文字和图片要通过自绘;


73 CListCtrl::GetImageList()获取与该列表控件关联的图标列表的指针;


74 按钮自绘函数通过控件刷新时调用,在OnPaint()后调用;自绘就是通过重写DrawItem,使用结构体的数据成员做;






   单文档和多文档


74 简单的框架程序由框架类和视图类组成,框架分为单文档框架(CFrameWnd类)和多文档框架(CMDIFrameWnd类).视图类是指CView类和它的派生类(都在afxcview头文件中);
   主框架和视图共用一个主菜单资源;


  SDI
  创建单文档的方式:
  方便的话:CFrameWnd::LoadFrame()加载窗口,资源和窗口句柄赋值;就是产生了窗口(但未显示)(有该过程CWnd::CreateEx(...hMenu));不用代入窗口类型,也就无需再注册窗口(在内部自动执行),
  第一个参数带入的是资源的ID,该ID代表的是菜单,框架图标和框架标题以及快捷键表等多个资源的ID;该函数封装了SendMessageToDescendants()其中有参数决定是否将消息传给每个子孙(子类,就是成员对象);


  灵活的话: 就用CFrameWnd::Create(),这个函数需要有注册的类名,要自行加菜单和SendMessageToDescendants()(初始化视图);其中一个参数WS_OVERLAPPEDWINDOW这个是很多
  通用属性的或运算;
   
  第三种是用文档模板间接创建,CDocTemplate()对象将框架,视图和文档绑定在一起,三个统一起来让系统内部创建,大部分内容自己开发好了;文档模板将类型信息在注册表中进行了注册,
  使得在双击文档类型的文件时,操作系统根据注册信息找到执行文件启动进程并加载该文档,这个可能发生InitialUpdate()调用太晚,信息就插进去了;内部做好了CDocumentAddView();
  而且基类中帮你做好了OnOpenDocument(),OnSaveDocument(),所以在重写时加要写的其他内容;
  


  在SDI的InitInstance()中的返回值要为TRUE;要为m_pMainWnd要赋值;


  CFrameWnd的特点:
  1》比较容易和view相结合使用;
  2》非常支持和控制栏(工具栏和状态栏)的联合使用;  可以框架和view区域共同扩大缩小; 


75 CFrameWnd::DockControlBar()将工具栏停靠在一个地方;
   CFrameWnd::FloatContrloBar()将工具栏漂浮起来;


76 OnCreate()用于框架类的界面初始化(创建工具栏,状态栏,视图等子窗口界面);视图是放在客户区上的;


77 


78 单文档没有对客户区的进行填充(就是背景颜色等,所以需要WM_ERASEBKGND);


79 在OnCreate()函数中创建视图的重要函数CFrameWnd::CreateView()(这个函数将Frame和view紧密关联在一起),其中有一个结构体CCreateComtext,用来使view和视图类关联(要用RUNTIME_CLASS())
   返回值是CWnd*,就是视图的指针;可以通过CWnd::Create(),只不过上面那个方便;


80 单文档的menu属于主框架,不算一个窗口;


90 OnInitialUpdate(),在窗口显示出来前初始化视图;


91 CListView::GetListCtrl(),获取该控件的引用(CListCtrl),其他控件类类似;


92 GetLogicalDriveStrings()获取逻辑盘的名字,字符串中盘符和盘符之间用NULL(\0)隔开,最后以两个NULL表示结尾。类似于:c:\<null>d:\<null><null>;


93 一个对话框多种不同的弹出用,可用bool或其他类型判断不同状态;


94 菜单中的快捷键+...的是弹出对话框;快捷键要放在快捷键表中才有用;


95 CFrameWnd::OnCraeteClient()虚函数,是在OnCreate()调用基类OnCreate()时调用,专门用于客户区窗口创建;该函数的基类同名函数也是CreateView();


96 CWnd::PreCreateWindow()用于在窗口创建之前设定新窗口的属性的预处理,结构体参数非常重要,可以设置窗口大小(为m_pMainWnd->ShowWindow(SW_SHOW)这个的时候才可改变大小)
   和位置,窗口分格;这个对话框程序没有该函数;
97 单文档的消息反射还能用,自绘的话该控件要添加自绘风格(LVS_OWERDRAWFIXED);


98 CSplitterWnd类: CSplitterWnd::CreateView创建视图,表示这个是在客户区下创建多个视图(视图是视图基类的派生类),其中窗口大小只需要指定宽度,高度自动分配(0);CreateView()只在两个类中有;
   CSplitterWnd::CreateStatic()创建某行某列的分隔静态窗口;用这个的话会调用两次OnInitialUpdate(),因为LoadFrame()中有SendMesageToDescendant()和CSplitterWnd中都调用了;
   每个分割器行列中一定要都有子窗口;分隔器占满了整个框架的客户区,这样可以将那些分隔器的线条绘图(颜色);CSplitterWnd::GetPane()获取某行某列的窗体Cwnd*;
   当要有多个框架,其中的子视图就使用子框架(CFrameWnd类,再在其中分割);用这个奖基类函数去掉;


99 CHtmlView::Navigate2()浏览某网页;




   MDI
  多文档由主框架和子框架两层框架构成,各自使用不同的菜单资源;单文档中主框架和视图共用一个主菜单资源;
  主框架内部有多个子框架,是一对多的关系,子框架与视图是一对一的关系;单文档是一对一的关系;一个CMDIFrameWnd类对多个CMDIChildWnd类;有两个菜单,当无子框架时是一个简单的菜单,
  另一个类似;
 
100 特定的View的菜单有自己做好的东西(比如CEditView的全选,查找,替换等);这个视图的显示出来是通过新建出来;菜单的消息反射函数可以给添加到任何类;


101 是哪个框架的视图,就在那个框架类中加视图类的对象指针;就是哪个是它的子物,就建在哪父物中;


102 CMDIFrameWnd::CreateNewChild()创建子框架,返回CMDIFrameWnd类指针;


103 CDialogBar类能创建对话框工具栏(可以添加控件),类中有Create()(只需创建对话框);凡是CDialogBar接到的消息会自动传给其父类;这个类创建的对话框的按钮要建立的消息反射才可按; 
    主框架和子框架共用一个快捷键表;


104  最近输入过的网页地址都保存在注册表中;
   
105 关于注册表的API函数:
    RegOpenKeyEx()用于得到具体某一键的句柄,第一个参数为五大键之一,第二个参数是其余的键;
    RegQueryValueEx()用于得到注册表中指定位置的内容;
    RegCloseKey()关闭该注册表的打开;    // 这三个连用能得到复杂的目录下的注册表的内容;例如使用这个得到最近浏览的网页地址;


106 CArchive类没有基类,封装了CFile类,重载了大量的<<(保存),>>(读取)函数;构造函数和CFile差不多;这个不用结构体的,方便,一个字段一个字段的保存进去,这个需要保存总数;
    这个比CFile节省空间,不需要固定空间,因为能保存CString(因为它是先存长度,再存字符串,长度是以一个字节记录,所以字符串长度不要超过255),但是还是需要通过CFile;
    可以存对象,就是存非静态数据成员;
    序列化或串行化存储:将各种类型的数据按固定顺序保存和提取的方式,并且无固定大小存储,所以存取顺序非常的严格,稍微有不对称性就加载失败(就是同数据类型);


107 COleDateTime对象的字节大小固定;


108 CDocument类是从CObject和CCmdTarget类派生下来的,封装了CArchive类;CObject类几乎是所有类的基类;CObject::Serialize()用于加载或保存对象内数据的函数;
    CDocument::OnOpenDocument()和CDocument::OnCloseDocument()(CObject::Serialize()这个被前面两个函数内部调用了(这个任何类都继承了)),所以只有两种状态,这两个函数内部有
    帮我们做SetModifiedFlag(FALSE);如果要方便的话,先自动调用CDocument::Serialize,然后人工调用对话框,在文档中,手动调用视图类的Serialize()或者使用CDocument::AddView()
    (在视图类中初始化使用)使文档与视图关联,说明一个文档可以与多个视图关联,数据有不同的显示方法,CDocument::GetFirstViewPosition和GetNextView来得到每一个视图(这里利用了
     虚函数的原理),这个和那个列表控件的删除方法和CFileFind类的遍历文件类似;;CDocument类就是有个专门有个函数管序列化的函数Serialize(),
    函数内部还是用CArchive类,这个类将文件该打开的都打开了,该创建都创建了;CDocument::SetModifiedFlag()设置文档是否被修改;CDocument::IsModified()判断最近一次文档
    是否被修改,其他两种没有该功能;Cocment::GetPathName()类中有个函数记录文件路径,这个函数用于得到文件路径;CDocument::GetTitle()获得文件名和后缀;CDocument::SetPathName()
    设置文件路径,这个CDocument类没帮你做;


109 当需要回调时,就需要建立某个类的派生类;


110 文档系统关闭或菜单关闭时,都要经过OnClose();


111 文档与视图的关系: CView::GetDocument()获取文档指针(当用文档模板架构);CDocument::AddView()等函数;


112 CDocument类常见的虚函数回调:(在文档模板架构中)
    CDocument::DeleteContents()需要清理文档数据时调用,也就是视图切换时调用;
    CDocument::OnNewDocument()创建文档时回调;在程序启动时就自动执行,并且内部执行DeleteDocument();
    CDocument::OnOpenDocument()打开已存在文档时回调;内部执行DeleteDocument();
    CDocument::OnSaveDocument()保存文档到硬盘时回调;
    CDocument::OnCloseDocument()关闭文档时回调(这个时候文档与视图的关系已经断开);内部执行DeleteDocument();


    用CDocument类时这个的派生类作为数据中心 


113 字符串表有管理标题和提示的标题;


114 (消息映射区域)ON_COMMAND_RANGE和ON_COMMAND,前面这个是从哪个ID到哪个ID全部映射到某个函数,这样可以使一个函数管理多个控件;后面这个函数是某一个id映射到一个函数;
     在工具栏中的映射函数参数是根据CCmdUI*;用这个方法节省代码(CCmdUI能够得到ID,索引等);


115 文档的加载随着版本的不同该怎么办???
    COM结构,组件模式;


116 MFC六大关键技术:


1》 MFC程序的初始化过程;执行文件名称,提示名称等;
2》 消息映射机制;使窗口消息与窗口类的成员函数地址关联;头文件必须要DECLARE_MESSAGE_MAP声明消息映射通过在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP中间写消息映射; 
3》 永久保存(串行化);通过Serialize();占用空间小;
4》 动态创建; 在程序运行时创建类对象的机制;凡是有DECLARE_DYNCREATE(包含动态创建和CRunTime::CreateObject())和IMPLEMENT_DYNCREATE为动态创建,支持运行时类型识别(RTTI);
              CRunTimeClass结构体
5>  命令传递; CMainFrame(CFrameWnd的派生类)::OnCmdMsg(),接收到菜单,工具栏,按钮的消息,分发给所有子窗口;
    分发命令消息的机制:框架收到的命令消息先传给视图,如果没有成功,就传给文档,接下来是主窗口,最后是应用程序;(默认是这样,可以改代码)
6>  运行时类型识别 在程序运行时判断一个CObject派生类对象,该类对象是否由指定的MFC类派生;根据信息登记表识别派生类;运行时类型识别不支持动态创建;
    CObject::IsKindOf()判断是不是它的派生类;


116 多文档中可用CFormView来使用对话框;对话框已经与CFormView的派生类关联了,无法与其他类关联了,消息响应函数写在这个类中;


117 CSplitterWnd::IdFromRowCol()能用于为CreateStatic()创建多层视图,就是在子视图中弄分割器;也就是静态窗口再做静态窗口;只适合右边分成几个;


118  用户按下键盘按键并放开至少产生三个消息:WM_KEYDOWN,WM_CHAR,WM_KEYUP;


119 多文档分割视图,子框架可用CFrameWnd;


120 CMDIChildWnd::MDIMaximize()能使MDI子窗口最大化;


121 子窗口获取父窗口::GetParent();父窗口获取子窗口::GetDlgItem(),GetWindow()(不知ID时,可获得父窗口和子窗口);
    主框架得到子框架通过GetActiveFrame()
122 MoveWindow移动非模式对话框,基于屏幕坐标系;


123 CDC::GetTextExtent()根据当前文本和文本内容计算文本宽度和高度;


124 在文档视图中,手动创建控件就需要;控件的创建可用每个控件类中的Create函数,消息响应要自己手工写;显示系统帮你做好了;
    1》  先在头文件中定义控件型关联变量,并且将ID用enum写出来;
    2》  在OnCreate函数中用Create函数,通用分格要有visible,child(子窗口),tapstop,其他属性按情况而定;自定义创建的控件要设置字体(CWnd::SetFont);按钮可以创建单选多选等按钮
         显示大小是添加的资源的1.5倍;
    3》  消息映射函数的书写,声明,定义和消息映射区域;
    在视图模板和对话框中,子窗口和控件的创建都在OnCreate中创建;


125  CWnd::Create()只限于创建所有控件在内的子窗口;CWnd::CreateEx可以创建控件,又可创建主窗口,可以指定扩展风格,创建的窗口需扩展风格(边缘凸起或下陷)就用这个;


126  注册自定义窗口类型:
     AfxRegisterClass().MFC全局函数,这个要写个结构体;AfxRegisterWndClass(),这个只要写个风格,简易注册,不能控制窗口类型名,而是系统给的;AfxRegisterWndClass的返回值是注册类型;
      RegisterClass()win32函数;
     
127  使用自定义窗口做主窗口:在InitInstance中写
     1》 CWnd::CreateEx函数是非阻塞的,必须在堆空间中申请窗口类对象;这里可以指定背景填充物,图标,光标,菜单(CreateEx,AfxRegisterClass,RegisterClass,::SetMenu都可指定);
     2> 在申请堆空间时要指明派生类对象(这个是使窗口关联派生类(自己创建的),才能在派生类中接收并处理窗口消息;
     3> 申请的窗口派生类对象的地址,必须要保存在theApp.m_pMainWnd中
     4》 InitInstance函数返回要return TRUE,对于自定义的主窗口;
     5> 退出方式为AfxGetMainWnd()->DestroyWindow();AfxGetMainWnd()->PostMessage(WM_CLOSE);OnPostNcDestroy比OnDestroy晚调用,OnDestroy时父窗口和子窗口的句柄都存在;
        另外一个父窗口和子窗口的句柄都不存;


128  MFC中有个缺省的回调函数 ::DefWindowProc;


129  创建主窗口要注册,创建子窗口不用注册窗口类型名,代入NULL就行;


130  控件的二次开发比自定义控件的开发轻松;自绘控件是一种特殊的二次开发方法;很多控件没有自绘属性;不支持自绘的控件进行二次开发,主要改造控件的绘图和操作的消息映射函数,
     例如OnPaint和OnMouseMove;绘图加跟踪的变量在OnPaint中写比较方便,因为在写操作时方便;


131: WM_KEYDOWN和WM_KEYUP;分别为当按下键盘,释放键盘时响应;WM_CHAR:分析处理后的按键响应;


132.  CToolTipCtrl类用于控件提示;
      0.创建CToolTipCtrl类对象;
      1.CToolTipCtrl::RelayEvent()传递鼠标信息给提示窗口处理;在CDialog::PreTranslateMessage()写; PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码.  
    1.5 CToolTipCtrl::Create()创建一个与类对象关联的提示窗口;
      2.CToolTipCtrl::Activate()激活或禁止窗口提示;
      3.CToolTipCtrl::AddTool()添加与窗口关联的提示文字;(列表控件等时要用动态提示,第二个参数就用默认参数(就是用回调函数),要参照MSDN的TTN_NEEDTEXT例子,增加消息映射ON_NOTIFY_EX(TTN_NEEDTEXT,0,函数名),要区分ID);
      凡是NOTIFY函数有NMHDR结构体;
      让提示文字多行显示用CToolTipCtrl::SetMaxTipWidth(1000);
      菜单可以不用这样写;
 
133  windows中字符串换行用\r\n;


134 菜单分为窗口菜单(一个水平的菜单栏和多个弹出菜单列表,菜单项为菜单列表的一项)和上下文菜单;菜单中相近的用属性分割条分开;菜单项有popup风格的可以在分一个子菜单出来;


135 CMenu类提供创建,追踪,更新,销毁菜单。可以为窗口设置新菜单调用CWnd::SetMenu(),当窗口销毁后菜单自动销毁;
    成员函数LoadMenu()加载菜单资源;
    CMenu::TrackPopupMenu()使菜单在某一处弹出来,在哪里显示就代入哪个的窗口地址,坐标基于屏幕坐标系,WM_RBUTTONDOWN基于客户区坐标;提示继续在状态栏中显示,要用主框架窗口地址。
    CMenu::GetSubMenu()获取菜单的子菜单,这个分隔栏也算;
    CMenu::ApppendMenu()在菜单末尾添加一个新的菜单项;自绘菜单时要在这里将每一个菜单项加OWNERDRAW属性,创建一个空白的弹出菜单(CreatePopMenu()),将每一个菜单项都自己加上去,然后在DrawItem()自己画出来(它是每一项都调用);
    WM_CONTEXTMENU消息是专为弹出上下文菜单而设计的,坐标基于屏幕坐标系;当右键点击时会发出该消息;
    
136 CToolBar工具栏的创建与加载:在属性里修改可以使每一行多少个;
    1> 在框架或者视图类的头文件定义CToolBar对象
    2> 调用CToolBar::Create()或者CreateEx()
    3> 调用CToolBar::LoadToolBar()来加载工具栏资源; 
    显示通过CFrameWnd::DockControlBar停靠或者CFrameWnd::FloatControlBar漂浮;
    
    CToolBar::SetButtonStyle()根据索引设置按钮风格;索引包括分割条;可以设置出工具栏下拉按钮,点击会调用一个固定格式的反射函数(MSDN可找到),写好消息映射;
    CToolBar::SetButtonText()根据索引设置按钮上的文字;
    CToolBar::GetItemRect()根据索引获取矩形;
    CToolBar::SetSizes()设置按钮及其位图的大小;
    CToolBar::LoadBitmap()加载包含所有按钮图像的位图(位图的生命期比较长),在用位图的时候使用,这个要使用CToolBar::SetButtons按顺序设置所有按钮ID;
    CFrameWnd::EnableDocking()允许控制条停靠;


137 CDialogBar对话框栏,即类似工具栏的非模式的对话框,构造函数能确定位置;
    CDialogBar类能创建对话框工具栏(可以添加控件),类中有Create()(只需创建对话框);凡是CDialogBar接到的消息会自动传给其父类;这个类创建的对话框的按钮要建立的消息反射才可按; 
    CFrameWnd::ShowControlBar()显示或隐藏控制栏(包括工具栏和状态栏);


138 CStatusBar状态栏:带有一行文本输出窗格(指示器)的控制条
    CStatusBar::SetIndicators()通过一个数组设置所有指示器的ID
    CStatusBar::SetPaneText()根据索引设置指示器的文字  CStatusBar::GetPaneText()根据索引获取指示器的文字
    CStatusBar::GetItemRect()根据索引获取指示器的矩形;


    更新状态条指示器文字的方法:
    1》声明ON_UPDATE_COMMAND_UI()可以使某个指示器与更新函数关联,刷新该区域就会调用这个,在该函数中地用用CCmdUI::SetText函数;
    2》调用SetWindowText只更新第一个指示器中的文字;
    3》 SetPaneText()设置任何窗格的文字;
    
139 MFC网络通信,网络编程有错误时总要使用GetLastError()获取错误码;
    每个端口同时只能被一个进程占用;
    OSI七层协议:应用层,表示层,会话层,运输层,网络层,数据链路层,物理层;
        
  1> UDP通信  必须使用结构体对命令号和数局进行打包后在发送,因为UDP不执行正确性检查;
     CAsycnSocket::SendTo()给指定IP地址和端口套接字发送数据(用于UDP通信模式);
     重写CSocket::OnReceive(),用于截获接收的网络数据,当有人向你发送数据时调用;也可用于接收和解析客户端协议;(在TCP通信中一般放在应答类中)
     CAsycnSocket::ReceiveFrom()接收其他计算机套接字发来的数据并截获对方的IP地址和端口信息;
    
  2> TCP通信 分为服务器端和客户端,服务器端分为一个侦听Socket和多个用于应答的Socket组成,每个应答Socket与客户端建立一对一的数据流通道;客户端程序只包含一个连接Socket,成功
             连接服务器后与某一个应答Socket进行一对一的数据通道;  Listen Socket->many Clinet Sockets<->many Clients;
             
          要创建监听类(在主框架中建立成员变量),应答类(服务器端);连接类(客户端);两个程序;
          重写CSocket::OnAccept()用于截获客户端的连接;可用于多人连接;(一般放于监听类中);
          CAsycnSocket::Accept()接受远程套接字的连接,并获取对方的IP地址和端口信息;
          CAsycnSocket::Receive()接收对方套接字发送的数据;
          CAsycnSocket::GetPeerName()获取对方的套接字的IP地址和端口;
          CAsycnSocket::Send()向TCP连接的另一端发送数据;
          重写CSocket::OnClose()监测某个客户端是否断开了连接;
          CAsycnSocket::Connect()与服务器端套接字建立连接;          
          CAsycnSocket::Listen()开始监测远程计算机的连接请求;


140 CSocket类(加afxsock.h头文件)  Create()创建一个模式套接字并绑定端口,但是在创建之前一定要在应用程序初始化时调用AfxSocketInit(),而且每个端口只能使用一次(可以通过建工程时加个Windows Sockets);


141 GetLastError()获取的错误,能通过TOOLs->Error Lookup命令查找;


142 CEdit::SetSel()设置被选中文字的起始位置;
    CWnd::GetWindowTextLength()获取窗口文字的长度;
    Cedit::ReplaceSel()替换或者插入文字;


143 CList是通用型的列表类,你可以存放指定的数据类型,用法如下:
    CList<CPoint, CPoint&> list;
    这样就指定了CList中存放的是CPoint类型的引用;


    CPtrList,CObList,CStringList都是具体的用于某种类型的集合类型
    而CPtrList存放的是void类型的指针,就是什么指针都可存,取出的时候必须要强制转换;
    CPtrList::AddTail()将元素存到列表尾;               AddHead 将一个元素(或另一列表中的所有元素)增加到列表头(成为新的列表头)
    CPtrList::GetHeadPosition()返回列表头元素的位置;  GetNext() 获取下一个元素进行迭代;
    CPtrList::RemoveAt  从此列表中移走给定位置的元素,还要清除堆空间;
    CPtrList::GetAt 获取在给定位置的元素


    CObList用于存放从CObject派生的数据类型的指针;
    CStringList存放CString字符串类型,相当于CList<Cstring,CString>


145 任何通信协议的格式都是由命令号和附带数据组成(网络通信协议和硬件通信协议);命令号是用一个数字或字符串通知对方执行相应的命令;大部分协议再发送命令后还要发送附带数据;
多媒体技术:
 
1.  音频: 在多媒体中采用MCI(Media Control Interface 媒体控制接口)使得波形声音文件(.wav 文件)可播放;
          波形声音是windows的多媒体的特性;波形声音设备可以通过麦克风捕捉声音,并将其转换为数值,然后将它们储存到内存中去或磁盘上的波形文件,波形文件的扩展名为.wav;
2.  视频:


3   visual c++设计多媒体应用程序3个步骤:
1》 引用头文件 mmsystem.h
2>  链接多媒体函数库 winmm.lib;
3》 在应用程序中写入多媒体调用的代码 ;


4   高级音频函数:
    MessageBeep()主要用来播放系统报警声音,只用来播放少数定义的声音;
    PlaySound();第一个参数指定播放声音的字符串(也就是文件路径或者WAV资源名(这个可以添加));第二个参数为包含被加载的文件的句柄;第三个表示标志的组合(一般要SND_ASYNC);
    sndPlaySound(),将它的两个参数设为NULL,即可停止播放;
    这三个函数播放的WAV文件的大小不能超过100KB,如果播放大的WAV文件,则应使用MCI(媒体控制接口);


5 多媒体控制接口MCI: MCI作为应用程序和具体物理设备的中间件,应用程序利用MCI向物理设备发送一些命令;
  1> mciSendString()向MCI发送命令字符串;第一个参数为MCI命令字符串,第二个参数为存放反馈消息的缓冲区;第三个参数为缓冲区的长度;第四个参数为一般为NULL;
  2> mciSendCommand()向MCI发送命令消息;第一个参数为MCI命令的设备标识符,第二个是要发送的命令消息,第三个是MCI命令消息的标志(从哪里开始),第四个是指向MCI命令消息数据结构的指针;  
     
6  所有MCI函数都以mci为前缀,都在mmsystem.h中声明;


7 MCI编程的步骤:
  1.打开设备.用户不希望使用设备中的特定的参数数据时,则可使用统一的MCI_OPEN_PARMS结构体;
           1> 先定义一个MCI_OPEN_PARMS(或其他)结构类型变量;
           2>给结构变量中的相应参数赋值(MCI_DEVICEID(MCI设备类型,一般文件都为MPEGAudio),lpstrElementName(设备元素,即文件路径));
           3>调用mciSendCommand()向设备发送MCI_OPEN命令消息,当调用成功,即可获得相应的设备标识符;
           该函数被成功调用则返回0,否则返回错误码;
  2 设置或获取设备信息. 也要通过mciSendCommand()发送命令;
           MCI_SET和MCI_STATUS命令分别用于设置和获取设备信息,相应的结构体变量(用于发送的第四个参数)MCI_SET_PARMS和MCI_STATUS_PASRMS(可以间接获得歌的时间,时间单位为毫秒);
           可以随时获得设备播放信息(如播了多长),MCI_STATUS.dwItem=MCI_STATUS_LENGTH;
  3. 播放设备
           使用MCI_PLAY命令可以是设备播放多媒体文件,使用mciSendCommand()时要用到MCI_PLAY_PARMS结构体(其中有播放起点和终点);第三个参数为MCI_NOTIFY就是停止后继续播放;
           MCI_SEEK_PARMS可以指定播放的位置,eg mciSendCommand(song.IDDevice,MCI_SEEK,MCI_TO,(DWORD)&mciseek);;
           MCI_DGV_SETAUDIO_PARMS用于调节声音; eg  song.mdsp.dwItem=MCI_DGV_SETAUDIO_VOLUME;               //调用MCI函数,设置音量大小
                                          song.mdsp.dwValue=song.volumn*10;
                                          mciSendCommand(song.IDDevice,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE|MCI_DGV_SETAUDIO_ITEM,(DWORD)&song.mdsp);
  4. 关闭设备(这个要记得)
           MCI_STOP和MCI_CLOSE命令分别用于停止播放和关闭设备(还要用的话,就需重新打开),不需结构体;


8 MCIWnd窗口类  用于控制多媒体设备的窗口类,封装了上面的步骤;   要添加一个头文件  vfw.h 和  编译时加入vfw32.lib库(或#pragma comment(lib,"vfw32.lib")),支持WAV,MIDI,CD音频,
              以及AVI视屏的操作;
                          
9  MCI_DGV_SETAUDIO_PARMS结构体用于设置音量;
   eg:MCI_DGV_SETAUDIO_PARMS mcisetvolumn;
      mcisetvolumn.dwCallback=NULL;
      mcisetvolumn.dwItem=MCI_DGV_SETAUDIO_VOLUME;
      mcisetvolumn.dwValue=vol;
      m_dwVolumn=vol;
      mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE|MCI_DGV_SETAUDIO_ITEM,(DWORD)(LVPOID)&mciSetVolumn);


10  CSlideCtrl滑动条;要漂亮的话,就二次开发;
    SetRange()设置范围;GetRange()获取上下限;
    SetPos()设置位置,相对有GetPos();
    CSliderCtrl::GetThumbRect 取得“拇指”的范围,“拇指”就是我们可以通过鼠标拖动的那个小方块.     
            






   
        
    













  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值