
CDC pDC = GetDC();
pDC->MoveTo(100,100);// 线的起点
pDC->LineTo(200,200);// 线的终点
ReleaseDC(pDC);
在MFC中的对话框应用程序中,你指定的消息中,加入上面的代码,可以绘制一条点100,100到200,200的直线
如果是在WM_PAINT消息中,则使用
CPaintDC dc(this);pDCMoveTo(100,100);// 线的起点
pDCLineTo(200,200);// 线的终点
想要在MFC中绘图,就要去学习GDI或者是GDIPlus都行
MFC的不清楚,用OPENGL
#include <windowsh>
#include <GL/glh>
#include <GL/glauxh>
int main(int argc, char argv)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
auxInitPosition (0, 0, 500, 500);
auxInitWindow (argv[0]);
glClearColor (00, 00, 00, 00); //置背景色为黑色
glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓冲区
glColor3f(10, 10, 10); //设置象素颜色为白色
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-10, 10, -10, 10, -10, 10);
glBegin(GL_POINTS);
glVertex2f(-05, -05);
glVertex2f(-05, 05);
glVertex2f(05, 05);
glVertex2f(05, -05);
glEnd();
glFlush();
}
在VC60 上运行正常,有三个库要自己加上,不知道对你有没有帮助,opengl的资料还是比较多的。
//PS_DASH菜单项处理函数
void CDrawTestView::OnPenDash()
{
// TODO: Add your command handler code here
m_PenStyle = PS_DASH;
this->SetMenuItemCheck(0,0,7,1);
}
//PS_DOT菜单项处理函数
void CDrawTestView::OnPenDot()
{
// TODO: Add your command handler code here
m_PenStyle = PS_DOT;
this->SetMenuItemCheck(0,0,7,2);
}
//PS_DASHDOT菜单项处理函数
void CDrawTestView::OnPenDashdot()
{
// TODO: Add your command handler code here
m_PenStyle = PS_DASHDOT;
this->SetMenuItemCheck(0,0,7,3);
}
//PS_DASHDOTDOT菜单项处理函数
void CDrawTestView::OnPenDashdotdot()
{
// TODO: Add your command handler code here
m_PenStyle = PS_DASHDOTDOT;
this->SetMenuItemCheck(0,0,7,4);
}
//PS_NULL菜单项处理函数
void CDrawTestView::OnPenNull()
{
// TODO: Add your command handler code here
m_PenStyle = PS_NULL;
this->SetMenuItemCheck(0,0,7,5);
}
//PS_INSIDEFRAME菜单项处理函数
void CDrawTestView::OnPenInsideframe()
{
// TODO: Add your command handler code here
m_PenStyle = PS_INSIDEFRAME;
this->SetMenuItemCheck(0,0,7,6);
}
//宽度1菜单项处理函数
void CDrawTestView::OnPen1()
{
// TODO: Add your command handler code here
m_PenWidth = 1;
this->SetMenuItemCheck(0,1,4,0);
}
//宽度3菜单项处理函数
void CDrawTestView::OnPen3()
{
// TODO: Add your command handler code here
m_PenWidth = 3;
this->SetMenuItemCheck(0,1,4,1);
}
//宽度5菜单项处理函数
void CDrawTestView::OnPen5()
{
// TODO: Add your command handler code here
m_PenWidth = 5;
this->SetMenuItemCheck(0,1,4,2);
}
//宽度7菜单项处理函数
void CDrawTestView::OnPen7()
{
// TODO: Add your command handler code here
m_PenWidth = 7;
this->SetMenuItemCheck(0,1,4,3);
}
//画笔颜色下黑色菜单项处理函数
void CDrawTestView::OnPenBlack()
{
// TODO: Add your command handler code here
m_PenColor = RGB(0,0,0);
this->SetMenuItemCheck(0,2,4,0);
}
//画笔颜色下红色菜单项处理函数
void CDrawTestView::OnPenRed()
{
// TODO: Add your command handler code here
m_PenColor = RGB(255,0,0);
this->SetMenuItemCheck(0,2,4,1);
}
//画笔颜色下绿色菜单项处理函数
void CDrawTestView::OnPenGreen()
{
// TODO: Add your command handler code here
m_PenColor = RGB(0,255,0);
this->SetMenuItemCheck(0,2,4,2);
}
//画笔颜色下蓝色菜单项处理函数
void CDrawTestView::OnPenBlue()
{
// TODO: Add your command handler code here
m_PenColor = RGB(0,0,255);
this->SetMenuItemCheck(0,2,4,3);
}
//None菜单项处理函数
void CDrawTestView::OnBrushNone()
{
// TODO: Add your command handler code here
m_BrushStyle = -1;
this->SetMenuItemCheck(1,0,7,0);
}
//HS_BDIAGONAL菜单项处理函数
void CDrawTestView::OnBrushBdiagonal()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_BDIAGONAL;
this->SetMenuItemCheck(1,0,7,1);
}
//HS_CROSS菜单项处理函数
void CDrawTestView::OnBrushCross()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_CROSS;
this->SetMenuItemCheck(1,0,7,2);
}
//HS_DIAGCROSS菜单项处理函数
void CDrawTestView::OnBrushDiagcross()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_DIAGCROSS;
this->SetMenuItemCheck(1,0,7,3);
}
//HS_FDIAGONAL菜单项处理函数
void CDrawTestView::OnBrushFdiagonal()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_FDIAGONAL;
this->SetMenuItemCheck(1,0,7,4);
}
//HS_HORIZONTAL菜单项处理函数
void CDrawTestView::OnBrushHorizontal()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_HORIZONTAL;
this->SetMenuItemCheck(1,0,7,5);
}
//HS_VERITICAL菜单项处理函数
void CDrawTestView::OnBrushVertical()
{
// TODO: Add your command handler code here
m_BrushStyle = HS_VERTICAL;
this->SetMenuItemCheck(1,0,7,6);
}
//画刷颜色下白色菜单项处理函数
void CDrawTestView::OnBrushWhite()
{
// TODO: Add your command handler code here
m_BrushColor = RGB(255,255,255);
this->SetMenuItemCheck(1,1,4,0);
}
//画刷颜色下红色菜单项处理函数
void CDrawTestView::OnBrushRed()
{
// TODO: Add your command handler code here
m_BrushColor = RGB(255,0,0);
this->SetMenuItemCheck(1,1,4,1);
}
//画刷颜色下绿色菜单项处理函数
void CDrawTestView::OnBrushGreen()
{
// TODO: Add your command handler code here
m_BrushColor = RGB(0,255,0);
this->SetMenuItemCheck(1,1,4,2);
}
//画刷颜色下蓝色菜单项处理函数
void CDrawTestView::OnBrushBlue()
{
// TODO: Add your command handler code here
m_BrushColor = RGB(0,0,255);
this->SetMenuItemCheck(1,1,4,3);
}
我们在CDrawTestView类中再添加两个函数GetPen和GetBrush来获得自定义画笔和画刷指针,函数代码如下:
//获得自定义画笔指针
CPen CDrawTestView::GetPen()
{
return new CPen(m_PenStyle,m_PenWidth,m_PenColor);
}
//获得自定义画刷指针
CBrush CDrawTestView::GetBrush()
{
//判断是否是阴影线画刷
if (m_BrushStyle == -1)
//不是阴影线画刷
return new CBrush(m_BrushColor);
else
//是阴影线画刷
return new CBrush(m_BrushStyle,m_BrushColor);
}
编写这两个函数的好处在于:如果以后需要更改获得画笔或者画刷的方式(比如画笔改用第三个构造函数来构造),只需要修改这两个函数即可。如果在每个绘图函数菜单项的处理函数中写构造画笔和画刷的代码,一旦画笔和画刷的构造方式要发生改变,就必须逐个修改每个绘图函数菜单项的处理函数。
现在修改绘图函数菜单项的处理函数,调用GetPen和GetBrush函数获得画笔和画刷,然后选用画笔和画刷,并在函数的最后删除画笔和画刷。这是因为获得画笔和画刷的函数每次都是构造新的画笔和画刷,而它们将占用系统资源,所以在使用完毕后要进行删除。而LineTo等绘制线形图形的绘图函数不受画刷影响,所以在这些绘图函数的处理函数中不需要选用画刷。因为所有线形图形绘图函数菜单项的处理函数要添加的代码是相同的,同样所有区域图形绘图函数菜单项的处理函数要添加的代码也是相同的,所以这里只列出“LineTo”(绘制线形图形)菜单项和“Rectangle”(绘制区域图形)菜单项修改后的处理函数代码,读者只需按照相同方法修改其它处理函数即可。修改后的代码如下:
//LineTo菜单项处理函数
void CDrawTestView::OnDrawLineto()
{
// TODO: Add your command handler code here
CClientDC dc(this);
CPen pen = this->GetPen();
dcSelectObject(pen);
dcMoveTo(300,300);
dcLineTo(400,400);
pen->DeleteObject();
}
//Rectangle菜单项处理函数
void CDrawTestView::OnDrawRectangle()
{
// TODO: Add your command handler code here
CClientDC dc(this);
CPen pen = this->GetPen();
CBrush brush = this->GetBrush();
dcSelectObject(pen);
dcSelectObject(brush);
dcRectangle(450,100,650,250);
pen->DeleteObject();
brush->DeleteObject();
}
代码中粗体字部分是后添加的代码,修改原则是在获得设备环境对象之后,调用绘图函数之前,先获得画笔或画笔和画刷,然后让设备环境对象选用它们。最后在所有绘图函数执行完后,删除前面获得的画笔或画笔和画刷。
下面我们看一个例子,修改OnDraw函数,输入如下代码:
void CDrawTestView::OnDraw(CDC pDC)
{
CDrawTestDoc pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//构造要输出的文本字符串
CString s;
s = "DrawTest Function";
//构造文本要输出的矩形区域
CRect r;
rleft = 50;rright =150;
rtop =10;rbottom = 40;
//绘制矩形,以便确定输出的文本在矩形区域中的位置
pDC->Rectangle(r);
//水平,垂直方向都居中,单行显示,超出区域范围不剪切
pDC->DrawText(s,r,DT_VCENTER|DT_CENTER|DT_SINGLELINE|DT_NOCLIP);
//向下平移矩形区域
rtop = rtop + 50;rbottom = rbottom +50;
pDC->Rectangle(r);
//垂直方向居底,水平方向靠右,单行显示
pDC->DrawText(s,r,DT_BOTTOM|DT_RIGHT|DT_SINGLELINE);
//向下平移矩形区域
rtop = rtop + 50;rbottom = rbottom +50;
pDC->Rectangle(r);
//垂直方向居顶,水平方向靠左,超出矩形区域时,在单词之间换行
pDC->DrawText(s,r,DT_TOP|DT_LEFT|DT_WORDBREAK);
//向下平移矩形区域
rtop = rtop + 50;rbottom = rbottom +50;
pDC->Rectangle(r);
//垂直方向居中,水平方向靠左,单行显示,超出范围时用省略号取代字符串尾部字符
pDC->DrawText(s,r,
DT_VCENTER|DT_LEFT|DT_SINGLELINE|DT_END_ELLIPSIS);
}
以下方法可在MFC和控制台中都可以实现:\x0d\1HDC hdc = GetDC(HWND hWnd); 获得设备上下文的客户区一个指定的窗口或整个屏幕\x0d\eg:如果是在窗口类中可以:\x0d\ HDC hdc = GetDC(this->m_hWnd); \x0d\2在窗口区画点。\x0d\ SetPixel(\x0d\ hdc, \x0d\ x, // 横坐标\x0d\ y , // 纵坐标\x0d\ RGB(100,100,100)); //点的颜色。\x0d\3 画线\x0d\MoveToEx(\x0d\ HDC hdc, \x0d\ int X, // 横坐标\x0d\ int Y, // 纵坐标\x0d\ LPPOINT lpPoint //保存先前的点的位置,在这里你可以直接写NULL\x0d\)\x0d\ LineTo(\x0d\ HDC hdc, // device context handle\x0d\ int nXEnd, // x-coordinate of line's ending point\x0d\ int nYEnd // y-coordinate of line's ending point\x0d\);\x0d\4画圆\x0d\ 函数:\x0d\ Ellipse(\x0d\ HDC hdc, // handle to device context\x0d\ int nLeftRect, // x-coord of bounding rectangle's upper-left corner\x0d\ int nTopRect, // y-coord of bounding rectangle's upper-left corner\x0d\ int nRightRect, // x-coord of bounding rectangle's lower-right corner\x0d\ int nBottomRect // y-coord of bounding rectangle's lower-right corner\x0d\);\x0d\ eg :Ellipse(hdc,0,0,100,100);
圆心在(500,500),你的y计算,只计算了下半圆(圆心以下)的每个点,没有计算上半圆(圆心之上)。上半圆的y坐标 y'=2b-y (y是已有的下半圆的点坐标)
画圆不是用“画点”,而是画点与点之间的连线(画线)
画圆有专用的画圆函数,不需要自己一点一点的画。
你可以在 CDlg 类中添加 对 WM_LBUTTONUP WM_LBUTTONDOWN
WM__MOUSEMOVE的消息响应
其中,WM_LBUTTONDOWN消息响应中,记录绘图开始点,并建立画刷
WM__MOUSEMOVE消息响应中,画线
WM_LBUTTONUP 停止画线,删除画刷。OK了
以上就是关于如何用C++6.0中的MFC 画图最简单的线就可以全部的内容,包括:如何用C++6.0中的MFC 画图最简单的线就可以、你好,朋友,我看到你问:MFC中通过界面输入坐标来画点 用setPixel函数吗头文件和库如何定义、MFC编写一个绘图程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)