CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

vc的高手帮帮我,对于你们很简单的问题?????????

楼主tondayong1981(bryan)2005-04-03 16:30:37 在 VC/MFC / 基础类 提问

贴  
  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

相关问题

  • 对于VC没有实战经验,初学者,请出点简单题目……
  • VC++简单问题提问?
  • 很简单的vc问题
  • VC 6.0简单问题
  • vc++的简单问题
  • VC的简单问题
  • 大家帮帮我啊??对于你们很简单/
  • 各位高手,请教一个VC的project->setting里的问题~~对于各位是很简单的问题!!
  • 简单问题,关于switch(VC++)
  • 请教关于VC的简单问题...

关键词

  • .net
  • 坐标
  • 映射
  • 逻辑
  • 转换
  • 屏幕
  • 区域
  • 客户
  • 物理
  • rcclient

得分解答快速导航

  • 帖主:tondayong1981
  • Featured
  • Mackz

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo