帮我写个画图程序,用win32 API,实现画圆,画矩形等,用到控件 ,鼠标消息处理等。

帮我写个画图程序,用win32 API,实现画圆,画矩形等,用到控件 ,鼠标消息处理等。,第1张

呵呵,哥们,我们也刚学完这些,以下代码给你,要的基本符合,不过你得要在加2个资源(在insert的resource中)“鼠标的(cursor)和菜单栏的(menu)”,不加是不行的,加了后该修改的你能看的懂的,实在不行,我就直接发文件给你:

#include <windowsh>

#include "resourceh"

#include <stringh>

#include <stdioh>

#include <mathh>

HINSTANCE g_hInstance;

int g_nToolID = 0;

struct tagLine

{

POINT ptB;

POINT ptE;

bool bIsDelete;

};

tagLine g_AllLines[100];//直线数组

int g_nLineNumber = 0; //实际直线数

struct tagCircle

{

POINT ptCenter;

int nRadius;

bool bIsDelete;

};

tagCircle g_AllCircles[100];//整圆数组

int g_nCircleNumber = 0; // 实际保存的圆个数

POINT pt1 = {200,200};

POINT pt2 = {200,200};

POINT pt3 = {0,0};

int g_nState = 0;

//功能:画一线直线段

void DrawLine(HDC hDC,POINT ptB,POINT ptE)

{

::MoveToEx(hDC,ptBx,ptBy,NULL);

::LineTo(hDC,ptEx,ptEy);

}

//功能:已知两点求距离

int Distance(POINT pt1,POINT pt2)

{

int nR = 0;

nR=sqrt((pt1x - pt2x)(pt1x - pt2x) +(pt1y - pt2y)(pt1y- pt2y));

return nR;

}

void DrawCircle(HDC hDC,POINT ptC,int nR)

{

::Ellipse(hDC,ptCx - nR,ptCy - nR,ptCx + nR,ptCy + nR);

}

void OnMouseMove(POINT ptPos,HWND hWnd)

{

if(g_nToolID == ID_CIRCLE)

{

if(g_nState == 1)

{

HDC hDC = ::GetDC(hWnd);

//取得系统预定义一个“空心刷子”

HBRUSH hBrush = (HBRUSH)::GetStockObject(NULL_BRUSH);

::SelectObject(hDC,hBrush);

::SetROP2(hDC,R2_NOTXORPEN);

DrawLine(hDC,pt1,pt2);

int nR = Distance(pt1,pt2);

DrawCircle(hDC,pt1,nR);

pt3 = ptPos;

nR = Distance(pt1,pt3);

DrawCircle(hDC,pt1,nR);

DrawLine(hDC,pt1,pt3);

pt2 = pt3;

::ReleaseDC(hWnd,hDC);

}

}else if(g_nToolID == ID_LINE)

{

if(g_nState == 1)

{

HDC hDC = ::GetDC(hWnd);

pt3=ptPos;

//用背景色,绘制上一次的位置==>擦除

::SetROP2(hDC,R2_NOTXORPEN);

::DrawLine(hDC,pt1,pt2);

::DrawLine(hDC,pt1,pt3);

pt2 = pt3;

::ReleaseDC(hWnd,hDC);

}

}

}

void OnLButtonUp(POINT ptPos)

{

if(g_nToolID == ID_CIRCLE)

{

if(g_nState == 1)

{

tagCircle aCir;

aCirptCenter = pt1;

aCirnRadius = Distance(pt1,ptPos);

aCirbIsDelete = false;

g_AllCircles[g_nCircleNumber] = aCir;

g_nCircleNumber = g_nCircleNumber + 1;

g_nState = 0;

}

}else if(g_nToolID == ID_LINE)

{

if(g_nState == 1)

{

g_nState = 0;

tagLine aLine;

aLineptB = pt1;

aLineptE = pt3;

aLinebIsDelete = false;

g_AllLines[g_nLineNumber] = aLine;

g_nLineNumber = g_nLineNumber + 1;

}

}

}

//功能:判断点是否在直线段上

bool PtOnCircle(POINT pt,POINT ptC,int nR)

{

int nL = Distance(pt,ptC);

if( fabs(nL - nR) < 5 )

{

return true;

}else

{

return false;

}

}

//功能:判断点是否在直线段上

bool PtOnLine(POINT pt,POINT ptB,POINT ptE)

