SelectObject选择画笔问题

嘻嘻AND嘿嘿 2013-07-28 11:46:16
我看孙鑫的视频教程作图的时候遇到这个函数,看了msdn不大明白。
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptBegin=point;//m_ptBegin是类的成员,类型为CPoint

CView::OnLButtonDown(nFlags, point);
}

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));//红色
CClientDC dc(this);
CPen* pOldPen=dc.SelectObject(&pen);//保存原始的CPen,即黑色的CPen
dc.MoveTo(m_ptBegin);
dc.LineTo(point);
dc.SelectObject(pOldPen);//恢复原始的CPen
}

SelectObject返回值为先前的画笔颜色,刚开始画笔为黑色,执行完CPen pen之后画笔为红色,然后执行SelectObject后画笔为黑色,然后作图,那做出来的图应该是黑色的啊?然后执行SelectObject,就是返回黑色之前的颜色?
还有把CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
CClientDC dc(this);这两句代码调换以后,运行的程序会变得非常慢,画一个直线得等半分钟,这是什么原因啊?
...全文
159 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdg3707 2013-07-28
  • 打赏
  • 举报
回复
对,是这样的
嘻嘻AND嘿嘿 2013-07-28
  • 打赏
  • 举报
回复
引用 1 楼 hdg3707 的回复:
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));//红色 CClientDC dc(this); CPen* pOldPen=dc.SelectObject(&pen);//保存原始的CPen,即黑色的CPen 这第三句已把画笔选为红色画笔了,因此下面的画线都是红色的,而不是黑色的,pOldPen是保存原先的画笔,并不是代表当前选择的画笔 至于调换那两句造成画线慢,应该不会这样,你是不是有什么资源用完后没释放,如果是这样,你没调换这两句也会出这种情况,你可以试试出这情况时都是如何操作的,都操作了多长时间
SelectObject的意思就是把当前的画笔选为红色,并且返回原先的画笔吗?
hdg3707 2013-07-28
  • 打赏
  • 举报
回复
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));//红色 CClientDC dc(this); CPen* pOldPen=dc.SelectObject(&pen);//保存原始的CPen,即黑色的CPen 这第三句已把画笔选为红色画笔了,因此下面的画线都是红色的,而不是黑色的,pOldPen是保存原先的画笔,并不是代表当前选择的画笔 至于调换那两句造成画线慢,应该不会这样,你是不是有什么资源用完后没释放,如果是这样,你没调换这两句也会出这种情况,你可以试试出这情况时都是如何操作的,都操作了多长时间
嘻嘻AND嘿嘿 2013-07-28
  • 打赏
  • 举报
回复
引用 4 楼 oYinGui1 的回复:
你这是消息响应,它虽然画完以后换回来了,但是你再次画的时候,它又重新执行消息响应函数了,所以它又选择红色了。
大哥 我问的不是这个问题
嘻嘻AND嘿嘿 2013-07-28
  • 打赏
  • 举报
回复
引用 3 楼 hdg3707 的回复:
对,是这样的
Okay Thank You
Morrisss_ 2013-07-28
  • 打赏
  • 举报
