MFC 笔记

CPen(Int style,int width ,COLORREF color);


style:画笔的样式 


width:画笔的宽度


color:画笔的颜色(颜色用RGB值来描述)




CPen pen1;


CPen *oldPen;


pen1.CreatePen(PS_SOLID,2,RGB(192,192,192));//创建对象


oldPen = pDC->SelectObject(&pen1);//将画笔选入设备描述表,并保存旧的画笔


pDC->MoveTo(10,10);\\定义起点


pDC->LineTo(200,20);\\线的终点


pDC->SelectObject(oldPen);\\将以前的画笔选入设备描述表




CPaintDC dc(this);
 CRect r(100, 100, 200, 200)
 CBrush myBrush;
 myBrush.CreateSolidBrush(RGB(255, 0, 0));//或者myBrush.CreateHatchBrush(HS_CROSS, RGB(55, 0, 0));
 dc.FillRect(&r, &myBrush);




绘图时,如果要填充一个区域中的色彩,
 就得使用画刷,MFC中提供了画刷类CBrush.


    画刷有多种类型。可以分别通过函数
 CreateSolidBrush()//实体的
 CreateHatchBrush()//格子形
 CreateBrushIndirect()//都可以






在mfc工程中控件或者窗口位置的调整是经常遇到的,特别是基于对话框的工程。位置的调整包括坐标、长度和宽度的变化,一般在窗口类的OnSize函数中实现。控件位置的调整涉及的函数有:GetWindowRect()、ScreenToClient()、GetClientRect()、MoveWindow()或SetWindowPos(),功能意义如下:








GetWindowRect():获得窗口在屏幕上的矩形坐标,调整控件位置时必须首先获得该屏幕坐标;








ScreenToClient():转换屏幕坐标到客户区坐标,如果为子窗口,转换后坐标为相对于父窗口的坐标,若为独立窗口,转换后客户区左上坐标为(0,0);调整子窗口时这一步也是必须的;








GetClientRect():获得窗口客户区坐标,左上坐标永远为(0,0);








MoveWindow():调整控件到指定位置;








SetWindowPos():调整控件的位置,该函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:








控件位置调整涉及的参变量有:主窗口的cx、cy坐标、参考点坐标。相对于调整位置时调用的函数,变量稍许复杂些。cx、cy坐标为主窗口的宽和高,有OnSize的参数给出,为窗口控件调整提供了变化的范围,所有的控件为了能够正常显示都不能超出这个范围。其实在开发过程中较难和重要的是参考控件的选择,其位置相对于主窗口来说必须好确定。常用的策略:








1.  选择主窗口上位置不随窗口大小变化的控件为参考;








2.  选择主窗口上控件的宽或者高固定的控件;








3.  选择与主窗口满足固定坐标关系的控件 ;








4.  选择主窗口上控件位置或者高宽容易确定的控件。








以上四种策略可在实际开发中作为参考!不管遇到什么的情况,一定要清楚:选择一个








+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


 
MFC如何获取控件在对话框上的位置坐标


2010-09-13 20:20






本来希望的效果是在对话框上设置两个picture控件,分别显示两幅图像,然后将两幅图像中的相似部分利用一条直线连接起来。要实现这样的效果需要知道相似位置在这两幅图中的坐标以及这两个控件在对话框上的坐标,然后通过加减运算就可以得到图像上的相似区域在对话框的坐标,直接将这两个坐标用直线连接就可以了。                                                                                


为此,如何获得控件在对话框上的坐标是关键问题。编写了如下的测试小程序,目的是将两个picture控件中的点用直线连接起来,比较直观的是picture控件的四个角,所以程序中是将控件的拐角连接起来。首先在对话框上并排放置两个同样大小的picture控件,将他们的标识分别设成IDC_LEFT和IDC_RIGHT,然后添加两个编辑框用于显示picture控件的大小,给这两个编辑框添加相应的数据成员m_row和m_colume。添加一个按钮用于连接picture控件中的点,为这个按钮添加成员函数OnMatch() 。


