??编译错误:warning C4013: 'MoveTo' undefined; assuming extern returning int?

cglee 2002-09-03 01:12:24
我将孙家广版的《计算机图形学》第二章后面Windows环境下的编程实例在VC6运行,发现有多处编译错误,如下:

warning C4013: 'MoveTo' undefined; assuming extern returning int
warning C4013: 'CreateSubWin' undefined; assuming extern returning int
warning C4047: 'function' : 'int ' differs in levels of indirection from 'void *'
warning C4024: 'EndDialog' : different types for formal and actual parameter 2
warning C4716: 'CreateSubWin' : must return a value
等等。

请问这是什么原因?
...全文
985 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
潘李亮 2002-09-06
  • 打赏
  • 举报
回复
你的程序问题很多,随便抓抓一大把。你先仔细修改一下了。主要是一些细节问题
潘李亮 2002-09-06
  • 打赏
  • 举报
回复
我记得 好象是只有 MoveToEx的,老兄你查查MSDN,看看VC的自动代码完成功能。
我想是这样的
cglee 2002-09-06
  • 打赏
  • 举报
回复
我把源程序贴在下面,谁编译一下,看是什么问题
谢谢!

#include <windows.h>
#include <math.h>
#include <string.h>

#define CU_LINE 200
#define CU_CIRCLE 201
#define CU_TEXT 202
#define CU_CREATEWIN 203
#define CU_EXIT 204

#define DRAW_OK 101
#define DRAW_EXIT 102
#define DRAW_TEXT 103

#define LINE_BEGIN 1
#define LINE_NEXT 2
#define CIRCLE_CEN 3
#define CIRCLE_RAD 4
#define DRAW_END 0

HANDLE hInst;
HWND hwnd;

long FAR PASCAL MsWndProc (HWND, WORD, WORD, LONG);
long FAR PASCAL SubWndProc (HWND, WORD, WORD, LONG);
int FAR PASCAL GDTextProc (HWND, unsigned, UINT, LONG);
int Draw_Text(void);

static char BaseWinText[] = "Ms_window Application";
int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmd, int nCmdShow)
{
MSG msg;
WNDCLASS wndclass;
HMENU hMenu;

if (! hPrevInstance)
{
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = (WNDPROC)MsWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "MainWinClass";

RegisterClass (&wndclass); /* 注册主窗口的窗口类 */

wndclass.lpfnWndProc = (WNDPROC)SubWndProc;
wndclass.lpszClassName = "SubWinClass";

RegisterClass (&wndclass); /* 注册子窗口的窗口类 */
}

hInst = hInstance; /* 保存窗口的实例句柄 */
hMenu = LoadMenu(hInstance, "MsDemo"); /* 从资源文件中装入菜单 */
hwnd = CreateWindow ("MainWinClass",
BaseWinText,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
hMenu,
hInstance,
NULL); /* 创建主窗口 */

ShowWindow (hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0)) /* 建立消息循环 */
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}

return msg.wParam;
}

/* 主窗口消息处理函数 */
long FAR PASCAL MsWndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
HDC hDC;
static int DRAW_OP = DRAW_END;
static int PrevX, PrevY;

