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 网上下了裸代码 编译 一样的错误 ……求高手指点。
不是……无效
追答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_OutputEdit
。 CE_OutputEdit
是作为OnInitDialog
的一部分创建和绑定的。检查GetDlgItem的返回值,只有当它返回非NULL时才执行你需要做的事情。
如果需要,在您调用 CDialog::OnInitDialog
并完成其他必要的初始化后,使用设置为 true 的变量。然后在OnSize
中使用此变量来确定您是否应该进行处理。不管怎样,你还是应该检查GetDlgItem
的返回值
【讨论】:
呃,不要添加标志。只需检查GetDlgItem
的返回值。这就是你应该做的无论如何。
同意,我已经更新了我的答案以更好地反映这一点。以上是关于c++ mfc 代码的主要内容,如果未能解决你的问题,请参考以下文章
C++ MFC - 在 CDialog::OnSize 事件 (GetWindowRect) 上没有引发运行时错误的代码执行失败
人人5分钟学会4行代码用C++编程实现任意形状窗体,不用MFC
MFC第1天--跟踪代码要抓重点--切记切记--侯杰复习C++ 2对象切割与虚函数P68