[乱]mfc与sdk笔记[七]

关于绘图?各类对话框…
写到第七篇,发现一些理念,差异变得越来越小了。在预测教程进行下一步操作所需要的代码也更加准确。但是绝不是当初刚学的时候所用的理念。对于Windows程序其实只有一个解释,消息决定一切,一切源于消息,你不用找它,它会找你,msdn是万能的。最后也很容易发现,其实体力活比什么都多,什么算法什么数据结构的,在一般程序几乎用不着,用得到的只有逻辑。所以之前看一些看来很牛x的程序,现在在我看来也不过如此,毕竟大多体力活和美工的事情。真正的程序我觉得应该像topboy那种在ACM做题的。算法,数据结构结合的艺术,对待代码,就应该像艺术品一样对待。所以基础的重要性…

  1. 颜色对话框:CColorDialog
    字体对话框:CFontDialog

    1. //获取选择颜色
    2.             COLORREF m_clr; //颜色
    3.         CColorDialog dlg;
    4.         if(IDOK==dlg.DoModal())
    5.         {
    6.                   m_clr = dlg.m_cc.rgbResult;
    7.          }
    8.  
    9.          //字体获取
    10.          CString str = CFontdlg.m_cf.lpLogFont->lfFaceName;
  2. 消息WM_CTLCOLOR,当控件将要被绘制的时候会发送一个这样的消息给父窗口,来绘制正确的颜色。
    1. //增加一个CBrush成员变量
    2.     m_brush.CreateSoldBrush(RGB(0,0,255);        //画刷初始化
    3.     OnCtlColor(CDC *pDC,CWnd* pWnd,UINT nCtlColor)
    4.     {
    5.     //可以判断是哪个控件
    6.     if(pWnd->GetDlgCtrlID()==IDC_XXX)//返回子控件或者子窗口id
    7.     {
    8.         pDC->SetTextColor(RGB(255,0,0));//现在的pDC就是它的DC了。
    9.         pDC->SetBkMode(TRANSPARENT);//设置透明背景
    10.         return m_brush;    //这样就只改变一个该ID的控件或者窗口的颜色了。
    11.         }
    12.        
    13.     }
  3. 要改变button样式,需要先创建一个CButton类,然后增加虚函数DrawItem,再给按钮关联变量,可以重写这个来增加更多功能以及样式。详情参观MSDN的DrawItem。还需要设置属性。
  4. 窗口中贴图:
    1. //1.创建位图
    2.     CBitmap bitmap;
    3.     bitmap.LoadBitmap(IDB_BITMAP);
    4.  
    5.     //2.创建兼容DC
    6.     CDC dcCompatible;
    7.     dcCompatible.CreateCompatibleDC(pDC);
    8.  
    9.     //3.将位图选到兼容DC中
    10.     dcCompatible.SelectObject(&bitmap);
    11.  
    12.     //4.将兼容DC中的位图贴到当前DC中
    13.     Pdc->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
    14.  
    15.         BITMAP bitmap;
    16.          GetBitmap(&bitmap);     //获得图片信息
    17.  
    18.            StretchBit();//可以压缩或者拉伸位图
  5. 消息:WM_ERASEBKGND
    当窗口的背景需要擦除的时候响应消息。
    1. GetDescendantWindow();//获得指定id的子控件指针
  6. 添加启动画面…添加组件Splash screen就好了。
    1. //透明画刷
    2.         CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSh));
    3.         dc.SelectObject(pBrush);
  7. CPtrArr 支持void指针的指针集合类,使用参考MSDN。
  8. 凡是用new构建的对象都是分配到堆内存里面的。
  9. 增加卷轴。View类派生于CScrollView。
  10. 坐标系空间解释:
    Microsoft Windows下的程序运用坐标空间和转换来对图形输出进行缩放、旋转、平移、斜切和反射。
    一个坐标空间是一个平面的空间,通过使用两个相互垂直并且长度相等的轴来定位二维对象。
    Win32应用程序设计接口(API)使用四种坐标空间:世界坐标系空间、页面空间、设备空间、和物理设备空间。应用程序运用世界坐标系空间对图形输出进行旋转、斜切或者反射。
    Win32 API把世界坐标系空间和页面空间称为逻辑空间;最后一种坐标空间(即物理设备空间)通常指应用程序窗口的客户区;但是它也包括整个桌面、完整的窗口(包括框架、标题栏和菜单栏)或打印机的一页或绘图仪的一页纸。物理设备的尺寸随显示器、打印机或绘图仪所设置的尺寸而变化。
    如要在物理设备上绘制输出,Windows把一个矩形区域从一个坐标空间拷贝到(或映射到)另一个坐标空间,直至最终完整的输出呈现在物理设备上(通常是屏幕或打印机) 。
    如果该应用程序调用了SetWorldTransform函数,那么映射就从应用程序的世界坐标系空间开始;否则,映射在页面空间中进行。在Windows把矩形区域的每一点从一个空间拷贝到另一个空间时,它采用了一种被称作转换的算法,转换是把对象从一个坐标空间拷贝到另一个坐标空间时改变(或转变)这一对象的大小、方位、和形态,尽管转换把对象看成一个整体,但它也作用于对象中的每一点或每条线。

  11. 逻辑坐标和设备坐标
    1. 几乎在所有的GDI函数中使用的坐标值都是采用的逻辑单位。Windows必须将逻辑单位转换为“设备单位”,即像素。这种转换是由映射方式、窗口和视口的原点以及窗口和视口的范围所控制的。
    2. Windows对所有的消息(如WM_SIZE、WM_MOUSEMOVE、WM_LBUTTONDOWN、WM_LBUTTONUP),所有的非GDI函数和一些GDI函数(例如GetDeviceCaps函数),永远使用设备坐标。
    3. “窗口”是基于逻辑坐标的,逻辑坐标可以是象素、毫米、英寸等单位;“视口”是基于设备坐标(象素)的。通常,视口和客户区是相同的。
    4. 缺省的映射模式为MM_TEXT。在这种映射模式下,逻辑单位和设备单位相同。

Tags: ,

在 “[乱]mfc与sdk笔记[七]”2个评论了都

  1. TopBoy Says:

    呵呵, 算法和数据结构是基础, 也是一个方向, 当然开发也是一个方向
    只是我现在觉得选把基础打好, 这些基础是进入大公司的前提.

  2. mrzenix Says:

    没错~~
    我也是这么想的哈.基础很重要,写出优秀程序的前提~

打开了评论功能,但是需要被审核,所以请耐心等待。