帮我写个画图程序,用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;

}

只提指导,没有源码。

在 Java 中要自定义组件,一般是覆盖掉 protected void paintComponent(Graphics g); 方法就可以了,对于你这个类似画笔的程序,首先,整个画布是一个自定义的继承自像 JPanel 一样的东西,不过我们需要覆盖它的 paintComponent 方法,因为:一、我们需要在当鼠标拖放一个东西时我们移动这个选中的图形时记住它的位置;二、设定 label 时需要保存它的 Label。三、知道图形的形状。

,然后在 paintComponent 时依次画出各个图形来。

要绘图:

1、直线,gdrawLine(x,y,x2,y2); // 参数分别是起止点坐标。

2、矩形,gfillRect(x, y, w, h); // 参数分别是左上角坐标和宽及高。

3、椭圆,gfillOval(x, y, w, h); // 参数分别是椭圆形的外切矩形的左上角坐标及宽和高,当w 和 h 相等时是个圆。

准备绘图前 gsetColor() 设置前景色;先把整个画布用 gfillRect() 涂成白色,再分别画各个图形,最后绘制 Label 应该在画图形之后再做。

移动图形,是给 画布组件 addMouseMotionListener 来监听事件的,在拖动时先通过 mouseDragged 事件的 MouseEventpoint 知道它的位置是在哪个图形的内部,之后的移动就修改这个图形的位置。

1、打开画图程序:在Windows *** 作系统中,依次点击开始菜单->所有程序-附件-画图。

2、选择画图工具:在画图程序上方的工具栏中,可以看到多种不同的绘图工具,包括画笔、铅笔、直线、箭头等,根据需要选择合适的工具进行绘图。

3、绘制图形:选择合适的绘图工具后,可以在画图区域内进行绘制。

4、修改图形属性:在绘制完图形后,可以通过格式菜单进行图形属性的修改。

5、保存图形:在完成绘制后,可以通过文件菜单中的保存选项将图形保存到本地硬盘中,可以直接使用复制和粘贴命令将图形插入到Word文档或其他应用程序中。

以上就是关于帮我写个画图程序,用win32 API,实现画圆,画矩形等,用到控件 ,鼠标消息处理等。全部的内容,包括:帮我写个画图程序,用win32 API,实现画圆,画矩形等,用到控件 ,鼠标消息处理等。、如何实现java画图程序,并可在已画的图上添加文字等,求大神T-T、在windows的画图程序中如果要使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存