[乱]mfc与sdk笔记[七]
关于绘图?各类对话框…
写到第七篇,发现一些理念,差异变得越来越小了。在预测教程进行下一步操作所需要的代码也更加准确。但是绝不是当初刚学的时候所用的理念。对于Windows程序其实只有一个解释,消息决定一切,一切源于消息,你不用找它,它会找你,msdn是万能的。最后也很容易发现,其实体力活比什么都多,什么算法什么数据结构的,在一般程序几乎用不着,用得到的只有逻辑。所以之前看一些看来很牛x的程序,现在在我看来也不过如此,毕竟大多体力活和美工的事情。真正的程序我觉得应该像topboy那种在ACM做题的。算法,数据结构结合的艺术,对待代码,就应该像艺术品一样对待。所以基础的重要性…
- 颜色对话框:CColorDialog
字体对话框:CFontDialog- //获取选择颜色
- COLORREF m_clr; //颜色
- CColorDialog dlg;
- if(IDOK==dlg.DoModal())
- {
- m_clr = dlg.m_cc.rgbResult;
- }
- //字体获取
- CString str = CFontdlg.m_cf.lpLogFont->lfFaceName;
- 消息WM_CTLCOLOR,当控件将要被绘制的时候会发送一个这样的消息给父窗口,来绘制正确的颜色。
- //增加一个CBrush成员变量
- m_brush.CreateSoldBrush(RGB(0,0,255); //画刷初始化
- OnCtlColor(CDC *pDC,CWnd* pWnd,UINT nCtlColor)
- {
- //可以判断是哪个控件
- if(pWnd->GetDlgCtrlID()==IDC_XXX)//返回子控件或者子窗口id
- {
- pDC->SetTextColor(RGB(255,0,0));//现在的pDC就是它的DC了。
- pDC->SetBkMode(TRANSPARENT);//设置透明背景
- return m_brush; //这样就只改变一个该ID的控件或者窗口的颜色了。
- }
- }
- 要改变button样式,需要先创建一个CButton类,然后增加虚函数DrawItem,再给按钮关联变量,可以重写这个来增加更多功能以及样式。详情参观MSDN的DrawItem。还需要设置属性。
- 窗口中贴图:
- //1.创建位图
- CBitmap bitmap;
- bitmap.LoadBitmap(IDB_BITMAP);
- //2.创建兼容DC
- CDC dcCompatible;
- dcCompatible.CreateCompatibleDC(pDC);
- //3.将位图选到兼容DC中
- dcCompatible.SelectObject(&bitmap);
- //4.将兼容DC中的位图贴到当前DC中
- Pdc->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
- BITMAP bitmap;
- GetBitmap(&bitmap); //获得图片信息
- StretchBit();//可以压缩或者拉伸位图
- 消息:WM_ERASEBKGND
当窗口的背景需要擦除的时候响应消息。 -
- GetDescendantWindow();//获得指定id的子控件指针
- 添加启动画面…添加组件Splash screen就好了。
-
- //透明画刷
- CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSh));
- dc.SelectObject(pBrush);
- CPtrArr 支持void指针的指针集合类,使用参考MSDN。
- 凡是用new构建的对象都是分配到堆内存里面的。
- 增加卷轴。View类派生于CScrollView。
- 坐标系空间解释:
Microsoft Windows下的程序运用坐标空间和转换来对图形输出进行缩放、旋转、平移、斜切和反射。
一个坐标空间是一个平面的空间,通过使用两个相互垂直并且长度相等的轴来定位二维对象。
Win32应用程序设计接口(API)使用四种坐标空间:世界坐标系空间、页面空间、设备空间、和物理设备空间。应用程序运用世界坐标系空间对图形输出进行旋转、斜切或者反射。
Win32 API把世界坐标系空间和页面空间称为逻辑空间;最后一种坐标空间(即物理设备空间)通常指应用程序窗口的客户区;但是它也包括整个桌面、完整的窗口(包括框架、标题栏和菜单栏)或打印机的一页或绘图仪的一页纸。物理设备的尺寸随显示器、打印机或绘图仪所设置的尺寸而变化。
如要在物理设备上绘制输出,Windows把一个矩形区域从一个坐标空间拷贝到(或映射到)另一个坐标空间,直至最终完整的输出呈现在物理设备上(通常是屏幕或打印机) 。
如果该应用程序调用了SetWorldTransform函数,那么映射就从应用程序的世界坐标系空间开始;否则,映射在页面空间中进行。在Windows把矩形区域的每一点从一个空间拷贝到另一个空间时,它采用了一种被称作转换的算法,转换是把对象从一个坐标空间拷贝到另一个坐标空间时改变(或转变)这一对象的大小、方位、和形态,尽管转换把对象看成一个整体,但它也作用于对象中的每一点或每条线。 - 逻辑坐标和设备坐标
- 几乎在所有的GDI函数中使用的坐标值都是采用的逻辑单位。Windows必须将逻辑单位转换为“设备单位”,即像素。这种转换是由映射方式、窗口和视口的原点以及窗口和视口的范围所控制的。
- Windows对所有的消息(如WM_SIZE、WM_MOUSEMOVE、WM_LBUTTONDOWN、WM_LBUTTONUP),所有的非GDI函数和一些GDI函数(例如GetDeviceCaps函数),永远使用设备坐标。
- “窗口”是基于逻辑坐标的,逻辑坐标可以是象素、毫米、英寸等单位;“视口”是基于设备坐标(象素)的。通常,视口和客户区是相同的。
- 缺省的映射模式为MM_TEXT。在这种映射模式下,逻辑单位和设备单位相同。
8月 5th, 2007 at 3:34 下午
呵呵, 算法和数据结构是基础, 也是一个方向, 当然开发也是一个方向
只是我现在觉得选把基础打好, 这些基础是进入大公司的前提.
8月 5th, 2007 at 5:53 下午
没错~~
我也是这么想的哈.基础很重要,写出优秀程序的前提~