已知圆心与半径画圆,用c++实现(mfc)

已知圆心与半径画圆,用c++实现(mfc),第1张

MFC就是API的封装。

当然也可以自己写库,那个就是调系统的DLL,总之自己 *** 作显卡是吃不消的。旅芦

不同的显卡你要不同代码……你吃得消?还是把这些细节交给系统,…

调API的代价低,也简单。

MoveToEx(hdc,xBeg,xBeg,NULL)

LineTo(hdc,xEnd,yEnd)//直线

Arc(hdc,xLeft,yTop,xRignt,yBottom,xStart,yStart,xEnd,yEnd)//弧

Rectangle(hdc,xLeft,yTop,xRignt,yBottom)//矩形

Ellipse(hdc,xLeft,yTop,xRignt,yBottom)//扮差圆或者椭圆

这些大致就是基厅镇皮本几何图形的函数吧,,,,还有很多的可以去查。

具体的代码贴上,这是《windows程序设计》里面的代码,稍微有点过时,不过依然好用。

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM)

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static TCHAR szAppName[] = TEXT ("LineDemo")

HWND hwnd

MSG msg

WNDCLASS wndclass

wndclass.style = CS_HREDRAW | CS_VREDRAW

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 = szAppName

if (!RegisterClass (&wndclass))

{

MessageBox (NULL, TEXT ("Program requires Windows NT!"),

szAppName, MB_ICONERROR)

return 0

}

hwnd = CreateWindow (szAppName, TEXT ("Line Demonstration"),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInstance, NULL)

ShowWindow (hwnd, iCmdShow)

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)

{

static int cxClient, cyClient

HDC hdc

PAINTSTRUCT ps

switch (message)

{

case WM_SIZE:

cxClient = LOWORD (lParam)

cyClient = HIWORD (lParam)

return 0

case WM_PAINT:

hdc = BeginPaint (hwnd, &ps)

Rectangle (hdc, cxClient / 8, cyClient / 8,

7 * cxClient / 8, 7 * cyClient / 8)

MoveToEx (hdc,0,0, NULL)

LineTo(hdc, cxClient, cyClient)

MoveToEx (hdc,0, cyClient, NULL)

LineTo(hdc, cxClient,0)

Ellipse (hdc, cxClient / 8, cyClient / 8,

7 * cxClient / 8, 7 * cyClient / 8)

RoundRect (hdc, cxClient / 4, cyClient / 4,

3 * cxClient / 4, 3 * cyClient / 4,

cxClient / 4, cyClient / 4)

EndPaint (hwnd, &ps)

return 0

case WM_DESTROY:

PostQuitMessage (0)

return 0

}

return DefWindowProc (hwnd, message, wParam, lParam)

}

希望有用。

相关代码如下:

// 先在类中定义胡渣三个变量

bool m_painting // 是否正在绘制

CPoint m_pointOri // 中心点

float m_radius // 半径 Cdemo98View::Cdemo98View()

{

m_painting = false

m_radius = 0

}

void Cdemo98View::OnDraw(CDC* pDC)

{

Cdemo98Doc* pDoc = GetDocument()

ASSERT_VALID(pDoc)

if (!pDoc)

return

pDC->Ellipse(m_pointOri.x - m_radius, m_pointOri.y - m_radius, m_pointOri.x + m_radius, m_pointOri.y + m_radius)

}

void Cdemo98View::OnLButtonDown(UINT nFlags, CPoint point)

{

m_pointOri = point

m_radius = 0

m_painting = true

}

void Cdemo98View::OnMouseMove(UINT nFlags, CPoint point)

{

if (m_painting) {

// 计算当前点距离中心点距离也就是半径 

m_radius = sqrt(pow(float(point.x - m_pointOri.x), 桥历2) + pow(float(point.y - m_pointOri.y), 2))

Invalidate()

}

}

void Cdemo98View::OnLButtonUp(UINT nFlags, CPoint point)

{

// 计算当前点距离中心点距离也就是半径 

m_radius = sqrt(pow(float(point.x - m_pointOri.x), 2) + pow(float(point.y - m_pointOri.y), 2))

m_painting 裤消悄= false

Invalidate()

}

运行结果:

你需要一个类(也可以是别的什么)用来保存数据.你的鼠标/键盘销逗脊 *** 作只是不断的把采集的的图形参数保存到这个类里.而绘图函数(如OnDraw)则只单纯的依据这些数据来绘图.这样处理你还可以方便的实现如图形编亏渗辑等指拍 *** 作


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

原文地址:https://54852.com/yw/12353772.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存