VC++中,如何画“临时线”??
用for循环,画李萨如图形,我想把当时的坐标点和他们x方向,y方向的投影连起来,用lineto一直在了,怎么样才能让他们是临时的呢可能意思是不明白,我再说下,比如画一个圆...
用for循环,画李萨如图形,我想把当时的坐标点和他们 x方向,y方向的投影连起来,用lineto一直在了,怎么样才能让他们是临时的呢
可能意思是不明白,我再说下,比如画一个圆,有圆心,半径,画的时候圆是要保留的,但是我想把圆心和圆周连起来,以显示画到了什么地方,连着圆心的半径是不停的转的,
不知道现在说明白了没有 展开
可能意思是不明白,我再说下,比如画一个圆,有圆心,半径,画的时候圆是要保留的,但是我想把圆心和圆周连起来,以显示画到了什么地方,连着圆心的半径是不停的转的,
不知道现在说明白了没有 展开
展开全部
哎!你还是没明白其中的奥妙!我在另一个问题里已经给你写了基本的思路。你却说看不懂!记住:我没叫你
把全部代码都读懂!!事实上,那个程序我用了一个模板,是专门用来开发视频游戏、动画……用的模板程序
。你当然不会看懂,有不少GDI绘图操作(虽然我通常使用DirectX技术)。
重复一遍,没叫你看全部代码,而是看:
我声明的全局变量和宏;
mypcluna_Init()、mypcluna_Main()、mypcluna_Shutdown()这三个函数!!!
在这三个函数里,拥有满足你意愿的一切思想,如果你不想受困于那些“奇怪”的变量,那就好好看看我声明
的所有全局变量还有几个宏!
特别是mypcluna_Main(),这是“游戏/动画 主函数”,也许你应该把它背过——至少这可是程序的核心。
其实,我完全可以只把全局变量、宏和那三个函数的源码发给你;但是,为了让你尽可能融会完整程序的一切
,所以我还是像上次那个问题一样(当然不是为了让你给我追加30分!),把整个代码写出来(你要明白我其
实很不想这么做,我可不是什么“开源爱好者”!),以下是全部程序。再次提醒:你要做的不是看全部代码
,而是读我上文所说的几处。我不希望你在读到mypcluna_Main()函数之前就放弃了。
补充一下,其中的算法其实很简单,但这是建立在“动态画圆”的基础上,如果是椭圆,甚至更复杂的曲线,
那这种方法作用很一般(这也是我决定开源的一个重要原因)。不过我可以给你提供一个学习它们的方法:请
阅读《计算机图形学》,那上面有你所要的一切!(但它们并不容易掌握!!)
//动态画圆,圆轮廓使用白色弧线,圆内部使用红色填充,
//正在“绘制”的半径使用蓝色表示(因为它不停地移动,就像是它在画一样!)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#define WINDOW_CLASS_NAME "WINCLASS1"
#define CIRCLE_CENTER_X 320
#define CIRCLE_CENTER_Y 240
#define Radius 100
HWND main_window_handle = NULL;
HINSTANCE hinstance_app = NULL;
HDC hdc;
HPEN hpen;
HBRUSH hbrush;
int pie_x,pie_y;
int pie_x1,pie_y1;
int circle_arc;
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(msg)
{
case WM_CREATE:
{
return(0);
} break;
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return(0);
} break;
case WM_DESTROY:
{
PostQuitMessage(0);
return(0);
} break;
default:break;
}
return (DefWindowProc(hwnd, msg, wparam, lparam));
}
///////////////////////////////////////////////////////////
int mypcluna_Main(void *parms = NULL, int num_parms = 0)
{
DWORD start_time = GetTickCount();
// 画圆心在(CIRCLE_CENTER_X,CIRCLE_CENTER_Y),半径为Radius的圆
hpen = CreatePen(PS_SOLID,1,RGB(255,255,255));
hdc=GetDC(main_window_handle);
SelectObject(hdc,hpen);
SelectObject(hdc,hbrush);
Pie(hdc,CIRCLE_CENTER_X-Radius,CIRCLE_CENTER_Y-Radius,
CIRCLE_CENTER_X+Radius,CIRCLE_CENTER_Y+Radius,
CIRCLE_CENTER_X,CIRCLE_CENTER_Y-Radius,
pie_x1,pie_y1);
if(hpen)
DeleteObject(hpen);
hpen=CreatePen(PS_SOLID,3,RGB(0,0,255));
SelectObject(hdc,hpen);
MoveToEx(hdc,CIRCLE_CENTER_X,CIRCLE_CENTER_Y,NULL);
LineTo(hdc,pie_x1,pie_y1);
switch(circle_arc)
{
case 1:
pie_x1--;
pie_y1++;
if(pie_x1 == CIRCLE_CENTER_X-Radius)
circle_arc = 2;
break;
case 2:
pie_x1++;
pie_y1++;
if(pie_y1 == CIRCLE_CENTER_Y+Radius)
circle_arc = 3;
break;
case 3:
pie_x1++;
pie_y1--;
if(pie_x1 == CIRCLE_CENTER_X+Radius)
circle_arc = 4;
break;
case 4:
pie_x1--;
pie_y1--;
if(pie_y1 == CIRCLE_CENTER_Y-Radius)
circle_arc = 0;
break;
default:
break;
}
ReleaseDC(main_window_handle,hdc);
while((start_time - GetTickCount() < 33));
return(1);
}
////////////////////////////////////////////////////////////
int mypcluna_Init(void *parms = NULL, int num_parms = 0)
{
hbrush = CreateSolidBrush(RGB(255,0,0));
circle_arc = 1;
pie_x = CIRCLE_CENTER_X; pie_y = CIRCLE_CENTER_Y-Radius;
pie_x1 = pie_x-1; pie_y1 = pie_y+1;
return(1);
}
/////////////////////////////////////////////////////////////
int mypcluna_Shutdown(void *parms = NULL, int num_parms = 0)
{
if(hbrush)
DeleteObject(hbrush);
if(hpen)
DeleteObject(hpen);
return(1);
}
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASSEX winclass;
HWND hwnd;
MSG msg;
winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
hinstance_app = hinstance;
if (!RegisterClassEx(&winclass))
return(0);
if (!(hwnd = CreateWindowEx(NULL,
WINDOW_CLASS_NAME,
"mypcluna DEMO",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0,0,
640,480,
NULL,
NULL,
hinstance,
NULL)))
return(0);
main_window_handle = hwnd;
mypcluna_Init();
while(TRUE)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
mypcluna_Main();
}
mypcluna_Shutdown();
return(msg.wParam);
}
///////////////////////////////////////////////////////////
注意:
如果你想演示程序,看看效果如何,请创建Win32 Application工程,添加一个C++ Source File,再把上面代
码全部粘上,F7后肯定通过,再Ctrl+F5就行!
再说一遍,演示的话不要建MFC,而是创建Win32 Application工程,你可以得到直观演示的效果!
把全部代码都读懂!!事实上,那个程序我用了一个模板,是专门用来开发视频游戏、动画……用的模板程序
。你当然不会看懂,有不少GDI绘图操作(虽然我通常使用DirectX技术)。
重复一遍,没叫你看全部代码,而是看:
我声明的全局变量和宏;
mypcluna_Init()、mypcluna_Main()、mypcluna_Shutdown()这三个函数!!!
在这三个函数里,拥有满足你意愿的一切思想,如果你不想受困于那些“奇怪”的变量,那就好好看看我声明
的所有全局变量还有几个宏!
特别是mypcluna_Main(),这是“游戏/动画 主函数”,也许你应该把它背过——至少这可是程序的核心。
其实,我完全可以只把全局变量、宏和那三个函数的源码发给你;但是,为了让你尽可能融会完整程序的一切
,所以我还是像上次那个问题一样(当然不是为了让你给我追加30分!),把整个代码写出来(你要明白我其
实很不想这么做,我可不是什么“开源爱好者”!),以下是全部程序。再次提醒:你要做的不是看全部代码
,而是读我上文所说的几处。我不希望你在读到mypcluna_Main()函数之前就放弃了。
补充一下,其中的算法其实很简单,但这是建立在“动态画圆”的基础上,如果是椭圆,甚至更复杂的曲线,
那这种方法作用很一般(这也是我决定开源的一个重要原因)。不过我可以给你提供一个学习它们的方法:请
阅读《计算机图形学》,那上面有你所要的一切!(但它们并不容易掌握!!)
//动态画圆,圆轮廓使用白色弧线,圆内部使用红色填充,
//正在“绘制”的半径使用蓝色表示(因为它不停地移动,就像是它在画一样!)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#define WINDOW_CLASS_NAME "WINCLASS1"
#define CIRCLE_CENTER_X 320
#define CIRCLE_CENTER_Y 240
#define Radius 100
HWND main_window_handle = NULL;
HINSTANCE hinstance_app = NULL;
HDC hdc;
HPEN hpen;
HBRUSH hbrush;
int pie_x,pie_y;
int pie_x1,pie_y1;
int circle_arc;
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(msg)
{
case WM_CREATE:
{
return(0);
} break;
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return(0);
} break;
case WM_DESTROY:
{
PostQuitMessage(0);
return(0);
} break;
default:break;
}
return (DefWindowProc(hwnd, msg, wparam, lparam));
}
///////////////////////////////////////////////////////////
int mypcluna_Main(void *parms = NULL, int num_parms = 0)
{
DWORD start_time = GetTickCount();
// 画圆心在(CIRCLE_CENTER_X,CIRCLE_CENTER_Y),半径为Radius的圆
hpen = CreatePen(PS_SOLID,1,RGB(255,255,255));
hdc=GetDC(main_window_handle);
SelectObject(hdc,hpen);
SelectObject(hdc,hbrush);
Pie(hdc,CIRCLE_CENTER_X-Radius,CIRCLE_CENTER_Y-Radius,
CIRCLE_CENTER_X+Radius,CIRCLE_CENTER_Y+Radius,
CIRCLE_CENTER_X,CIRCLE_CENTER_Y-Radius,
pie_x1,pie_y1);
if(hpen)
DeleteObject(hpen);
hpen=CreatePen(PS_SOLID,3,RGB(0,0,255));
SelectObject(hdc,hpen);
MoveToEx(hdc,CIRCLE_CENTER_X,CIRCLE_CENTER_Y,NULL);
LineTo(hdc,pie_x1,pie_y1);
switch(circle_arc)
{
case 1:
pie_x1--;
pie_y1++;
if(pie_x1 == CIRCLE_CENTER_X-Radius)
circle_arc = 2;
break;
case 2:
pie_x1++;
pie_y1++;
if(pie_y1 == CIRCLE_CENTER_Y+Radius)
circle_arc = 3;
break;
case 3:
pie_x1++;
pie_y1--;
if(pie_x1 == CIRCLE_CENTER_X+Radius)
circle_arc = 4;
break;
case 4:
pie_x1--;
pie_y1--;
if(pie_y1 == CIRCLE_CENTER_Y-Radius)
circle_arc = 0;
break;
default:
break;
}
ReleaseDC(main_window_handle,hdc);
while((start_time - GetTickCount() < 33));
return(1);
}
////////////////////////////////////////////////////////////
int mypcluna_Init(void *parms = NULL, int num_parms = 0)
{
hbrush = CreateSolidBrush(RGB(255,0,0));
circle_arc = 1;
pie_x = CIRCLE_CENTER_X; pie_y = CIRCLE_CENTER_Y-Radius;
pie_x1 = pie_x-1; pie_y1 = pie_y+1;
return(1);
}
/////////////////////////////////////////////////////////////
int mypcluna_Shutdown(void *parms = NULL, int num_parms = 0)
{
if(hbrush)
DeleteObject(hbrush);
if(hpen)
DeleteObject(hpen);
return(1);
}
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASSEX winclass;
HWND hwnd;
MSG msg;
winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
hinstance_app = hinstance;
if (!RegisterClassEx(&winclass))
return(0);
if (!(hwnd = CreateWindowEx(NULL,
WINDOW_CLASS_NAME,
"mypcluna DEMO",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0,0,
640,480,
NULL,
NULL,
hinstance,
NULL)))
return(0);
main_window_handle = hwnd;
mypcluna_Init();
while(TRUE)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
mypcluna_Main();
}
mypcluna_Shutdown();
return(msg.wParam);
}
///////////////////////////////////////////////////////////
注意:
如果你想演示程序,看看效果如何,请创建Win32 Application工程,添加一个C++ Source File,再把上面代
码全部粘上,F7后肯定通过,再Ctrl+F5就行!
再说一遍,演示的话不要建MFC,而是创建Win32 Application工程,你可以得到直观演示的效果!
展开全部
画“临时线”需要知道两个条件:1.线的起止位置 2.临时状态。知道了这两个条件以后,就可以在绘图方法里面,绘制出“临时线”了。
通常绘制临时线的操作:
1.先将鼠标移动到画线的起始点,然后点击左键。(此时进入临时状态)
2.左键不放开,移动鼠标到画线终止点,此时要显示出临时线(从起始点画到终止点)。
3.左键松开,临时线消失。(退出临时状态)
通常绘制临时线的操作:
1.先将鼠标移动到画线的起始点,然后点击左键。(此时进入临时状态)
2.左键不放开,移动鼠标到画线终止点,此时要显示出临时线(从起始点画到终止点)。
3.左键松开,临时线消失。(退出临时状态)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
临时是什么意思? 就是画了后过一会就消失吗? 如是,刷新一下屏幕就会消失了
----------------------------------
每一次刷新都将圆在原地重新画一遍,而半径另外处理
----------------------------------
每一次刷新都将圆在原地重新画一遍,而半径另外处理
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
需求不明,不知所云,
实在是猜不出你的意图
实在是猜不出你的意图
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以用一个变量保留是否显示临时的辅助线,如果为真,就绘制这些线,如果不为真就只画图形,不画这些辅助线。
建议你把这个绘制做成一个类,提供一个函数Draw(CDC *pDC, BOOL bDrawTempLine=FALSE);或者Draw(BOOL bDrawTempLine=FALSE);
如果有绘制过程,再提供绘制过程函数。
推荐一篇 VC快速入门 学习指导文章,
地址 http://www.vcsoft.org/bbs/viewthread.php?tid=26&fromuid=1
//签名------------------------------
VC精华论坛、专业回复、团队技术群、实战项目培训、项目开发。
http://www.vcsoft.org/bbs
建议你把这个绘制做成一个类,提供一个函数Draw(CDC *pDC, BOOL bDrawTempLine=FALSE);或者Draw(BOOL bDrawTempLine=FALSE);
如果有绘制过程,再提供绘制过程函数。
推荐一篇 VC快速入门 学习指导文章,
地址 http://www.vcsoft.org/bbs/viewthread.php?tid=26&fromuid=1
//签名------------------------------
VC精华论坛、专业回复、团队技术群、实战项目培训、项目开发。
http://www.vcsoft.org/bbs
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询