为什么不能运行??说是 dc 重复定义

ascmvi 2006-09-15 11:24:20
--------------------Configuration: aaabbb - Win32 Debug--------------------
Compiling...
aaabbb.cpp
c:\program files\microsoft visual studio\myprojects\aaabbb\aaabbb.cpp(69) : error C2086: 'hdc' : redefinition
Error executing cl.exe.

aaabbb.exe - 1 error(s), 0 warning(s)

我把hdc 换成其他名字还是不行


程序如下

#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK qc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);


int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=qc;
wndcls.lpszClassName="qinchuan";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW|CS_HREDRAW;

RegisterClass(&wndcls);
HWND hwnd;
hwnd=CreateWindow("qinchuan","window name",WS_OVERLAPPEDWINDOW,0,0,600,800,NULL,NULL,hInstance,0);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,hwnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;

}


LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_LBUTTONDOWN:
MessageBox(hwnd,"lbuttondown","caption",MB_OK);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,400,"输出一串文字",strlen("输出一串文字"));
ReleaseDC(hwnd,hdc);
break;
case WM_CHAR:
char szchar[20];
sprintf(szchar,"char is %d",wParam);
MessageBox(hwnd,szchar,"caption",MB_YESNO);
break;
case WM_PAINT:
HDC hdc;
PAINTSTRUCT ps;
hdc=BeginPaint(hwnd,&ps);
TextOut(hdc,0,400,"输出一串文字",strlen("输出一串文字"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否关闭","qinchuan",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);

}
return 0;
}
...全文
133 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlepboy 2006-09-15
  • 打赏
  • 举报
回复
把所有的HDC hdc都拿到switch外面应该可以。
每个case里面如果有相同的定义,也可以用大括号把case里面的东西都括起来。
否则定义的作用域是整个swich。
一条晚起的虫 2006-09-15
  • 打赏
  • 举报
回复
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
HDC hdc;
switch(uMsg)
{
case WM_LBUTTONDOWN:
MessageBox(hwnd,"lbuttondown","caption",MB_OK);
//HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,400,"输出一串文字",strlen("输出一串文字"));
ReleaseDC(hwnd,hdc);
break;
case WM_CHAR:
char szchar[20];
sprintf(szchar,"char is %d",wParam);
MessageBox(hwnd,szchar,"caption",MB_YESNO);
break;
case WM_PAINT:
//HDC hdc;
PAINTSTRUCT ps;
hdc=BeginPaint(hwnd,&ps);
TextOut(hdc,0,400,"输出一串文字",strlen("输出一串文字"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否关闭","qinchuan",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);

}
return 0;
}
DentistryDoctor 2006-09-15
  • 打赏
  • 举报
回复
第个Switch分支用{}括起来.
ascmvi 2006-09-15
  • 打赏
  • 举报
回复
还是不行啊
一条晚起的虫 2006-09-15
  • 打赏
  • 举报
回复
HDC hdc; //这个定义不要放到switch中,放到switch之前
wltg2001 2006-09-15
  • 打赏
  • 举报
回复
改成这样
#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);


int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WindowProc;
wndcls.lpszClassName="qinchuan";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW|CS_HREDRAW;

RegisterClass(&wndcls);
HWND hwnd;
hwnd=CreateWindow("qinchuan","window name",WS_OVERLAPPEDWINDOW,0,0,600,800,NULL,NULL,hInstance,0);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,hwnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;

}


LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{HDC hdc;
switch(uMsg)
{
case WM_LBUTTONDOWN:
MessageBox(hwnd,"lbuttondown","caption",MB_OK);

hdc=GetDC(hwnd);
TextOut(hdc,0,400,"输出一串文字",strlen("输出一串文字"));
ReleaseDC(hwnd,hdc);
break;
case WM_CHAR:
char szchar[20];
sprintf(szchar,"char is %d",wParam);
MessageBox(hwnd,szchar,"caption",MB_YESNO);
break;
case WM_PAINT:

PAINTSTRUCT ps;
hdc=BeginPaint(hwnd,&ps);
TextOut(hdc,0,400,"输出一串文字",strlen("输出一串文字"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否关闭","qinchuan",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);

}
return 0;
}
wltg2001 2006-09-15
  • 打赏
  • 举报
回复
你在窗口类中的窗口处理程序怎么qc啊,哪来的qc这个函数啊
wltg2001 2006-09-15
  • 打赏
  • 举报
回复
你确实在处理函数中定义了两个都叫hdc变量啊,一个在WM_LBUTTONDOWN中,一个在WM_PAINT中
KevinCEC 2006-09-15
  • 打赏
  • 举报
回复
Switch分支里有定义的,全部要用{}括起来.
jkgl548 2006-09-15
  • 打赏
  • 举报
回复
错误消息
无法解析的外部符号“symbol”


代码引用了链接器无法在库和对象文件中找到的内容(如函数、变量或标签)。

该错误信息之后为错误 LNK1120。
可能的原因

在将托管库或 Web 服务项目从 Visual C++ 2003 升级到 Visual C++ 2005 时,/Zl 编译器选项将添加到“命令行”属性页中。这将导致 LNK2001。请从“命令行”属性页中移除 /Zl,以解决此问题。有关更多信息,请参见 /Zl(省略默认库名)和如何:打开项目属性页。或者,将 msvcrt.lib 和 msvcmrt.lib 添加到链接器的“附加依赖项”属性中。

代码请求的内容不存在(例如,符号拼写错误或使用错误的大小写)。

代码请求的内容错误(使用的是混合版本的库,一些库来自产品的一个版本,而其他则来自另一个版本)。

具体原因

代码问题

如果 LNK2001 诊断文本报告 __check_commonlanguageruntime_version 是无法解析的外部符号,则请参见 LNK2019 获得有关如何解决该问题的信息。

成员模板的定义超出了类的范围。Visual C++ 的一个限制是,成员模板的定义必须完全位于封闭类内。有关 LNK2001 和成员模板的更多信息,请参见知识库文章 Q239436。

代码或模块定义 (.def) 文件中的大小写不匹配会导致 LNK2001。例如,当在一个 C++ 源文件中将一个变量命名为 var1,并试图在另一个源文件中以 VAR1 访问该变量时。

如果项目使用函数内联,但在 .cpp 文件而非头文件中定义函数,则会导致 LNK2001。

从 C++ 程序调用 C 函数但不使用 extern "C"(这导致编译器使用 C 命名约定)会导致 LNK2001。编译器选项 /Tp 和 /Tc 使编译器将文件分别编译为 C++ 或 C,与文件扩展名无关。这些选项会导致函数名与您所期望的名称不同。

试图引用没有外部链接的函数或数据会导致 LNK2001。在 C++ 中,内联函数和 const 数据具有内部链接,除非被显式指定为 extern。

缺少函数主体或变量会导致 LNK2001。如果只有函数原型或 extern 声明,编译器继续运行而不会出现任何错误,但由于没有保留函数代码或变量空间,链接器将无法解析地址调用或变量引用。

调用参数类型与函数声明中的参数类型不匹配的函数会导致 LNK2001。名称修饰将函数参数合并到最终修饰函数名中。

错误包含的原型导致编译器需要没有提供的函数体,这样会导致 LNK2001。如果同时具有函数 F 的类实现和非类实现,请注意 C++ 范围解析规则。

在使用 C++ 时,将函数原型包含在类定义中但未能包含实现(该类的此函数的实现)会导致 LNK2001。

试图从抽象基类的构造函数或析构函数调用纯虚函数会导致 LNK2001。纯虚函数没有基类实现。

试图在函数范围外使用用该函数声明的变量(局部变量)会导致 LNK2001。

在生成 ATL 项目的发布版本时,指示需要 CRT 启动代码。若要修复,请执行下列操作之一:

将 _ATL_MIN_CRT 从预处理器定义的列表中移除,以允许包括 CRT 启动代码。有关更多信息,请参见常规配置设置属性页。

如果可能,移除对需要 CRT 启动代码的 CRT 函数的调用,而是使用它们的 Win32 等效函数。例如,使用 lstrcmp,而不要使用 strcmp。需要 CRT 启动代码的已知函数是一些字符串和浮点函数。

ascmvi 2006-09-15
  • 打赏
  • 举报
回复
按照 lfchen(一条晚起的虫) ( )
的代码改了,但是还是不行
链接错误?? 是我的设置没对吗?但是我运行其他程序又能够运行



--------------------Configuration: aaabbb - Win32 Debug--------------------
Compiling...
aaabbb.cpp
Linking...
aaabbb.obj : error LNK2001: unresolved external symbol "long __stdcall qc(struct HWND__ *,unsigned int,unsigned int,long)" (?qc@@YGJPAUHWND__@@IIJ@Z)
Debug/aaabbb.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

aaabbb.exe - 2 error(s), 0 warning(s)
waterczh 2006-09-15
  • 打赏
  • 举报
回复
1.把所有的HDC hdc放到swtich外面;

2. 把WindowProc 改为 qc ;这个要汗一下!

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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