mfc入门,mfc基本操作

  mfc入门,mfc基本操作

  记住,是获取指针

  MS-VisualC++的类库(微软基础班的缩写)消息流程图:

  字符串CString char*的互相转换:

  线转CString CString .格式( %s ,字符串。c _ str());//用c_str()比数据()好茶转CString CString .格式( %s ,char *);//可以直接给CString赋值,不要用字符格式*转线字符串s(char *);CString转字符串字符串s(CString .GetBuffer());//测试显示可以直接用CString赋给字符串,//因CString有运算符LPCTSTR不拷贝只返回指针

  线转char * char * p=string。c _ str();CString转char * CString .get buffer();

  可直接赋值,不用转换,因为LPCTSTR在CString中被重载了。

  一条重要经验:

  如果我们的类/结构体中有卡雷(或CList等其他的派生自对象类,即很多的控件类)的成员变量,我们最好添加上一个公众的类型的运算符=运算赋重载函数,否则编译器报错错误C2248: "CObject:operator=":无法访问私人的成员(在"混合"类中声明)

  创建全屏窗口:

  赢了CreateEx(0,szProgram,szProgram,WS_POPUP,0,0,GetSystemMetrics( SM_CXSCREEN),GetSystemMetrics( SM_CYSCREEN),NULL,NULL,hInst);

  目录对话框SHBrowseForFolder:

  CString sFolderPathBROWSEINFO biTCHAR缓冲区[MAX _ PATH];//初始化入口参数双性恋的开始bi . hwnd owner=NULLbi . pidlroot=NULLbi。PSZ显示名称=缓冲区;//此参数如为空则不能显示对话框bi.lpszTitle=_T(选择路径);毕。ul flags=BIF _ RETURNONLYFSDIRS;bi.lpfn=NULLbi。ii图像=0;//初始化入口参数双性恋的结束LPITEMIDLIST PID list=SHBrowseForFolder(bi);//调用显示选择对话框if(PID list){ SHGetPathFromIDList(PID list,Buffer);//取得文件夹路径到缓冲器里sFolderPath=Buffer//将路径保存在一个CString对象里}

  CTreeCtrl使用图标:

  一种最简单的方法: 1.在资源管理器中建立图标;如:IDI _图标_设备,IDI _图标_设备_选择;2.在CTreeCtrlEx中增加成员变量:CImageList m _ ImageList3。在void CLocTreeView:OnInitialUpdate()中增加如下代码:m_ImageList .Create(16,16,ILC_COLOR32,2,2);m_ImageList .add(AfxGetApp()-LoadIcon(IDI _图标_设备));m_ImageList .add(afx getapp()-加载图标(IDI _图标_设备_选择));m _ oTreeCtrl .SetImageList( m_ImageList,TV sil _ NORMAL);4.在向树中插入项目时指定这个项目对应的图标位图,代码如下:HTREEITEM hCurItem=m _ oTreeCtrl .InsertItem( ItemContent ,0,1,hit emparant);//参数中0,1为图标的索引其中的0指添加好后的图片为信息化发展指数图标设备,选中后显示的图片为:IDI _图标_设备_选择;

  CTreeCtrl使用图标另:

  建立一个CTreeCtrl控制成员m _ Tree

  使用图标的方法:

  步骤1://加载图标

  图标句柄图标[4];

  icon[0]=AfxGetApp()-LoadIcon(IDI _ icon 1);

  icon[1]=AfxGetApp()-LoadIcon(IDI _ icon 2);

  第二步://创建影像清单

  CImageList * imagelist 4 tree=new CImageList;

  图像列表4树.Create(16,16,0,4,4);//16,16为图标分辩率,4,4为该目录最多能容纳的图标数

  for(int I=0;我我)

  {

  imagelist 4树-添加(图标[I]);//读入图标

  }

  第三步://使用创建好的影像清单

  m_Tree .设置imagelist(imagelist 4树);

  第四步://在添加项的同时选用图标

  m_Tree .InsertItem(itemName,0,1,父项);//第2个参数是项目在添加好后的图标//第3个参数为项目在被选中后的图标

  树一次展开所有结点:

  主要思想是递归。

  p/p p voidExpandBranch(HTREEITEM hItem,CTreeCtrl tree,br bool expand/*=TRUE */)/p p/* be expand=TRUE展开所有节点,否则为折叠*/br { br if(树ItemHasChildren(hItem)) br { br树。展开(hItem,bExpand?TVE _展开:TVE _崩溃);br hItem=树获取子项目(hItem);br do br { br ExpandBranch(hItem,tree);br }while((hItem=tree .GetNextSiblingItem(hItem))!=NULL);br } br } br /p p

  p /p p首先定义右键消息函数:/p p afx _ msgvoidOnRBClick(nm HDR * pNMHDR,LRESULT * pResult);/p p然后在消息循环中定义消息对应关系:/p p ON_NOTIFY(NM_RCLICK,ID_TREECTRL,OnRbClick) /p p接着定义消息函数内容:/p p/p p voidCXMLEditorDlg:OnNMRClickTree(NMHDR * pNMHDR,LRESULT*pResult) br { br //TODO:在此添加控件通知处理程序代码br * pResult=0;/p p c点;br GetCursorPos(点);point point intree=point br m _ tree ctrl .screento客户端(point intree);br UINT flag=TVHT _ on item br HTREEITEM hItem=m _ tree ctrl .HitTest(pointInTree,flag);/p p m _ hSelectedItem=hItem;br if(hItem!=NULL) br { br //m_TreeCtrl .SelectItem(hItem);英国铁路公司菜单菜单;英国铁路公司菜单加载菜单(IDR _ TREE);英国铁路公司菜单. get子菜单(0)-trackppopupmenu(TPM _ left align TPM _ right button,point.x,point.y,this,NULL);br } br } /p p h3 vs2005导入GIF格式格式图片:/h3 /p p用源码编辑器打开。罗马天主教文件。添加如下/p p IDR _ EYES GIF RES EYES。GIF br IDR _ FELIX GIF RES FELIX _ new。GIF br IDR _ TYPE GIF RES TYPE。GIF /p p然后在资源。h中添加身份定义/p p #定义IDC _ HAND 133 br #定义IDR _ EYES 134 br #定义IDR_TYPE 137 /p p /p p下边的也行:/p p /p p br手工在。罗马天主教文件里添加br IMG1 IMAGE restest.gif /p p在负荷时可以这样:br span hResInfo=find resource(hInst, IMG1 , IMAGE );/span br if(hResInfo==NULL)br { br dwErr=GetLastError();英国铁路公司返回FALSEbr } /p p //加载资源br span hRes=LoadResource(hInst,hResInfo);/span br if(hRes==NULL)br { br dwErr=GetLastError();英国铁路公司返回FALSEbr } br /p p /p p span h3基于对话框程序添加菜单:/h3 /span /p

  在副主席中创建一个基于对话框的MS-VisualC++的类库(微软基础班的缩写)程序,要在其中添加菜单总共分三步:

  1、首先插入一个菜单资源IDR_MENU,然后可以编辑修改菜单;

  2、然后在为对话框添加一个菜单类型的成员变量m _菜单

  3、在OnInitDialog()中添加如下的代码:

  m _菜单加载菜单(IDR _ MENU);//载入菜单SetMenu(m _ Menu);//显示菜单

  经过这三步以后菜单就可以显示出来了。

  菜单退出项消息映射:

  BEGIN_MESSAGE_MAP(CXMLApp,CWinApp) ON_COMMAND(ID_HELP,cwin app:ON HELP)ON _ COMMAND(ID _ EXIT,cwin app:ON app EXIT)END _ MESSAGE _ MAP()

  四,基于对话框程序添加工具栏:

  1、添加工具栏资源身份为IDR _工具栏2,在对话框的类定义中加:c工具栏m _ ToolBar3,在OnInitDialog中或其它合适的消息响应中加如下代码:

  m _工具栏。创造(这个);m _工具栏加载工具栏(IDR _ toolbar 1);//控件条定位重新定位条(AFX _ IDW _控制杆_第一,AFX _ IDW _控制杆_最后,0);

  4、手工添加处理函数

  afx _ msg void on BTN XXX();//消息响应函数声明ON_COMMAND(ID_BTN_XXX/*工具按钮ID*/,OnBtnXXX/*函数名*/)//消息映射void CXXXDlg:OnBtnXXX(){}//消息处理函数

  控件初始化,不然不会显示(程序会没有界面弹出来):

  AfxEnableControlContainer();//原有AfxInitRichEdit();//richedit的初始化在应用类初始实例中

  对话框右上角?号图标:

  只需要在对话框属性上选中上下文帮助这个选项就好了,把对话框显示出来就能发现右上角的小问号按钮。

  应用程序只有一个实例:

  在应用类的初始实例()中添加如下代码:

  BOOL bAlreadyRunning=FALSE

  HANDLE hMutexOneInstance=:create mutex(NULL,FALSE,_ T( SnowParentWindow ));bAlreadyRunning=(:GetLastError()==ERROR _ ALREADY _ EXISTS :GetLastError()==ERROR _ ACCESS _ DENIED);

  if(bAlreadyRunning)返回错误的

  图标菜单(菜单图标)的实现:

  一~我爱你~单文档的菜单图标实现:1新建一个位图资源,大小为13 * 13(#添加暂时必须满足这个条件,大的图标不会显示),假设身份号为IDB _位图1号文件,画好图标2 ._在cmainframe-cmainframe-cmainframe-cmainframe-cmainframe-cmain框架中添加成员变量:cbitmap位图3在cmainframe-cmainframe-cmainframe-cmainframe-cmainframe-cmain框架的OnCreate(创建)中加入:位图load Bitmap(IDB _ bitmap 1):get menu()-get子菜单(0)-setmenuitembitmaps(0,mf _ byposition,bitmap,bitmap)://具体哪个菜单项为图标,可自己设定4 ."编译,实现图标菜单。

  二~我爱你~多文档的菜单图标实现:1新建一个位图资源,大小为13*13个,假设身份号为IDB _位图1号文件,画好图标2 ._在cm aoy _ com文档(你程序中的债务抵押债券子类)中添加成员变量:cbitmap位图3在-=伊甸园美剧http://sfile。ydy。com=-荣誉出品本字幕仅供学习交流,严禁用于商业途径的在线文档文件中加入:位图. load bitmap(IDB _ bitmap 1):cmenu * pmenumu=cm menu:from handle((cmultdoctemplate *)m _ pdoctetate)-m _ frame ushare);cmenu * PSU b menu=pmenu-get submenu(0);PSU菜单-设置菜单项目位图(0,mf _ byposition,bitmap,bitmap);4 ."编译,实现图标菜单。

  投降吧控件限定只输入数字:

  如果在对话框上创建,可直接在样式(风格)属性里指定为号码(数字),如果动态创建的则

  设置编辑(编辑)的属性为:ES _编号比如m _速度编辑编辑ModifyStyle(0,ES_NUMBER,TRUE):

  或者

  双字样式=m _ speededit .GetStyle():

  dw style =es _ numbersetwindowlong(m _ speedo edit。m _ hwnd,GWL_STYLE,dw STYLE);

  在一个对话框上显示出一条凹下去的线:

  把图片(吨)控件拉成直线,设置颜色(颜色)属性为还有切达

  或者选择孙坚属性为真的吗

  右键弹出菜单的实现:

  通常是响应WM _上下文菜单-WM _内容功能表消息

  请参阅Cr view:oncontext菜单(cwnd * pwnd,cppoint){//全部:在此处添加您的消息处理程序代码cmenu m _ popmenum _ pop选单LoadMenu(IDR_MENU1):cm菜单* PSU菜单=m _ pop菜单。get submenu(0);PSU bmenu-track弹出菜单(TPM _ leftalign TPM _ leftbutton、point.x、point.y、this);}

  基于对话框程序大小调整相关:

  对话框边界(边框)属性改为复活(r)即为可调大小。

  控件跟随窗口大小一起变化,响应WM_SIZE(消歧义)消息

  限制大小的范围重载wm _ getminmaxinfo游戏消息ongetminmaxfo(minmaxfo far * lpmmi)}

  lpmmi-ptmindsracize。x=400lpmmi-ptmindsracize。y=400

  lpmmi-ptmaxtracize。x=500lpmmi-ptmaxtracize。y=500

  CD dialog:ongetminmaxfo(lpmmi);}

  对话框滚动条属性后的响应:

  //水平滚动响应void ccildlg:on scroll(uint nsb code、uint npos、cscscroll bar * pscrollbar){//全部:在此添加消息处理程序代码和/或调用默认值scrollinfo scrollinfogetscrollifo(sb _ horz、ScrollInfo、SIF _ all);开关(nsbcode){ case sb _ left:滚动窗口(滚动信息。NPO-滚动信息。nmin)* 10.0;scrollinfo。npos=scrollinfo。nminsetscrollifo(sb _ horz、ScrollInfo、SIF _ all);打断;打断;案例sb _ right:滚动窗口(滚动信息。NPO-滚动信息。nmx)* 10.0;滚动信息。NPO=滚动信息。nmaxsetscrollifo(sb _ horz、ScrollInfo、SIF _ all);打断;打断;案例sb _ line left:滚动信息。NPO-=1;如果(滚动信息。NPO滚动信息。nmi){滚动信息。NPO=滚动信息。nmi打断;打断;} setscrollino(sb _ horz、ScrollInfo、SIF _ all);滚动窗口(10.0);打断;打断;某人的权利案例:scrollinfo。npos=1:if(滚动信息。NPO滚动信息。nmax){滚动信息。NPO=滚动信息。nmax打断;打断;} setscrollino(sb _ horz、ScrollInfo、SIF _ all);滚动窗口(-10.0);打断;打断;案例sb _ pageleft:滚动信息。NPO-=5;如果(滚动信息。NPO滚动信息。nmi){滚动信息。NPO=滚动信息。nmi打断;打断;} setscrollino(sb _ horz、ScrollInfo、SIF _ all);滚动窗口(10 * 5.0);打断;打断;案例sb _ pageright:滚动信息。NPO=5;如果(滚动信息。NPO滚动信息。nmax){滚动信息。NPO=滚动信息。nmax打断;打断;} setscrollino(sb _ horz、ScrollInfo、SIF _ all);滚动窗口(-10 * 5.0);打断;打断;案例sb _拇指位置:破;案例sb _ thumb back:滚动窗口(滚动信息。NPO)* 10.0;scrollinfo。npos=npos:setscrollifo(sb _ horz、ScrollInfo、SIF _ all);打断;打断;S7-1200可编程控制器:}

  CD dialog:on scroll(nsb code、NPO、pscroll bar);}

  //垂直滚动响应void ccildlg:on scroll(uint nsb code、uint npos、cscscroll bar * pscrollbar)//全部:在此添加消息处理程序代码和/或调用默认值

  if(pscrollbar==null){//messagebox( 33333 );} scrollinfo scrollinfogetscrollinfo(sb _ green、ScrollInfo、SIF _ all);交换机(nsbcode){ case sb _ bottom:滚动窗口(0,(滚动信息。NPO-滚动信息。nmx)* 10);滚动信息。NPO=滚动信息。nmaxsetscrollifo(sb _ green、ScrollInfo、SIF _ all);打断;打断;案例SB_TOP: ScrollWindow(0,(滚动信息。NPO-滚动信息。nmin)* 10);scrollinfo。npos=scrollinfo。nminsetscrollifo(sb _ green、ScrollInfo、SIF _ all);打断;打断;案例sb _排队:滚动信息。NPO-=1;如果(滚动信息。NPO滚动信息。nmi){滚动信息。NPO=滚动信息。nmi打断;打断;} setscrollino(sb _ green、ScrollInfo、SIF _ all);滚动窗口(0.10);打断;打断;S7-1200可编程控制器:如果(滚动信息。NPO滚动信息。nmax){滚动信息。NPO=滚动信息。nmax打断;打断;} setscrollino(sb _ green、ScrollInfo、SIF _ all);滚动窗口(0,-10);打断;打断;案例sb _ page up:滚动信息。NPO-=5;如果(滚动信息。NPO滚动信息。nmi){滚动信息。NPO=滚动信息。nmi打断;打断;} setscrollino(sb _ green、ScrollInfo、SIF _ all);滚动窗口(0.10 * 5);打断;打断;案例sb _ page down:滚动信息。NPO=5;如果(滚动信息。NPO滚动信息。nmax){滚动信息。NPO=滚动信息。nmax打断;打断;} setscrollino(sb _ green、ScrollInfo、SIF _ all);滚动窗口(0,-10 * 5);打断;打断;S7-1200可编程控制器:案例sb _拇指位置://拖动滚动窗口(0)(滚动信息。NPO-NPO)* 10);scrollinfo。NPOs=NPOs:sets crollifo(sb _ green、ScrollInfo、SIF _ all);打断;打断;案例sb _ thumb back:滚动窗口(0,(滚动信息。NPO-NPO)* 10);scrollinfo。NPOs=NPOs:sets crollifo(sb _ green、ScrollInfo、SIF _ all);打断;打断;}

  cddialog:onscroll(nsbcode、NPO、pscroll bar);}

  响应-=ytet-伊甸园字幕组=-翻译消息bool cscrolldemodlg:onouewheel(uint nfails,short zDelta,cppoint pt){//全部:在此添加消息处理程序代码和/或调用默认值//向下滚if(z delta=-120){ NV scroll=10;on scroll(sb _ page down、nVScroll、m _ vscroll);} else if(z delta=120){ NV scroll-=10;on scroll(sb _ page up、nVScroll、m _ vscroll);-==破烂熊乐园倾情奉献==-本字幕仅供学习交流,严禁用于商业用途MoveWindow(rt_mvScroll,TRUE):返回CD dialog:o new wheel(nfiggs、zDelta、pt);}

  屏蔽按进入键和经济社会委员会键按键:

  -不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不函数名称:PreTranslateMessage描述:重载函数,屏蔽回车键输入参数:无输出参数:无返回:无说明:无-=ytet-伊甸园字幕组=-翻译:粒粒粒尘紫月猫姐风景校对:在此添加专用代码和/或调用基类如果(pMsg消息==WM _ key down){ if(pmsg-wparam==fk _ escape)返回true if(pMsg-wParam==VK _返回)返回真实}

  return CD dialog:pre translate message(pmsg);}

  GDI(GDI)和GDI(GDI)实现双缓存

  当我们看电视时,我们看到的屏幕被称为OSD层,也就是说,只有当图像显示在OSD层时,我们才能看到它。现在,我需要创建一个虚拟的OSD层,它是不可见的,但可以在上面绘制图片(如点和线)。我称之为offscreen(背景缓冲)。这个屏幕外存在于内存中,我们在上面画图。屏幕外的东西可以显示在OSD层上。我们需要一个函数来创建这个屏幕外数据,它返回句柄(整数指针)、宽度、高度和指向新创建的屏幕外数据缓冲区的指针。这个buffer是在函数之外创建的offscreen的数据缓冲区,它的大小是每个像素的高度*宽度*数据大小。闪烁是图形编程中常见的问题。需要多个复杂绘图操作的图形操作将导致呈现的图像闪烁或具有其他不可接受的外观。双缓冲的使用解决了这些问题。双缓冲使用内存缓冲区来解决多次绘图操作导致的闪烁问题。当启用双缓冲时,所有绘图操作首先呈现给内存缓冲区,而不是屏幕上的绘图表面。所有绘图操作完成后,内存缓冲区被直接复制到其关联的绘图表面。因为在屏幕上只执行一次图形操作,所以消除了由复杂的绘图操作引起的图像闪烁。

  GDI实现了双重缓存:

  CClientDC dc(这个);CDC memdcmemdc。CreateCompatibleDC(DC);

  CRect rcGetClientRect(RC);CBitmap bmpBmp。CreateCompatibleBitmap( dc,rc。宽度(),rc。height());CBitmap *oldbmp=memdc。select object(BMP);

  memDC。MoveTo(0,0);memDC。LineTo(100,100);

  华盛顿。BitBlt(0,0,rc。宽度(),rc。Height(),memdc,0,0,src copy);

  上面演示了一个初始示例。

  先给出实现方案,再解释,也是OnDraw(CDC *pDC):

  //首先定义一个显示设备对象

  CDC MemDC

  //定义位图对象

  CBitmap MemBitmap

  //然后建立一个兼容屏幕显示的内存显示设备。

  //这个时候不能画,因为没地方画了_

  Memdc。CreateCompatibleDC (null/* PDC一般用这个代替NULL */);

  //在下面设置一个与屏幕显示兼容的位图。至于位图的大小,可以使用窗口的大小,也可以自己定义(比如有滚动条的话,应该比当前窗口的大小大,在BitBlt中决定把内存的哪一部分复制到屏幕上)

  MemBitmap。CreateCompatibleBitmap(pDC,nWidth,n height);

  //选择位图到内存显示设备。

  //只选择位图(#add必须是位图?)内存显示设备有地方画,在指定的位图上画。

  CBitmap *pOldBit=MemDC。select object(membit map);

  //先用背景色清空位图,这里我用白色做背景。

  //你也可以使用你应该使用的颜色。

  MemDC。FillSolidRect(0,0,nWidth,nHeight,# ffffff);

  //绘图

  MemDC。move to(……);

  MemDC。line to(……);

  //将内存中的图表复制到屏幕上显示

  pDC- BitBlt(0,0,nWidth,nHeight,MemDC,0,0,src copy);

  //绘制完成后清理

  MemBitmap。delete object();

  MemDC。DeleteDC();

  /////////////////////////////////////////////////////////////////////

  实现GDI双缓存的具体步骤

  下面的代码是最简单的双缓冲模板。您可以根据需要进行简单的修改。

  位图cache image([宽度],[高度]);

  图形cache graphics(cache image);

  //绘制缓存图像

  //.

  //获取窗口的图形对象

  Graphics图形([窗口的HDC]);

  //在窗口上绘制绘制的CacheImage。

  图形。DrawImage( CacheImage,[Left],[Top]);

  根据一些简单的测试,双缓冲可以有效提高图像处理速度。不过最明显的效果还是减少了画面的闪烁。

  另一个(推荐):

  1.在内存中构建“虚拟画布”:

  Bitmap bmp=新位图(600,600);

  2.获取此画布的图形对象指针:

  图形*gBuf=图形。from image(BMP);

  3.在这张记忆画布上画画:

  gBuf-filllellipse(brush,i * 10,j * 10,10,10);

  4.将内存画布绘制到窗口中。

  HDC HDC=GetDC(hwnd);图形g(hdc);g.DrawImage(bmp,0,0,100,200);ReleaseDC(hwnd,hdc);删除gBuf//必不可少,否则会内存泄漏

  另:

  1、在内存中建立一块"虚拟画布":

  位图bmp=新位图(600,600);

  2、获取这块内存画布的制图法引用:

  图形g=图形.来自图片(BMP);

  3、在这块内存画布上绘图:

  g . filllelipse(brush,i * 10,j * 10,10,10);

  4、将内存画布画到窗口中

  this- CreateGraphics().DrawImage(bmp,0,0);

  另外还可以使用缓存位图类来做双缓冲100 .图形也有专门的DrawCachedBitmap方法来描画CachedBitmap。但没有上述的方法灵活。如下:

  *C代码*/

  RECT RC;

  GetClientRect(g_hwnd,RC);

  位图bmp(int(rc.right),int(rc。底部));

  图形BMP图形(BMP);

  位图文件的扩展名(Bitmap)图形SetSmoothingMode(smoothingmodulias);

  /*在位图上绘图*/

  SolidBrush bkBrush(Color(0,0,0));

  位图文件的扩展名(Bitmap)图形FillRectangle( bkBrush,0,0,rc.right,rc。底部);

  /*借鉴DC*/

  图形图形(hdc);

  /*重要!为快速绘图创建缓存位图对象*/

  CachedBitmap cachedBmp( bmp,图形);

  图形DrawCachedBitmap( cachedBmp,0,0);

  以上的绘制代码最区别于网络上其他图形设备接口(图形设备接口)实现的一处就是,在最后添加了一个缓存位图对象用于快速绘制。

  缓存位图是一个包含了位图文件的扩展名全部象素,并且针对制图法所关联的直流电做过特别优化的位图对象。这点可以从其构造参数上看到。

  让微调控件控件嵌入编辑控件里边:

  如图风格

  调整编辑和中国软件协会系统与过程改进分会控件的标签键顺序顺序为相邻,设置中国软件协会系统与过程改进分会的汽车伙伴属性为真实的即可。

  我的函数注释:

  类头文件中用

  //功能说明

  类的卡片打印处理机(卡片打印处理器的缩写)文件中则用:

  //==================================================================================//功能:装载指定皮肤//参数:strPath:皮肤路径//返回值:无//备注//==================================================================================

  图形设备接口(图形设备接口)一些重要区别:

  ReleadDC,是和GetDC()配套使用;而DeleteDC,和时配套使用;

  删除对象,是对用创建_为前缀创建的图形设备接口(图形设备接口)对象使用的。(添加,即分两部分,一部分是疾病控制中心有关,另一部分则CGdiObject有关)比如CreateBitmap(),CreateSolidBrush()等等。

  对话框透明:

  setwindowlong(m_hwnd,gwl_exstyle,getwindowlong(m_hwnd,gwl_exstyle)^0x80000);//0x 80000:WS _ EX _ LAYERED h instance hInst=LoadLibrary( user 32 .DLL’);//显式加载DLL if (hInst!=NULL){ typedef BOOL(WINAPI * my func)(HWND,COLORREF,BYTE,DWORD);//取得SetLayeredWindowAttributes函数指针my func pf unc=(my func)GetProcAddress(hInst, SetLayeredWindowAttributes );if (pFunc!=NULL) { pFunc(m_hWnd,#ece9d8,256,1);//2:LWA _阿尔法}自由图书馆(hInst);hInst=NULL}

mfc入门,mfc基本操作