VC++中,如何画“临时线”??

用for循环,画李萨如图形,我想把当时的坐标点和他们x方向,y方向的投影连起来,用lineto一直在了,怎么样才能让他们是临时的呢可能意思是不明白,我再说下,比如画一个圆... 用for循环,画李萨如图形,我想把当时的坐标点和他们 x方向,y方向的投影连起来,用lineto一直在了,怎么样才能让他们是临时的呢
可能意思是不明白,我再说下,比如画一个圆,有圆心,半径,画的时候圆是要保留的,但是我想把圆心和圆周连起来,以显示画到了什么地方,连着圆心的半径是不停的转的,
不知道现在说明白了没有
展开
 我来答
mypcluna
2008-04-15 · TA获得超过2255个赞
知道大有可为答主
回答量:1273
采纳率:0%
帮助的人:1774万
展开全部
哎!你还是没明白其中的奥妙!我在另一个问题里已经给你写了基本的思路。你却说看不懂!记住:我没叫你

把全部代码都读懂!!事实上,那个程序我用了一个模板,是专门用来开发视频游戏、动画……用的模板程序

。你当然不会看懂,有不少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工程,你可以得到直观演示的效果!
cooke1234
2015-11-04 · TA获得超过6861个赞
知道大有可为答主
回答量:4617
采纳率:72%
帮助的人:3577万
展开全部
画“临时线”需要知道两个条件:1.线的起止位置 2.临时状态。知道了这两个条件以后,就可以在绘图方法里面,绘制出“临时线”了。
通常绘制临时线的操作:
1.先将鼠标移动到画线的起始点,然后点击左键。(此时进入临时状态)
2.左键不放开,移动鼠标到画线终止点,此时要显示出临时线(从起始点画到终止点)。
3.左键松开,临时线消失。(退出临时状态)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
皇家救星1985
2008-04-14 · TA获得超过1131个赞
知道大有可为答主
回答量:1579
采纳率:0%
帮助的人:1661万
展开全部
临时是什么意思? 就是画了后过一会就消失吗? 如是,刷新一下屏幕就会消失了
----------------------------------
每一次刷新都将圆在原地重新画一遍,而半径另外处理
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友8cff33ea0
2008-04-12 · TA获得超过104个赞
知道小有建树答主
回答量:183
采纳率:0%
帮助的人:148万
展开全部
需求不明,不知所云,
实在是猜不出你的意图
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
imzhjy
2008-04-12
知道答主
回答量:16
采纳率:0%
帮助的人:0
展开全部
你可以用一个变量保留是否显示临时的辅助线,如果为真,就绘制这些线,如果不为真就只画图形,不画这些辅助线。

建议你把这个绘制做成一个类,提供一个函数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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式