MFC对话框编程杂谈

  1. 区分BITMAP、CBitmap和HBITMAP

    ①BITMAP
      BITMAP是一个结构体,封装着bitmap的一些信息。定义了逻辑位图的宽高、颜色格式和位值。
    ②CBitmap
      CBitmap是MFC中封装bitmap的类,包含着被位图的属性和对位图的操作。
    ③HBITMAP
      HBITMAP是bitmap的句柄,也就是bitmap资源的标识。
    ④三者的联系
      通过CBitmap类的attach操作,可以将代表Windows资源的HBITMAP对象关联到CBitmap对象;
      通过CBitmap类的GetBitmap操作,可以得到CBitmap对象中封装的bitmap成员;
      通过CBitmap类的GetSafeHandle操作,可以得到CBitmap对象所关联的代表Windows资源的HBITMAP对象。

  2. 在控件上绘图
      可以在对话框资源中放置图片控件,并对其类型属性选Frame。可在对话框的绘图消息响应函数OnPaint或其他函数中,用CWnd类的函数GetDlgItem:CWnd* GetDlgItem( int nID ) const;来获得图片控件的窗口对象,再用函数GetDC:CDC* GetDC( );由窗口对象得到DC,然后就可以用该DC在控件中画图。
      CWnd *pWin = GetDlgItem(IDC_HUESAT);
      CDC *pDC = pWin->GetDC();
      pDC->SetPixel(i, j, RGB(r, g, b));
      在非Frame类静态控件上绘图,必须先按顺序依次调用CWnd类的Invalidate和UpdateWindow函数后,再开始用DC画图。如在一个ID为IDC_COLOR的按钮上绘图:
      CWnd* pWnd = GetDlgItem(IDC_COLOR);
      CDC* pDC = pWnd->GetDC();
      CRect rect;
      pWnd->GetClientRect(&rect);
      pWnd->Invalidate();
      pWnd->UpdateWindow();
      pDC->FillRect(&rect, new CBrush(m_crCol));
      一般的对话框类,缺省时都没有明写出OnPaint函数。可以自己在对话框类中添加WM_PAINT消息的响应函数OnPaint来进行一些绘图工作。
    为了在鼠标指向按钮时,让按钮上自己绘制的图形不被消去,可以设置按钮控件的“Owner Draw”属性为“True”。
      如果希望非按钮控件(如图片控件和静态文本等),也可以响应鼠标消息(如单击、双击等),需要设置控件的“Notify”属性为“True”。
      使用OnPaint函数在对话框客户区的空白处(无控件的地方)绘制自己的图形,必须屏蔽掉其中缺省的对对话框基类的OnPaint函数的调用。
      如果让控件大小适应图片大小可以用SizeToContent()函数。

  3. MFC中获取按钮控件的尺寸的方法:
      CRect rectTemp; GetDlgItem(IDC_BUTTON1)->GetWindowRect(rectTemp);
      该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。left ;top; right;bottom;分别表示该窗口的/左侧/顶部/右侧/底部坐标。

  4. 图像控制的建立也包括两个步骤,首先建立图像列表结构,然后建立图像列表控制。
      构造CImageList对象,调用其Create函数的一个重载来创建图像列表并将图像列表附加到CImageList对象;如果在创建图像列表时没有添加图像,则调用Add或Read成员函数向图像列表添加图像;通过调用控件的适当成员函数,将图像列表与此控件相关联。图像控制的属性类包括返回m_hImageList.控制句柄GetSafeHandle、取得图像列表中的图像数量GetImageCount、设置图像列表的背景颜色SetBkColor、取得图像列表的背景颜色GetBkColor和取得图像的有关信息SetBkColor。

  5. MFC单文本结构中通过菜单弹出新对话框:
    ①在资源中建立新对话框
    ②在ClassView为新对话框添加类,如Cdlg1,同时自动生成文件dlg1.h,dlg1.cpp
    ③在菜单中添加对话框子菜单,并在ClassView为该项添加相应的消息响应函数
    ④在建立响应函数所在的文件前加入#include 'dlg1.h’头文件
    ⑤在相应响应函数里添加代码Cdlg1 ss; ss.DoModal();

  6. CPaintDC 、CWindowDC、 CClientDC、 CDC的区别与联系

    ①CPaintDC 无效区dc, 相当于BeginPaint, EndPaint
    ②CClientDC 客户区dc,相当于GetDC, ReleaseDC
    ③CWindowDC 整个窗口dc,相当于GetWindowDC, ReleaseDC
    ④CDC 任何dc,相当于CreateDC, DeleteDC

      CPaintDC对象通常响应WM_PAINT消息时,在OnPaint消息处理函数中被使用。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。
      CClientDC(客户区设备上下文)用于客户区的输出,它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数。一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。CClientDC用于窗口的客户区(不包括标题栏、边框)。
      CwindowDC是从CDC类继承,用于得到桌面窗口设备环境指针。CwindowDC用于整个窗口,包括非客户区。

  7. 全局变量,全局静态变量,局部变量,局部静态变量区别
      全局变量:作用于所有源文件,整个程序周期。在某个类执行文件的所有函数外定义,每次使用时,在需要使用的地方加注extern ,变量类型,变量名声明一下即可使用。注意不要在头文件里声明。
      全局静态变量,作用范围限于定义这个变量的执行文件中,整个程序周期。
      局部变量:作用于定义它的函数内,函数返回时,该变量销毁。
      局部静态变量:作用于定义它的函数内,函数返回时,该变量仍然存在,下次直接使用该值。

  8. 单文本文档页显示内容
      在CXXXXView类的OnDraw函数中进行显示内容的编写,有两种方法:
      ① 用客户区指针,将函数改写成void CXXXView::OnDraw(CDC* pDC) pDC->TextOutW();
      ② 用客户区对象,在函数中添加CClientDC dc(this); dc. TextOutW();
    客户区文字显示可用TextOutW()函数,数字显示可用Formate()函数将数字写进字符串再进行显示。但TextOut只支持单行输出,不支持换行。DrawText支持在矩形框内换行,进行多行输出。

  9. 让int类型控件默认不显示0:可在对话框初始化时用SetDlgItemTextW(IDC_XXX,_T(“”));语句将该控件初始化为空。

  10. 使用指针需注意:
      使用前不光要定义,还一定要初始化赋值,让其指向一个有意义的空间才可使用。可以通过new的方法让指针指向一片新空间,也可以通过给指针变量赋一个明确的地址值的方法。否则运行时会报错指针访问冲突。

  11. 如需重绘客户区,只需在该类中调用Invalidate();函数即可。如需关闭对话框重绘,可以在创建对话框的语句下加Invalidate();,即可在关闭对话框时重绘。

  12. 创建摸态对话框:主要利用DoModal()函数
      在当前的工程中,利用对话框模板添加需要显示的对话框,并为其添加类CModalDlg,主框架的程序文件包含该类的头文件,再将主框架上对应的菜单响应函数OnModal编辑如下:CModalDlg dlg; dlg.DoModal();

  13. 创建非模态对话框:主要利用Create()函数
      在当前的工程中,利用对话框模板添加需要显示的对话框,并为其添加类CModallessDlg,主框架的程序文件包含该类的头文件,再将主框架上对应的菜单响应函数OnModalessl编辑如下:
      CModallessDlg*pdlg;
      pdlg=new CModallessDlg();
      pdlg->Create(IDD_MODALLESS);
      pdlg->ShowWindow(SW_SHOW);
      关闭窗口时,利用类向导响应类CModallessDlg的消息WM_NCDESTROY,函数名为OnNcDestroy,编辑如下:
      CDialogEx::OnNcDestroy();
      delete this;
      对于非模态对话框的编程必须重载OnOK和OnCancel函数,取消调用基类函数,添加销毁非模态对话框窗口语句:DestroyWindow();

  14. 改变字体颜色。
      CFont类,以及LOGFONT逻辑字体结构中都不包含字体颜色的成员变量。要想改变字体颜色需要自定义COLORREF类型对象传递字体颜色。例如先用CFontDialog字体选择通用对话框的对象得到字体颜色,  COLORREF m_color;
      CFontDialog fontDlg;
      m_color=fontDlg.GetColor();
      然后再在需要显示的地方设置输出字体颜色:
      CClientDC dc(this);
      dc.SetTextColor(m_color);

  15. 打开文件通用对话框的使用。
      首先创建CFileDialog类的对象filedialog,true为打开文件对话框,false为保存文件对话框,然后调用DoModal()成员函数创建该对话框,进而可以使用其他成员函数来进行获取文件名及路径。例如:
      GetFileExt():获得选定文件的后缀名。
      GetFileName():获得选定文件的名称,包括后缀名。
      GetFileTitle():获得选定文件的标题,即不包括后缀名。
      GetFolderPath():获得选定文件的目录。
      GetNextPathName():获得下一个选定的文件的路径全名。
      GetPathName():获得选定文件的路径全名。
      CFileDialog可用于创建通用对话框及获取文件名和路径,其他关于文件的操作则多用CFile类完成,比如获取文件状态以及读写。

  16. 对话框间通信通常有全局变量,对象访问,发送消息等方法。
      父对话框和模态子对话框之间传递可用对象访问的方法。父对话框的值传给非模态子对话框可以用对象访问方法,非模态子对话框的值传递给父对话框可以用发送消息或利用父对话框指针。例如:
      C父类名 * parent = (C父类名 *)GetParent();
      parent->m_parentnum=m_subnum;

  17. 指针应用基本流程。①定义指针②将指针初始化为NULL③判断指针释放为空,若不为空,则删除指针,使其指向空④给指针new一片空间,最后进行使用。

  18. MFC中load图片路径名都用双\\间隔。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值