{

int nL1 = Distance(pt,ptB);

int nL2 = Distance(pt,ptE);

int nL3 = Distance(ptB,ptE);

if( fabs(( nL1 + nL2 ) - nL3) < 5 )

{

return true;

}else

{

return false;

}

}

void OnLButtonDown(HWND hWnd,POINT ptPos)

{

if(g_nToolID == ID_CIRCLE)

{

if(g_nState == 0)

{

g_nState = 1;

pt2 = pt1 = ptPos;

}

}else if(g_nToolID == ID_LINE)

{

if(g_nState == 0)

{

g_nState = 1;

pt2 = pt1 = ptPos;

}

}else if(g_nToolID == ID_DELETE)

{

//判断当前鼠标点是否在某一个直线段上

for(int nI = 0; nI < g_nLineNumber; nI = nI + 1)

{

tagLine pLine = &g_AllLines[nI];

if(PtOnLine(ptPos,(pLine)ptB,(pLine)ptE))

{

char cTxt[100];

sprintf(cTxt,"nI = %d\n",nI);

::OutputDebugString(cTxt);

(pLine)bIsDelete = true;

break;

}

}

//判断当前鼠标点是否在某一个圆上

for(nI = 0; nI < g_nCircleNumber; nI = nI + 1)

{

tagCircle pCircle = &g_AllCircles[nI];

if(PtOnCircle(ptPos,(pCircle)ptCenter,(pCircle)nRadius))

{

(pCircle)bIsDelete = true;

break;

}

}

::InvalidateRect(hWnd,NULL,TRUE);

}

}

void OnPaint(HDC hDC)

{

// 1重绘圆

//取得系统预定义一个“空心刷子”

HBRUSH hBrush = (HBRUSH)::GetStockObject(NULL_BRUSH);

::SelectObject(hDC,hBrush);

for(int nI = 0; nI < g_nCircleNumber; nI++)

{

tagCircle aCir;

aCir = g_AllCircles[nI];

if(aCirbIsDelete == false)

{

DrawCircle(hDC,aCirptCenter,aCirnRadius);

}

}

// 2重绘直线段

for(nI = 0; nI < g_nLineNumber; nI = nI + 1)

{

tagLine aLine = g_AllLines[nI];

if(aLinebIsDelete == false)

{

::DrawLine(hDC,aLineptB,aLineptE);

}

}

}

void OnCommand(HWND hWnd,int nCmdID)

{

switch(nCmdID)

{

case ID_EXIT:

::DestroyWindow(hWnd);

break;

case ID_LINE:

g_nToolID = ID_LINE;

break;

case ID_CIRCLE:

g_nToolID = ID_CIRCLE;

break;

case ID_DELETE:

g_nToolID = ID_DELETE;

break;

}

}

// 窗口回调函数

int WndProc(HWND hWnd,

int message,

int wParam,

int lParam)

{

switch (message)

{

case WM_SETCURSOR:

{

HCURSOR hCur1 = ::LoadCursor(g_hInstance,"pen_cursor");

HCURSOR hCur2 = ::LoadCursor(g_hInstance,"hand_cursor");

HCURSOR hCur3 = ::LoadCursor(g_hInstance,"point_cursor");

HCURSOR hCur4 = ::LoadCursor(g_hInstance,"arrow_cursor");

switch(g_nToolID)

{

case ID_LINE:

::SetCursor(hCur1);

break;

case ID_CIRCLE:

::SetCursor(hCur2);

break;

case ID_DELETE:

::SetCursor(hCur3);

break;

default:

::SetCursor(hCur1);

}

break;

}

case WM_COMMAND:

{

int nID = LOWORD(wParam);

OnCommand(hWnd,nID);

break;

}

case WM_LBUTTONDOWN:

{

POINT ptPos;

ptPosx = LOWORD(lParam);

ptPosy = HIWORD(lParam);

OnLButtonDown(hWnd,ptPos);

}

break;

case WM_LBUTTONUP:

{

POINT ptPos;

ptPosx = LOWORD(lParam);

ptPosy = HIWORD(lParam);

OnLButtonUp(ptPos);

}

break;

case WM_MOUSEMOVE:

{

POINT ptPos;

ptPosx = LOWORD(lParam);

ptPosy = HIWORD(lParam);

OnMouseMove(ptPos,hWnd);

}

break;

case WM_PAINT:

{

PAINTSTRUCT ps;

HDC hDC = ::BeginPaint(hWnd,&ps);

OnPaint(hDC);

::EndPaint(hWnd,&ps);

break;

}

case WM_DESTROY: //窗口关闭时发送

::PostQuitMessage(0); //在消息队列的尾部添加一个0消息,以示,结束程序

break;

default:

return ::DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

int WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

char lpCmdLine,

int nCmdShow)

{

g_hInstance = hInstance;

WNDCLASSEX wcex;

wcexcbSize = sizeof(WNDCLASSEX);

wcexstyle = CS_HREDRAW | CS_VREDRAW;

wcexlpfnWndProc = (WNDPROC)WndProc;

wcexcbClsExtra = 0;

wcexcbWndExtra = 0;

wcexhInstance = hInstance;

wcexhIcon = NULL;

wcexhCursor = LoadCursor(NULL, IDC_ARROW);

wcexhbrBackground = (HBRUSH)(COLOR_WINDOW+1);

wcexlpszMenuName = "menu1";

wcexlpszClassName = "ABCDE";

wcexhIconSm = NULL;

RegisterClassEx(&wcex);

HWND hWnd = CreateWindow("ABCDE",

"WanJie",

WS_OVERLAPPEDWINDOW,

50, 50, //(x,y)

500, 500, // (w,h)

NULL,

NULL,

hInstance,

NULL);

ShowWindow(hWnd,SW_SHOW);

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

DispatchMessage(&msg);

}

return 1;

}