switch (message)
{
case WM_LBUTTONDOWN: /* 鼠标左键按下 */
if (DRAW_OP == CIRCLE_CEN){ /* 输入点为圆的圆心 */
PrevX = LOWORD(lParam); /* 保存输入点的坐标 */
PrevY = HIWORD(lParam);
DRAW_OP = CIRCLE_RAD; /* 设置输入状态 */

/* 设置输入提示信息 */
SetWindowText(hwnd, "Input Radius of the Circle");
}
else if (DRAW_OP ==CIRCLE_RAD){ /* 输入点为圆周上一点 */
int x1, y1, x2, y2, x3, y3, x4, y4, r;
hDC = GetDC(hwnd); /* 获取设备描述表 */
x1 = LOWORD(lParam);
y1 = HIWORD(lParam);

/* 计算圆周半径 */
r = (int)sqrt((long)(x1-PrevX)*(x1-PrevX)+(long)(y1-PrevY)*(y1-PrevY));
x1 = x3 = x4 = PrevX-r;
y1 = PrevY + r;
x2 = PrevX + r;
y2 = y3 = y4 = PrevY-r;

/* 画圆弧 */
Arc(hDC, x1, y1, x2, y2, x3, y3, x4, y4);
ReleaseDC(hwnd, hDC); /* 释放设备描述表 */
DRAW_OP = DRAW_END; /* 设置绘图状态为绘图结束 */
SetWindowText(hwnd, BaseWinText);
}
else if (DRAW_OP == LINE_BEGIN){ /* 输入点为折线的起点 */
PrevX = LOWORD(lParam); /* 保存输入点坐标 */
PrevY = HIWORD(lParam);
DRAW_OP = LINE_NEXT; /* 设置输入状态 */

/* 设置输入提示信息 */
SetWindowText(hwnd, "Input Next Point");
}
else if (DRAW_OP == LINE_NEXT){ /* 输入点为折线的非起始点端点 */
hDC = GetDC(hwnd); /* 获取设备描述表 */
MoveTo(hDC, PrevX, PrevY);
LineTo(hDC, LOWORD(lParam), HIWORD(lParam)); /* 画线 */
PrevX = LOWORD(lParam); /* 保存输入点坐标 */
PrevY = HIWORD(lParam);
ReleaseDC(hwnd, hDC); /* 释放设备描述表 */
}
else return 0;
break;
case WM_RBUTTONDOWN: /* 鼠标右键按下 */
DRAW_OP = DRAW_END; /* 设置绘图状态为绘图结束 */
SetWindowText(hwnd, BaseWinText);
break;
case WM_COMMAND: /* 选中菜单项输入 */
{
if (DRAW_OP) return 0; /* 如果系统处于绘图状态,则选中菜单项无效 */
switch (wParam)
{
case CU_LINE: /* 选中“Line”菜单 */
DRAW_OP = LINE_BEGIN; /* 设置绘图状态 */

/* 设置输入提示信息 */
SetWindowText(hwnd, "Input First Point");
break;
case CU_CIRCLE: /* 选中“Circle”菜单 */
DRAW_OP = CIRCLE_CEN; /* 设置绘图状态 */

/* 设置输入提示信息 */
SetWindowText(hwnd, "Input Center of the Circle");
break;
case CU_TEXT: /* 选中“Text”菜单 */
Draw_Text();
break;
case CU_EXIT: /* 选中“Quit”菜单 */
PostQuitMessage(0);
break;
case CU_CREATEWIN: /* 选中“CreateWin”菜单 */
CreateSubWin();
break;
}
}
break;
case WM_CLOSE: /* 选中系统退出菜单 */
PostQuitMessage(0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return TRUE;
}

/* 子窗口输入处理函数,在此仅处理了系统 Close 消息 */
long FAR PASCAL SubWndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
switch (message){
case WM_CLOSE:
DestroyWindow(hwnd);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return NULL;
}

Draw_Text()
{
FARPROC lpProc;
static int TEXTDLG = 0;

if (TEXTDLG) return 0;
TEXTDLG = 1;
lpProc = MakeProcInstance(GDTextProc, hInst); /* 从资源文件中创建字符串输入对话框 */
DialogBox(hInst, "TEXTDLG", hwnd, lpProc);
FreeProcInstance(lpProc);
TEXTDLG = 0;
return 0;
}

/* 对话框输入处理函数 */
int FAR PASCAL GDTextProc (hDlg, message, wParam, lParam)
HWND hDlg;
unsigned message;
UINT wParam;
LONG lParam;
{
HDC hDC;
static int X = 0, Y = 0;
char text[128];

switch (message){
case WM_CLOSE: /* 对话框系统Close消息 */
EndDialog(hDlg, NULL); /* 退出对话框 */
break;
case WM_COMMAND:
if (wParam ==DRAW_EXIT){ /* 按下“Exit”按钮 */
EndDialog(hDlg, NULL); /* 退出对话框 */
break;
}
if (wParam == DRAW_OK || wParam == IDOK){ /* 输入回车或按下“Draw”按钮 */
hDC = GetDC(hwnd); /* 获取设备描述表 */
SetTextColor(hDC, RGB(255, 0, 0)); /* 设置字符颜色 */
GetDlgItemText(hDlg, DRAW_TEXT, text, 128); /* 获取输入字符串 */
TextOut(hDC, X, Y, text, strlen(text)); /* 输出字符串 */
Y += 20; /* 改变下一字符串的输出位置 */
if (Y>200){
X += 100;
if (X>300) X = 0;
Y = 0;
}
ReleaseDC(hwnd, hDC); /* 释放设备描述表 */
}
}
return FALSE;
}

CreateSubWin()
{
HWND win;
win = CreateWindow(
"SubWinClass",
NULL,
WS_OVERLAPPEDWINDOW|WS_VISIBLE|WS_CAPTION|WS_THICKFRAME,
0, 0, 100, 100,
hwnd,
NULL,
hInst,
NULL
); /* 创建子窗口 */
ShowWindow(win, TRUE);
}
kingofvc 2002-09-05
  • 打赏
  • 举报
回复
好像win95的时候moveto就不存在的 以前的windows版本应该有(我的一本书上面就是用这个的)
kingofvc 2002-09-05
  • 打赏
  • 举报
回复
MoveTo
api函数不存在
用MoveToEx
liubear 2002-09-04
  • 打赏
  • 举报
回复
这不是编译错,是警告,告诉你没有include包含这些函数的声明的.h文件
cglee 2002-09-04
  • 打赏
  • 举报
回复
应该是Windows的系统函数库,因为有:

#include <windows.h>

语句。
alexxing 2002-09-04
  • 打赏
  • 举报
回复
你的《计算机图形学》用的什么函数库啊?不会是 xwindows/motif 吧?
也有用 Turbo C 的,或者是自己写的函数库。
这些搞计算机图形的学究们用的函数,VC 下面很可能没有
cglee 2002-09-04
  • 打赏
  • 举报
回复
头文件只有以下三个:
#include <windows.h>
#include <math.h>
#include <string.h>
MoveTo在VC里是有这个函数的。

是警告错误,但接下来会有两个链接错误,如下:

fstgraph.obj : error LNK2001: unresolved external symbol _MoveTo
Debug/FstGraph.exe : fatal error LNK1120: 1 unresolved externals
cglee 2002-09-03
  • 打赏
  • 举报
回复
我是把书上的代码一字不差的输进去的。
blh 2002-09-03
  • 打赏
  • 举报
回复
你的函数是拥有问题,呵呵

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