|
MFC小笔记 |
cdc derive cclientdc and cwindowdc;moveto 相当于起点,LINETO相当于终点;getdesktowindow()桌面窗口,可以得到其窗口对应圣像的的指针或者其窗口的句柄GetStockObject()得到画笔、画刷、字体、调色板的句柄,使用时必须用类型转换。slectobject()把画笔(CPEN Member),画刷(CBRUSH),字体(CFONT),调色板选到DC上.返回值为原来的OBJECT的指针.指定的填充区域,用FILLRECT(),因是指定的区域所以不别选到CD上.
第四讲 文本编程
主要用到的函数:CreateSolidCaret(width,height)-ShowCaret(); GetTextMetrics(TEXTMETRIC );=>注意此函数是与DC相关的,是CDC的成员函数.TEXTMETRIC 为结构体,其里是设备上下文中TEXT 的相关字体信息. OnDraw(CDC *pdc)函数是窗口进行重绘时调用的,用于显示而不变,始终看得见. textout();在设备上下文中进行输出TEXT; CString 类无基类.成员函数:LoadString(ID);在String Table中; CSize GetTextExtent(str):要用得是其返回值.是str字符串的WIDTH和HEIGHT.而GetTextMetrics(TEXTMETRIC)得到的是当前 DC上下文中字体本身的信息. 一般BegainPath(),Endpath()要和SelectClipPath()三者一起用才有效.... (1)CDC::SetTextColor();设置TEXT颜色.Set\GetBKColor()设置和获取文本背景颜色. (2)CFont类中封装了DC相关文字的信息,如CREATEPOINTFONT()->此函数是为了初始化CFont对象和相关字体资源的初始函数. 可得到相关的字体.然后通过CDC::SlectObject()选到设备上下文中.第6讲 菜单Menu 最先得到菜单响应的顺序为 Cview->Cdoc->CMainFram->App->; 子菜单是包含菜单项.....别搞错!菜单项能用索引号和ID号来进行访问,而子菜单只能用索引号进行查找. 所用的函数:CMenu CWND::*GetMenu()得到菜单栏的地址,CMenu CMen *GetSubMenu()(表示getsubmenu是CMenu的成函数)得到子菜单的地址. 操作菜单项函数:CMenu ::CheckMenuItem() Cmenu ::SetDefaultMenu();(一般函数只用3个单词,后患无穷的被省掉) 图形标记菜单:SetMenuItemBitmaps()此函数的Bitmap不能为局部变量\对象而且要下低色不能为白色; 禁用菜单项:EnabledMenuItem()一般要求ITEM DISABLED时,要用把其变灰GRAYED还要注意需要高置一变量才行; 格式化函数:printf()屏幕上; sprintf() CString格式化到buffer中; Format()将数据按照一定的方式格式化到string 对像中;
(*****)设置整个菜单:SetMenu()和Cmenu LoadMenu();对象和实物相联时,bitmp和menu都一样,用loadbitmap\menu()不能为小变量.通过 SetMenu(&menu)就可以了.Menu.Detach(); (1)Menu菜单响应有两个命令:ON_COMMOND和ON_UPDATE_COMMAND_UI前者用于点击时用,后者用于菜单项处理函数,所以可以直接用其响应和处理 菜单项.所以一般直接对相应的菜单项的操作对该菜单项进行ClassWizarred 的ON_UPDATE_COMMAND_UI即可.而不别像一面(*****)中那样操作了. (2)客户区坐标和SCREEN坐标转化函数:ClentToScreen()可以是点(POINT)也可以是矩形(RECT); (3)若用动态加载子菜单的话(CMainFram类的ONCreate中),此时MENU对象和其实例用CREATEPOPUPMENU()函数关联起来.I)如果通过GetMenu()后用AppendMenu()和InsertMenu(),DeletMenu()进行该Menu操作,就把MENU变成 子菜单了.II)直接没有用GETMENU()而MENU.A\I\D则得到该菜单的ITEM.如果不是动态则用得到地址后才行. (4)手动添加标准消息和命令消息:WM_CREAT(无参数,因有默认的函数与之对应) ON_COMMAND(ID,和ID相关的函数); (5)菜单栏属于CMAINFRAME的,在VIEW类中用GETMENU()得不到它所在地址. (6)CString类的FIND函数可以查找CString中的字符或者说是字符串.反回一个整数标示其的基于0的索引值.LEFT(N)要从左面取多少个字符. .Empty()清空.Format()格式化.GetLenth()获取长度[注意Cstring中结尾不是'0/']. (7)CObject为对象的结合类,及是对象的数组.包括:CStringArray,CWordArray,CByteArray等格式的对象结合类. 成员函数.Add()添加.GetAt(索引)取出.GetSize()得到成员个数 (8)注意理解:对于菜单项为例,其的ID对就于一个整数值,是系统分配的,所以可以自己去先定义,而不是由系统自动分配. (9)从前面可知道,view类要最先响应ON_COMMAND命令休息.所以要想在CMAINFRAM中去响应就得在CMAINFRAM中去截获该命令才行.不要CAMINFRAM去调用它的基类,OnCommand()函数. (*)GetACtiveView()反回当前VIEW类的指针. (*)注意出错是因为头文件有问题.第七讲 对话框 (1)CDialog类是对话框的基类.要用对话框的话,必须先要有一个对话框资源,然后ClassWizared该项资源为一对象.通过初始和DoModel()\EndModel()对MODEL DIALOG操作, Create()\ShowWindow()\OnOK()\DestroyWindow();进行操作等进行操作.....再次注意用得是成员函数.....格式.成员函数.... (2)WS_VISIBLED | WS_CHILD对于CWND....对对话框的操作都应当用CDialog DERIVE子类进行操作,而不是对VIEW或CMAINFRAM进行操作. (3)静态变量或者说静态对象只初始化一次,及程序再次执行到定义处时,不会再进行初始化了.也及那里不再执行. (4)只要从CWND DERIVE的类,都有一个m_hWnd保存了C++窗口对象和资源相关的句柄.没有创建则m_hWnd为空,否则不空. (5)对于文本默认得ID_为STATIC,所以一般不能对其进行操作,要改变其ID后才能进行相应操作,原因简单,因为用ID的资源分配系统来进行解释. (6)CWnd *CWnd::GetDlgItem(DLG_ID)可以得到G该DLG_ID的对象指针.注意设置:poroty->styles->notify 使其能够接受通告能力. (7)对于文本框的操作,行用(6)得到其对象指针,然后,用其成员函数Set\GetWindowText(CString\string). .... atoi可以所字符串的内容转换为数值形.itoa相反转换. (8)的操作可以用CWnd::GetDlgItemTexe(ID,CHAR *)得到.或者用int n=CWnd::GetDlgItemInt(ID);把字符文本直接转换为INT形. (9)直接对文本框进行关联变量即可.但要求CMAINFRAM重新调用DODATAEXCHGE()函数,来进行.Cwnd::UpdateData(True\False).TRUE表示关联的变量接受对话框文本值,FALSE表示用关联的变量设置对话框的值. (10)资源关联为变量为一常用的变量,而关联为控件时表示为该资源类的对象. (*)一般多了一个CWND DERIVE类后,对其的很多响应不能在CVIEW 类和CMAINFRAM类中进行响应.原因很简单处了框架窗口外,其它创建的窗口都必须有一个父窗口.就像Cview类中的对MOUTH的相应函数不能 用在其父类(CMainFram)中去相应一样. 所谓要用Buffer及是字符串. (*)第一次接触SendMessage()进行消息处理,真对文本的WM_GETTEXT和WM_SETTEXT消息响应; (1)SendDlgItemMessage()是用于对自身的子控件或子窗口发送消息的.相当于.GetDlgItem()[得到窗口子控件对象指针]->SendMessage(); (2)设置焦点,EM_SETSEL消息和用CEdit.SetFocu()函数,即可; (@@@)Item中文子控件,GetDlgItem中文就是得到对话框的控件(子控件对象的指针);而不要理解为此函数是要得到当前对话框的对象指针. 同英文可知Set\GetDlgItemText()和Set\GetDlgItemInt()为何意.SendDlgItemMessage()等. ($$$)一般控件(Activx)都应该是窗口.获取窗口大小用GetWindowRect();设置用SetWindowPos()此函数可以设置大小和Z-order. (1)对话框中的WM_INITIALDIALOG当然它也有WM_CREAT,但是前者在后者产生之后.后者是Dialog产生但是其子窗口或者说子控件得还没有初始出来, 而WM_INITIALDIALOG是子控件等都产生了,其要显示之前发送的消息. (2)重新设置窗口的过程函数可以利用,SetWindowLong()来进行. (3)回调函数必须为全 函数,所以要用WIN32平台中的函数.而且该函数本身就提供了该窗口的句柄.注意它是一个窗口的函数,即如果要想得到父窗口的直接用::Getparent()即可. (4)对于想得到当前窗口的前,后,子得窗口的句柄时可以直接调用 ::GetWindow()即可. | |
|
|
|
|