数控编程方法:

数控机床程序编制(又称数控机床编程)是指编程者(程序员或数控机床 *** 作者)根据零件图样和工艺文件的要求,编制出可在数控机床上运行以完成规定加工任务的一系列指令的过程。具体来说,数控机床编程是由分析零件图样和工艺要求开始到程序检验合格为止的全部过程。

数控机床编程步骤

1.分析零件图样和工艺要求

分析零件图样和工艺要求的目的,是为了确定加工方法、制定加工计划,以及确认与生产组织有关的问题,此步骤的内容包括:

确定该零件应安排在哪类或哪台机床上进行加工。

采用何种装夹具或何种装卡位方法。

确定采用何种刀具或采用多少把刀进行加工。

确定加工路线,即选择对刀点、程序起点(又称加工起点,加工起点常与对刀点重合)、走刀路线 、程序终点(程序终点常与程序起点重合)。

确定切削深度和宽度、进给速度、主轴转速等切削参数。

确定加工过程中是否需要提供冷却液、是否需要换刀、何时换刀等。

2.数值计算

根据零件图样几何尺寸,计算零件轮廓数据,或根据零件图样和走刀路线,计算刀具中心(或刀尖)运行轨迹数据。数值计算的最终目的是为了获得数控机床编程所需要的所有相关位置坐标数据。

3.编写加工程序单

常用数控机床编程指令

一组有规定次序的代码符号,可以作为一个信息单元存贮、传递和 *** 作。

坐标字:用来设定机床各坐标的位移量由坐标地址符及数字组成,一般以X、Y、Z、U、V、W等字母开头,后面紧跟“-”或“-”及一串数字。

准备功能字(简称G功能):

指定机床的运动方式,为数控系统的插补运算作准备由准备功能地址符“G”和两位数字所组成,G功能的代号已标准化,见表2-3;一些多功能机床,已有数字大于100的指令,见表2-4。常用G指令:坐标定位与插补;坐标平面选择;固定循环加工;刀具补偿;绝对坐标及增量坐标等。

辅助功能字:用于机床加工 *** 作时的工艺性指令,以地址符M为首,其后跟二位数字,常用M指令:主轴的转向与启停;冷却液的开与停;程序停止等。

进给功能字:指定刀具相对工件的运动速度进给功能字以地址符“F”为首,后跟一串字代码,单位:mm/min(对数控车床还可为mm/r)三位数代码法:F后跟三位数字,第一位为进给速度的整数位数加“3”,后二位是进给速度的前二位有效数字。如1728mm/min指定为F717。二位数代码法:F后跟二位数字,规定了与00~99相对应的速度表,除00与99外,数字代码由01向98递增时,速度按等比关系上升,公比为112。一位数代码法:对速度档较少的机床F后跟一位数字,即0 ~9来对应十种预定的速度。直接指定法:在F后按照预定的单位直接写上要求的进给速度。

主轴速度功能字:指定主轴旋转速度以地址符S为首,后跟一串数字。单位:r/min,它与进给功能字的指定方法一样。

