1 /*******************使用默认画笔对象**************************** 2 // 3 //绘制矩形 4 pDC->MoveTo(50, 50); //返回值是一个指向先前位置的CPoint对象,它比结构Point对象多了一些成员函数 5 pDC->LineTo(50, 200);//此时当前位置也变为(50, 200) 6 pDC->LineTo(150, 200); 7 pDC->LineTo(150, 50); 8 pDC->LineTo(50, 50); 9 10 //Arc函数的两个重载版本---Arc函数对当前位置没有影响 11 //Arc不涉及画刷,可以绘制椭圆的任意一段弧 12 pDC->Arc(50, 50, 150, 150, 100, 50, 150, 100); //注意起点到终点是按照逆时针绘制的 13 CRect* pRect = new CRect(250, 50, 300, 100); 14 CPoint Start(275, 100); 15 CPoint End(250, 75); 16 pDC->Arc(pRect, Start, End); 17 delete pRect; 18 ****************************************************************/ 19 20 /*******************使用自定义的CPen画笔对象**************************** 21 CPen aPen; 22 if(aPen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0))) 23 { 24 //要使用画笔,必须把它选入正在绘图的设备环境中 25 CPen* oldPen = pDC->SelectObject(&aPen); //参数是指向画笔对象的指针,同时返回一个指向先前画笔对象的指针 26 pDC->Arc(50, 50, 150, 150, 100, 50, 150, 100); 27 CRect* pRect = new CRect(250, 50, 300, 100); 28 CPoint Start(275, 100); 29 CPoint End(250, 75); 30 pDC->Arc(pRect, Start, End); 31 delete pRect; 32 pDC->SelectObject(oldPen); //恢复先前的画笔 33 } 34 ****************************************************************/
selectObject与selectStockObject区别:
SelectStockObject选择的是系统预定义的GDI对象
SelectObject选择你自己自定义的的GDI对象
说白了,Stock Object就系统已创建好的,大家共用,不用你去delete,你也delete不了而你自己建的东东,用完后要从HDC中选出来(选出也 用 SelectObject),delete掉,否则致使资源泄露!
对于使用库存画刷,然后在完成绘图后恢复以前的画刷这样一种情况,典型的编码方式是:
1 CBrush* pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH); 2 3 // draw something... 4 5 pDC->SelectObject(pOldBrush); //Restore the old brush 6 7 /* 8 标注1: 9 7种标准画刷都由预定义的符号常量标示 10 GRAY_BRUSH 灰色 11 BLACK_BRUSH 黑色 12 HOLLOW_BRUSH 中空的,凹的 13 LTGRAY_BRUSH 浅灰色 14 WHITE_BRUSH 白色 15 NULL_BRUSH 空画刷 16 DKGRAY_BRUSH 深灰色 17 标注2: 18 上边的函数返回值是一个CGdiObject*类型的指针,但是需要将其进行强制类型转换以便可以选择以前的对象并恢复它,这是因为对于选择的每一种对象,SelectObject() 函数都将被重载,任何版本的SelectObject()函数都不接受指向以CGdiObject对象为参数的指针,但是有一些可以接受CBrush*、CPen*的参数,以及指向其他GDI对象的指针。 19 */
获取窗口大小和改变窗口大小的函数
1 void CTestDlg::OnBnClickedBtnChange() 2 { 3 // 变换按钮的Caption 4 CString str; 5 if( GetDlgItemText( IDC_BTN_CHANGE, str ), str == "收缩<<" ) 6 { 7 SetDlgItemText( IDC_BTN_CHANGE, _T("扩展>>") ); 8 } 9 else 10 { 11 SetDlgItemText( IDC_BTN_CHANGE, _T("收缩<<") ); 12 } 13 // 获取原来对话框和改变后的对话框的大小 14 static CRect rectLarge; 15 static CRect rectSmall; 16 if( rectLarge.IsRectNull() ) // 第一次点击该按钮时获取大小即可 17 { 18 CRect rectSeparator; // 利用添加的分割线(用picture control控件设置sunken属性为ture实现的)获取切割的位置 19 GetWindowRect( rectLarge ); 20 GetDlgItem( IDC_SEPARATOR ) -> GetWindowRect( rectSeparator ); 21 rectSmall.left = rectLarge.left; 22 rectSmall.right = rectSeparator.right; 23 rectSmall.top = rectLarge.top; 24 rectSmall.bottom = rectLarge.bottom; 25 } 26 27 // 改变对话框的大小 28 if( str == "收缩<<" ) 29 { 30 SetWindowPos( NULL, 0, 0, rectSmall.Width(), rectSmall.Height(), SWP_NOMOVE | SWP_NOZORDER ); 31 // 最后一个参数的意思是忽略前边两个设置的参数值,保持窗口的位置和重叠多个窗口时此窗口的Z方向次序不变 32 } 33 else 34 { 35 SetWindowPos( NULL, 0, 0, rectLarge.Width(), rectLarge.Height(), SWP_NOMOVE | SWP_NOZORDER ); 36 } 37 }
窗口创建之后如何修改窗口外观风格---SetClassLong函数的使用:
1、修改窗口图标是在框架类的OnCreate函数return语句之前调用以下语句,将窗口的图标编程系统错误提示图标:
SetClassLong( m_hWnd, GCL_HICON, (LONG)LoadIcon(NULL, IDI_ERROR) );
2、修改窗口的北京色和光标在视类的OnCretate函数的return语句之前调用以下语句(视类的WM_CREATE相应函数OnCreate函数要自己添加),将改变窗口背景和光标
1 SetClassLong( m_hWnd, GCL_HBRBACKGROUND, (LONG)GetStockObject(BLACK_BRUSH) ); 2 SetClassLong( m_hWnd, GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_NO) );
3、可以利用此函数实现框架图标的动态变换,可以将图标句柄存入数组,然后在框架类的OnCreate函数中设置定时器,用定时器响应函数OnTimer函数中通过SetClassLong函数实现图标的动态变换;