回复
你这是消息响应,它虽然画完以后换回来了,但是你再次画的时候,它又重新执行消息响应函数了,所以它又选择红色了。
#include #include #include #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) { HWND hwnd; MSG Msg; WNDCLASS wndclass; char lpszClassName[] = "基本绘图"; char lpszTitle[]= "My_Drawing"; wndclass.style = 0; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor( NULL, IDC_ARROW) ; wndclass.hbrBackground =(HBRUSH) GetStockObject( WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = lpszClassName ; if( !RegisterClass( &wndclass)) { MessageBeep(0) ; return FALSE ; } hwnd = CreateWindow ( lpszClassName, lpszTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while( GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage(&Msg) ; DispatchMessage(&Msg) ; } return Msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; HPEN hP; //定义画笔句柄 HBRUSH hB; //定义画刷句柄 switch(message) { case WM_PAINT: //通过响应WM_PAINT消息完成绘图工作 hdc=BeginPaint(hwnd,&ps); //取得设备环境句柄 SetMapMode(hdc,MM_TEXT); //设置映射模式 Rectangle(hdc,130,60,270,200); //使用当前画笔绘制矩形并填充 hB=CreateHatchBrush(HS_CROSS,RGB(255,0,0)); //自定义一个红色网格状画刷 SelectObject(hdc,hB); //更新画刷为自定义画刷 Ellipse(hdc,130,70,270,190); //绘制椭圆并填充 hP=CreatePen(PS_DASHDOT,1,RGB(0,255,0)); //宽度为1的绿色画笔,画点划线 SelectObject(hdc,hP); //更新画笔为自定义画笔 MoveToEx(hdc,100,130,NULL); //使用当前画笔绘制轴线 LineTo(hdc,300,130); MoveToEx(hdc,200,30,NULL); LineTo(hdc,200,230); EndPaint(hwnd,&ps); //释放设备环境句柄 DeleteObject(hP); //删除画笔句柄 DeleteObject(hB); //删除黑色画刷句柄 break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); } return 0; }
计算机图形学 VC图形编程 绘制点 绘制点 32位的COLORREF类型值来确定图形颜色值,其结构为0x00bbggrr, bb:代表蓝色值,范围从00到FF; gg:代表绿色值,范围从00到FF; rr:代表红色值,范围从00到FF; 还可以用RGB宏来完成相同的功能: RGB(short red ,short green, short blue) red 代表红色值,范围从0到255; green代表绿色值,范围从0到255; blue代表蓝色值,范围从0到255; 绘制点 void CPixelView::OnDraw(CDC* pDC) { ………… for(int i=0;i<200;i++) pDC->SetPixel(1*i,50,RGB(0,0,255)); for(int j=0;j<200;j++) pDC->SetPixel(2*j,100,(COLORREF)0x0000ff00); for(int m=0;m<200;m++) pDC->SetPixel(3*m,150,(COLORREF)0x000000ff); for(int n=0;n<200;n++) pDC->SetPixel(4*n,200,(COLORREF)0x0000ffff); for(int p=0;p<200;p++) pDC->SetPixel(5*p,250,(COLORREF)0x00ff00ff); for(int s=0;s<200;s++) pDC->SetPixel(6*s,300,(COLORREF)0x00000000); } 使用鼠标绘图 在VC中,鼠标的各种事件(单击鼠标左键,单击鼠标右键,双击鼠标左键,双击鼠标右键,移动鼠标)被作为消息,通过系统自带的消息映射功能,对操作者的不同操作进行响应处理。 使用鼠标绘图 绘制直线 void CCreateLineView::OnLButtonDown(UINT nFlags, CPoint point) { CDC* pDC=GetDC();//获取设备环境 pDC->SelectStockObject(NULL_BRUSH);//空画刷,选取库存的GDI模式 使用鼠标绘图 绘制直线 switch(m_step) { case 0://当第一次单击鼠标左键 m_Startp=m_Endp=point;//确定直线的起点 m_step++;//等待输入直线的终点 break; 使用鼠标绘图 绘制直线 case 1://当第二次单击鼠标左键 m_Endp=point;//确定直线的终点 m_step=-1;//使得再单击鼠标左键均无效 //m_bline=TRUE;//生成直线 DrawLine(pDC,m_Startp,m_Endp);//绘制直线 break; default://为空操作,表示不再绘制新直线; } 使用鼠标绘图 绘制直线 ReleaseDC(pDC);//释放不再使用的DC CView::OnLButtonDown(nFlags, point); } 使用鼠标绘图 绘制直线 void CCreateLineView::DrawLine(CDC *pDC, CPoint start, CPoint end) { pDC->MoveTo(start.x,start.y); pDC->LineTo(end.x,end.y); } 使用鼠标绘图 绘制直线 设置4个成员变量 使用鼠标绘图 绘制直线 设置橡皮筋模式 void CCreateLineView::OnMouseMove(UINT nFlags, CPoint point) { CDC* pDC=GetDC(); int nDrawmode=pDC->SetROP2(R2_NOT);//设置绘图模式:屏幕颜色反色。 pDC->SelectStockObject(NULL_BRUSH); 使用鼠标绘图 绘制直线 设置橡皮筋模式 if(m_step==1&&!m_bline) { CPoint prePnt,curPnt; prePnt=m_Endp;//获得光标所在的前一个位置 curPnt=point; 使用鼠标绘图 绘制直线 设置橡皮筋模式 DrawLine(pDC,m_Startp,prePnt);//绘制橡皮线 DrawLine(pDC,m_Startp,curPnt); m_Endp=point; } pDC->SetROP2(nDrawmode);//恢复先前的绘图模式 ReleaseDC(pDC);//释放DC 与绘图相关的GDI对象类 CBitmap类,CBrush类,CFont类,CPen类 CRgn类,CPalette类。 通常,我们都是使用GDI绘图对象类所创建的对象进行绘制各种图形的, 好象画家手里的画笔,而设备环境就是用什么样的画纸。 CPen 画笔是一种用来画线及绘制有形边框的工具,用户可以指定它的颜色及厚度,并且可以指定它画实线、点线或虚线。 CPen(int nPenStyle,int nWidth,COLORREF crcolor); CPen CPen(int nPenStyle,int nWidth,COLORREF crcolor); nPenStyle: PS_SOLID:实线画笔。 PS_DASH:虚线画笔。 PS_DOT:点线画笔。 PS_DASHDOT:点划线画笔。 CPen CPen(int nPenStyle,int nWidth,COLORREF crcolor); nWidth :指定画笔宽度。 CPen for (int i=0;i<7;i++) { CPen NewPen1(PS_SOLID+i,1,RGB(0,255,0)); CPen *pOldPen=pDC->SelectObject(&NewPen1); pDC->MoveTo(10,20*i+10); pDC->LineTo(700,20*i+10); pDC->SelectObject(pOldPen); } CBrush 画刷定义了一种位图形式的像素,利用它可以对域内部填充颜色。 CBrush(int nIndex,COLORREF crcolor); CBrush CBrush(int nIndex,COLORREF crcolor): nIndex:画刷的阴影线的风格 HS_BDIAGONAL:从左到右向下成45度的对角线。 HS_CROSS:水平线和垂直线相交的十字交叉线。 HS_DIAGCROSS:夹角为45度的斜十字交叉线。 HS_FDIAGONAL:从左到右向上成45度的对角线。 HS_HORIZONAL:水平阴影线。 HS_VERTICAL: 垂直阴影线。 CBrush CBrush NewBrush1(RGB(0,255,0)); CBrush *pOldBrush1=pDC->SelectObject(&NewBrush1); pDC->Rectangle(50,50,200,300); pDC->SelectObject(pOldBrush1); CBrush CBrush NewBrush2(HS_BDIAGONAL,RGB(255,0,0)); CBrush *pOldBrush2=pDC->SelectObject(&NewBrush2); pDC->Rectangle(250,50,400,300); pDC->SelectObject(pOldBrush2); CFont 字体是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当作资源存于磁盘中,其中有一些还依赖于某种设备。 扫描转换矩形 void CFillView::Fillrectangle(CDC *pDC, COLORREF rccolor) { int x,y; for (y=50;y<300;y++) for (x=50;x<200;x++) { pDC->SetPixel(x,y,rccolor); } } 扫描转换矩形 void CFillView::OnLButtonDown(UINT nFlags, CPoint point) { if ((50 < point.x) & (point.x <200) & (50

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