
当然也可以自己写库,那个就是调系统的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)则只单纯的依据这些数据来绘图.这样处理你还可以方便的实现如图形编亏渗辑等指拍 *** 作欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)