c++ mfc 代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ mfc 代码相关的知识,希望对你有一定的参考价值。

#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE preInstance,
LPSTR lpCmdLine,
int ncmdshow)

HWND hwnd;
MSG msg;
char lpszClassName[]="窗口";
WNDCLASS wc;
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=lpszClassName;

RegisterClass(&wc);

hwnd=CreateWindow( lpszClassName,
"windows",
WS_OVERLAPPEDWINDOW,
120,50,500,300,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,ncmdshow);
UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))

TranslateMessage(&msg);
DispatchMessage(&msg);

return msg.wParam;

LRESULT CALLBACK WndProc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)

switch (message)

case WM_LBUTTONDOWN:
MessageBeep(0);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);

return 0;


>.\mfc2.cpp(7) : error C2373: “WinMain”: 重定义;不同的类型修饰符
1> C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winbase.h(2560) : 参见“WinMain”的声明
1>.\mfc2.cpp(13) : error C2440: “=”: 无法从“LRESULT (__clrcall *)(HWND,UINT,WPARAM,LPARAM)”转换为“WNDPROC”
1> 使用 /clr:pure 和 /clr:safe 时,函数地址服从 __clrcall 调用约定;请考虑在目标类型中使用 __clrcall
1>.\mfc2.cpp(2) : error C3641: “WndProc”: 用 /clr:pure 或 /clr:safe 编译的函数的调用约定“__stdcall ”无效

用的vs2008 网上下了裸代码 编译 一样的错误 ……求高手指点。

参考技术A 如果你是MFC的库编译的,那么MFC库里面已经定义了WinMain函数了 参考技术B WinMain前面应该用CALLBACK修饰,是回调函数啊追问

不是……无效

追答

WinMain应该这么写
int CALLBACK WinMain(HINSTANCE hInstance,
HINSTANCE preInstance,
LPSTR lpCmdLine,
int ncmdshow)
wc.lpfnWndProc=WndProc;窗口函数应该加类型转换
wc.lpfnWndProc=(WNDPROC)WndProc;

追问

确实不行,这么写 仍然 : “WinMain”: 重定义;不同的类型修饰符

追答

你创建的是mfc文件?要是win32application的话这样没问题,要是mfc就悲剧了,的确是重定义了
C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winbase.h(2560) : 参见“WinMain”的声明
看这个去

本回答被提问者采纳

C++ MFC - 在 CDialog::OnSize 事件 (GetWindowRect) 上没有引发运行时错误的代码执行失败

【中文标题】C++ MFC - 在 CDialog::OnSize 事件 (GetWindowRect) 上没有引发运行时错误的代码执行失败【英文标题】:C++ MFC - code execution failure without throwing runtime error on CDialog::OnSize event (GetWindowRect) 【发布时间】:2014-05-15 10:41:12 【问题描述】:

我正在尝试访问 CDialog::OnSize 事件处理程序中的控件大小属性。代码编译并运行,但似乎在 GetWindowRect 处失败。我可以看到没有引发运行时错误,但是包括和跟随 GetWindowRect 调用的代码无法运行。

我在发布和调试模式下运行,断点位于适当的位置(未命中 GetWindowRect)。我还使用了修改 GetWindowRect 之后的一些成员变量的代码作为附加测试,我也可以看到它没有运行。

virtual void CMainFormDialog::OnSize(UINT nType, int cx, int cy) 

    ....

    auto pOutputEdit = (CEdit*) GetDlgItem(CE_OutputEdit);

    CRect pOutputEditRect;

    // No code is executed following this statement... 

    pOutputEdit->GetWindowRect(&pOutputEditRect);

    ....

我在这里尝试访问我的 CEdit 控件属性的方式是否有问题,为什么它会静默失败?

谢谢。

【问题讨论】:

您确认 GelDlgItem 不返回 NULL 吗? 刚刚检查过,是的,它确实返回 NULL。我在主对话框成员函数中使用相同的代码没有问题。我需要在事件处理程序中做些什么不同的事情? 好的,我知道现在发生了什么。第一次点击代码是在加载 UI 时。控件尚未初始化。随后的 OnSize 事件以 pOutputEdit != NULL 运行。问题已解决,谢谢。 【参考方案1】:

OnSize 可能在创建对话框时调用,此时可能尚未创建 CE_OutputEditCE_OutputEdit 是作为OnInitDialog 的一部分创建和绑定的。检查GetDlgItem的返回值,只有当它返回非NULL时才执行你需要做的事情。

如果需要,在您调用 CDialog::OnInitDialog 并完成其他必要的初始化后,使用设置为 true 的变量。然后在OnSize 中使用此变量来确定您是否应该进行处理。不管怎样,你还是应该检查GetDlgItem的返回值

【讨论】:

呃,不要添加标志。只需检查GetDlgItem 的返回值。这就是你应该做的无论如何 同意,我已经更新了我的答案以更好地反映这一点。

以上是关于c++ mfc 代码的主要内容,如果未能解决你的问题,请参考以下文章

SkylineGlobe MFC C++ 开发示例代码

C++ MFC - 在 CDialog::OnSize 事件 (GetWindowRect) 上没有引发运行时错误的代码执行失败

人人5分钟学会4行代码用C++编程实现任意形状窗体,不用MFC

MFC第1天--跟踪代码要抓重点--切记切记--侯杰复习C++ 2对象切割与虚函数P68

怎么用C++中的MFC随便画一条直线?老师说修改一下代码就行了,在哪里修改?怎么修改啊?大神,求帮啊。

c++编程 qt mfc