刀具功能字:用以选择替换的刀具以地址符T为首,其后一般跟二位数字,该数代表刀具的编号。

模态指令和非模态指令 G指令和M指令均有模态和非模态指令之分模态指令:也称续效指令,一经程序段中指定,便一直有效,直到出现同组另一指令或被其他指令取消时才失效。见表2-3、表2-6 N001 G91 G01 X10 Y10 Z-2 F150 M03 S1500; N002 X15; N003 G02 X20 Y20 I20 J0; N004 G90 G00 X0 Y0 Z100 M02; 非模态指令:非续效指令,仅在出现的程序段中有效,下一段程序需要时必须重写(如G04)。

在完成上述两个步骤之后,即可根据已确定的加工方案(或计划)及数值计算获得的数据,按照数控系统要求的程序格式和代码格式编写加工程序等。编程者除应了解所用数控机床及系统的功能、熟悉程序指令外,还应具备与机械加工有关的工艺知识,才能编制出正确、实用的加工程序。

4.制作控制介质,输入程序信息

程序单完成后,编程者或机床 *** 作者可以通过CNC机床的 *** 作面板,在EDIT方式下直接将程序信息键入CNC系统程序存储器中;也可以根据CNC系统输入、输出装置的不同,先将程序单的程序制作成或转移至某种控制介质上。控制介质大多采用穿孔带,也可以是磁带、磁盘等信息载体,利用穿孔带阅读机或磁带机、磁盘驱动器等输入(输出)装置,可将控制介质上的程序信息输入到CNC系统程序存储器中。

5.程序检验

编制好的程序,在正式用于生产加工前,必须进行程序运行检查。在某些情况下,还需做零件试加工检查。根据检查结果,对程序进行修改和调整,检查--修改--再检查--再修改……这往往要经过多次反复,直到获得完全满足加工要求的程序为止。

上述编程步骤中的各项工作,主要由人工完成,这样的编程方式称为“手式编程”。在各机械制造行业中,均有大量仅由直线、圆弧等几何元素构成的形状并不复杂的零件需要加工。这些零件的数值计算较为简单,程序段数不多,程序检验也容易实现,因而可采用手工编程方式完成编程工作。由于手工编程不需要特别配置专门的编程设备,不同文化程度的人均可掌握和运用,因此在国内外,手工编程仍然是一种运用十分普遍的编程方法。

数控机床编程中的代码

数控机床编程编制过程

把图纸上的工程语言变为数控装置的语言,并把它记录在控制介质上。

数控机床编程的主要内容

分析图样、确定工艺过程:进行零件工艺分析,确定加工路线、切削用量等工艺参数。

数值计算:对形状简单的零件(如直线和圆弧组成的零件)的轮廓加工,计算几何元素的起点、终点、圆弧的圆心、两元素的交点或切点的坐标值等;对形状复杂的零件(如非圆曲线、曲面组成的零件),用直线段或圆弧段逼近,由精度要求计算出节点坐标值,这种情况可用计算机完成数值计算。

编写零件加工程序单编程人员根据数控系统规定的功能指令代码及程序段格式,逐段编写加工程序单。

程序校验与首件试切在有CRT图形显示屏的数控机床上,用模拟刀具与工件切削过程的方法进行检验,此方法只能检验出运动轨迹是否正确,不能查出被加工零件的加工精度,因此,要进行零件首件试切。

数控机床编程程序段格式

每个程序段是由程序段编号,若干个指令(功能字)和程序段结束符号组成。

需要说明的是,数控机床的指令格式在国际上有很多标准,并不完全一致。而随着数控机床的发展,不断改进和创新,其系统功能更加强大和使用方便,在不同数控系统之间,程序格式上存在一定的差异,因此,在具体进行某一数控机床编程时,要仔细了解其数控系统的编程格式,参考该数控机床编程手册。

你写程序?????太奢侈了~~~现在告诉你一个最简单的办法~描出来一个~然后用阵列命令~分分钟搞定~画出来一块然后复制粘贴就好了!cad自己本身的命令不用~还想着写程序

以上就是关于帮我写个画图程序,用win32 API,实现画圆,画矩形等,用到控件 ,鼠标消息处理等。全部的内容,包括:帮我写个画图程序,用win32 API,实现画圆,画矩形等,用到控件 ,鼠标消息处理等。、数控车床程序编程、在CAD中写一个Lisp程序,使选中图中直线自动画出四边形。想找个大神指导一下!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9404967.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存