vc的高手帮帮我,对于你们很简单的问题?????????
贴
http://community.csdn.net/Expert/topic/3903/3903299.xml?temp=.8931085
问题点数:10、回复次数:7Top
1 楼Featured(我握着爱情的门票静静排队……)回复于 2005-04-03 17:14:06 得分 1
帮顶Top
2 楼Mackz(在相互)回复于 2005-04-03 22:07:40 得分 9
我直接改一下,就不试了,如有错误应该很容易调试出来的:
hdc = BeginPaint(hwnd, &ps);
HPEN hPen;
hPen = CreatePen(PS_INSIDEFRAME, 2, RGB(0, 255, 0));
HPEN hPenOld = (HPEN)SelectObject(hdc, hPen);
double A = 87.56;
double A1 = 1.0 / A;
double u = 255.0;
RECT rcClient;
GetClientRect(hwnd, &rcClient);
double xR = (double)(rcClient.right - rcClient.left) / 2.0;
double yR = (double)(rcClient.bottom - rcClient.top) / 2.0;
int xPos, yPos;
double x = -1.0, y = -1.0;
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
MoveToEx(hdc, xPos, yPos);
for(x = -1.0; x < 1.0; x +=0.01)
{
if ((fabs(x) > 0.0) && (fabs(x) < A1) && (x < 0.0))
y = -A * x / (1 + log(A));
else if (fabs(x) > 0.0 && fabs(x) < A1 && x > 0.0)
y = A * x / (1 + log(A));
else if (fabs(x) > A1 && fabs(x) < 1.0 && x > 0.0)
y =(1 + log(A * fabs(x))) / (1 + log(A));
else if (fabs(x) > A1 && fabs(x) < 1.0 && x < 0.0)
y = -(1 + log(A * fabs(x))) / (1 + log(A));
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
LineTo(hdc, xPos, yPos);
}
x = 0.0;
y = 0.0;
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
MoveToEx(hdc, xPos, yPos);
SelectObject(hPenOld);
DeleteObject(hPen);
hPen = CreatePen(PS_INSIDEFRAME, 2, RGB(255,0,0));
hPenOld = (HPEN)SelectObject(hdc, hPen);
for(x = 0.0; x < 1.0; x +=0.01)
{
y = log(1 + u * x) / log(1 + u);
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
LineTo(hdc, xPos, yPos);
}
SelectObject(hdc, hPenOld);
DeleteObject(hPen);
EndPaint(hwnd, &ps);
Top
3 楼Mackz(在相互)回复于 2005-04-03 22:08:42 得分 0
又忘了,你绘制线段的话,线型不用别的,就用PS_SOLID就好了。Top
4 楼tondayong1981(bryan)回复于 2005-04-04 14:16:39 得分 0
//μ_curve and A curve
#include<windows.h>
#include<math.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreIntance,LPSTR lpCmdLine,int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
char lpszClassName[]="曲线";
char lpszTitle[]="draw_A_curve";
//窗口类的定义
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=lpszClassName;
wndclass.lpszMenuName=NULL;
wndclass.style=0;
//-------以下进行窗口的注册-------------//
if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return false;
}
//创建窗口
hwnd=CreateWindow(lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,hwnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//窗口函数
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
HPEN hPen;
PAINTSTRUCT ps;
double A = 87.56;
double A1 = 1.0 / A;
double u = 255.0;
RECT rcClient;
int xPos, yPos;
double x = -1.0, y = -1.0;//什么意思,x,y在窗口上是什么位置
double xR,yR;
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hPen = CreatePen(PS_INSIDEFRAME, 1, RGB(0, 255, 0));
SelectObject(hdc,hPen);
GetClientRect(hwnd, &rcClient);
xR = (double)(rcClient.right - rcClient.left) / 2.0;
yR = (double)(rcClient.bottom - rcClient.top) / 2.0;//是原点的坐标吗??
xPos = (int)((x + 1.0) * xR);//(x + 1.0))和(1.0 - y) x+ 1.0 1.0 - y是什么意思
yPos = (int)((1.0 - y) * yR);
MoveToEx(hdc, xPos, yPos,NULL);
for(x = -1.0; x < 1.0; x +=0.01)
{
if ((fabs(x) > 0.0) && (fabs(x) <= A1) && (x <0.0))
y = -A * x / (1 + log(A));
else if (fabs(x) > 0.0 && fabs(x) <= A1 && x > 0.0)
y = A * x / (1 + log(A));
else if (fabs(x) > A1 && fabs(x) <=1.0 && x > 0.0)
y =(1 + log(A * fabs(x))) / (1 + log(A));
else if (fabs(x) > A1 && fabs(x) <=1.0 && x < 0.0)
y = -(1 + log(A * fabs(x))) / (1 + log(A));
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
LineTo(hdc, xPos, yPos);
}
x = -1.0;
y = -1.0;
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
MoveToEx(hdc, xPos, yPos,NULL);
DeleteObject(hPen);
hPen = CreatePen(PS_INSIDEFRAME, 1, RGB(255,0,0));
SelectObject(hdc, hPen);
for(x = -1.0; x < 1.0; x +=0.01)
{
if(x<0)
y=-log(1 + u * fabs(x)) / log(1 + u);
else if(x>=0)
y =log(1 + u * fabs(x)) / log(1 + u);
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
LineTo(hdc, xPos, yPos);
}
DeleteObject(hPen);
EndPaint(hwnd, &ps);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
还有原点优点问题,我改不出来了。我不懂的我在上面注释了,你告诉我一下。
还有适口和窗口的问题
SetWindowExtEx(hdc,300,300,NULL);
SetViewportExtEx(hdc,300,200,NULL);
SetViewportOrgEx(hdc,300,150,NULL);
是不是我设置SetViewportOrgEx(hdc,300,150,NULL)后视口就是在运行的窗口中相对于300,150这个原点的矩形大小为300,200的区域,我画的图只能在这个区域显示。还有由于"表示把视口(设备坐标)300,150映射为窗口(逻辑)的0,0,那窗口在什么地方。
Top
5 楼Mackz(在相互)回复于 2005-04-06 02:25:38 得分 0
怎么说呢,应该自己看看想象,不难吧。
DC的映射模式也可以实现类似的功能,只要你把坐标先转换成足够大,以减少精度损失。
我没有修改DC的映射模式,自己进行坐标映射,相当于浮点坐标,逻辑坐标宽、高都是2.0,原点在中间。
xR = (double)(rcClient.right - rcClient.left) / 2.0;
yR = (double)(rcClient.bottom - rcClient.top) / 2.0;
这是计算逻辑坐标和窗口客户区之间的映射比例,也就是客户区宽度和高度映射到2.0宽、2.0高的逻辑坐标范围。
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
这是绘图的起点,x的值是-1.0,y应该根据计算得出,但是你的简单,所以直接设为-1.0,然后xPos和yPos就是从x,y转换到的屏幕坐标。下面的
xPos = (int)((x + 1.0) * xR);
yPos = (int)((1.0 - y) * yR);
也是一样的道理。x + 1.0,当x = -1.0的时候,就是起点,xPos = 0,就是屏幕上的左边;当x = 0的时候,xPos在屏幕中间,x = 1.0的时候,xPos在屏幕右边,也就是说,这时坐标平移,具体来说,就是把x坐标的原点移动到屏幕中间(因为我们设定的绘图范围是宽为2.0单位)。
对于y轴也一样,别忘了默认的映射模式下,y轴是向下增加的,所以为了转换成向上增加,要用
yPos = (int)((-y + 1.0) * xR);
同样,也是把y轴的原点移动到屏幕中间。
Top
6 楼Mackz(在相互)回复于 2005-04-06 02:30:48 得分 0
SetWindowExtEx(hdc,300,300,NULL); //设置逻辑坐标的范围(窗口)
SetViewportExtEx(hdc,300,200,NULL); //设置物理坐标的范围(视口)
SetViewportOrgEx(hdc,300,150,NULL); //设置物理原点
是不是我设置SetViewportOrgEx(hdc,300,150,NULL)后视口就是在运行的窗口中相对于300,150这个原点的矩形大小为300,200的区域,
说得对。
我画的图只能在这个区域显示。还有由于"表示把视口(设备坐标)300,150映射为窗口(逻辑)的0,0,
这个意思说,当你用逻辑坐标(0,0)表示的时候,实际在屏幕上的点是在从客户区左上角往右300点、往下150点的位置。
那窗口在什么地方。
这里的绘图窗口是逻辑的,也就是说,在你脑子里。它只是提供绘图时逻辑坐标转换到视口的物理坐标的计算之用,实际上不需要存在。
Top
7 楼tondayong1981(bryan)回复于 2005-04-07 12:59:35 得分 0
坐标转换:确定绘图区域,一般用GetClientRect()得到客户区大小,然后你可以在中间一块地方或者就在整个客户区绘图。确定坐标转换,可以用SetMapMode(),但是你的原始坐标太小,GDI绘图用的都是整型数,必须把你的浮点数转换到坐标区,我考虑到你的x取值范围在-1.0到1.0,而y好像也是在-1.0到1.0,因此x和y轴都设定为2.0的大小,这样坐标比例除一下就出来了,注意用浮点型转换。 绘图的时候,取到的值再乘一下这个比例就是窗口上的坐标了。还要注意默认的映射模式MM_TEXT下y轴是向下为正。另外,使用变量也要注意节约,能合并就合并,像i就是没必要的。绘制线条的初始点先要设好,不像你是把(0,0)作为初始点。
我的代码很容易就转换成SDK的了,试一下,祝你好运。
----------------------------------------------------------------
原贴内容:
mfc我一点不会,我才刚看了点API,我画图的思维那而错了,你告诉我就行,谢谢了,
http://community.csdn.net/Expert/topic/3904/3905000.xml?temp=.5069239
你回句话,我也把分给你。因为我画的不是变成直线就是圆。Top