void CControlDlg::OnMatch() 
{
// TODO: Add your control notification handler code here
CRect rectL,rectR;
GetDlgItem(IDC_LEFT)->GetWindowRect(&rectL);//获取控件相对于屏幕的位置
ScreenToClient(rectL);//转化为对话框上的相对位置
GetDlgItem(IDC_RIGHT)->GetWindowRect(&rectR);//获取控件相对于屏幕的位置
ScreenToClient(rectR);//转化为对话框上的相对位置
m_row=rectL.bottom-rectL.top;
m_colume=rectL.right-rectL.left;
UpdateData(FALSE);


CClientDC dc(this);
dc.MoveTo(rectL.left,rectL.top);
dc.LineTo(rectR.right,rectR.bottom);
dc.MoveTo(rectL.right,rectL.top);
dc.LineTo(rectR.left,rectR.bottom);


dc.MoveTo(rectL.left+m_colume/2,rectL.top+m_row/2);//连接两个控件中心点
dc.LineTo(rectR.left+m_colume/2,rectR.top+m_row/2);








设置位置可以使用setWindowPos
 但是并没有函数GetWindowPos获取位置


 可以通过一下方法获得
 相关函数
 GetClientRect(); //获得client区域
 GetWindowRect(); //获取window区域
 ScreenToClient(); //相互转换
 ClientToScreen();


 由于GetClientRect()获得的区域不包括位置,得到的rect的left,top必然为0
 而GetWindowRect();获得的区域包括位置,但会发现获得值不准确,应该是加上了窗体边界。(!!不确定)


 正确方法:
 CRect rt;
 GetWindowRect(&rt); //获得window区域
 ScreenToClient(&rt); //转到client


SetWindowPos 函数
SetWindowPos函数改变一个子窗口,弹出式窗口或顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。
x指定了窗口左边的新位置。
y指定了窗口顶部的新位置。
cx指定了窗口的新宽度。
cy指定了窗口的新高度。
nFlags指定了大小和位置选项。这个参数可以是下列值的组合:
SWP_DRAWFRAME 围绕窗口画出边框(在创建窗口的时候定义)。
SWP_FRAMECHANGED 向窗口发送一条WM_NCCALCSIZE消息,即使窗口的大小不会改变。如果没有指定这个标志,则仅当窗口的大小发生变化时才发送WM_NCCALCSIZE消息。
SWP_HIDEWINDOW 隐藏窗口。
SWP_NOACTIVATE 不激活窗口。如果没有设置这个标志,则窗口将被激活并移动到顶层或非顶层窗口组(依赖于pWndInsertAfter参数的设置)的顶部。
SWP_NOCOPYBITS 废弃这个客户区的内容。如果没有指定这个参数,则客户区的有效内容将被保存,并在窗口的大小或位置改变以后被拷贝回客户区。
SWP_NOMOVE 保持当前的位置(忽略x和y参数)。
SWP_NOOWNERZORDER 不改变拥有者窗口在Z轴次序上的位置。
SWP_NOREDRAW 不重画变化。如果设置了这个标志,则不发生任何种类的变化。这适用于客户区、非客户区(包括标题和滚动条)以及被移动窗口覆盖的父窗口的任何部分。当这个标志被设置的时候,应用程序必须明确地无效或重画要重画的窗口和父窗口的任何部分。
SWP_NOREPOSITION 与SWP_NOOWNERZORDER相同。
SWP_NOSENDCHANGING 防止窗口接收WM_WINDOWPOSCHANGING消息。
SWP_NOSIZE 保持当前的大小(忽略cx和cy参数)。
SWP_NOZORDER 保持当前的次序(忽略pWndInsertAfter)。
SWP_SHOWWINDOW 显示窗口。


 





猜你喜欢

转载自blog.csdn.net/syb198810/article/details/80713382
MFC
今日推荐