我是一名.NET程序员.我从未在MFC中开发任何东西.目前,我不得不为某些图像处理任务编写C++应用程序(控制台).我写完了.但关键是我需要为此设计GUI.好吧,不会有任何复杂的事情.只是一个窗口,有几个按钮,RadioButtons,复选框,PicturesBox和几个滑块.而已.
我正在使用VS 2008并期待一个.NET风格的表单设计器.
为了测试,我创建了一个MFC项目(具有所有默认配置),并且这些文件是默认创建的:
ChildFrm.cpp
MainFrm.cpp
mfc.cpp
mfcDoc.cpp
mfcView.cpp
stdafx.cpp
Run Code Online (Sandbox Code Playgroud)
现在,我找不到了Designer.没有视图>设计器.我打开了以上所有*.cpp并在代码编辑器中右键单击以查看"Designer View".ToolBox只是空的,因为我处于代码编辑器模式.
如何打开设计师?
我正在开发一个Windows Mobile应用程序,我遇到了一个问题CCommandBar,它结合了工具栏和菜单栏.嗯,我的意思是:
m_wndCommandBar.InsertMenuBar(IDR_MAINFRAME);
m_wndCommandBar.LoadToolBar(IDR_MAINFRAME);
Run Code Online (Sandbox Code Playgroud)
我的命令栏中只有一个根菜单选项和工具栏中的一些按钮.它在Windows Mobile 6.5.3版本上运行完美,但在WM 6.5.3上,所有工具栏按钮都与菜单项具有相同的尺寸:http://transaq.ru/cl_files/problem.png
是否有可能强制WM 6.5.3以与WM 5.0相同的方式绘制命令栏?当然,我只能使用工具栏并扔掉我的菜单栏,但我想保留旧的UI.
当我开始编程(大约10年以前)时,有三件事令我惊讶:
那时候,我接受了所有这些作为生活的事实.我能够创建自己的专用程序,但是"让我的程序运行的程序",代码编辑和表单编辑都是由神创造的,我无法用它们搞砸.
然后我去了大学,开了正规语言处理课程.学习了正式语法,解析器,抽象语法树等后; 关于编译器,口译员和代码编辑的所有魔力很快就消失了.编译器和解释器可以用合理而简单的方式编写,而语法突出显示代码编辑器可能需要的唯一不合理的东西是Windows API黑客攻击.
然而,直到今天,表格编辑对我来说仍然是一个谜.要么我缺乏制作表单设计师所需的技术知识,要么我有这样的知识,但是找不到使用它来实现表单设计器的方法.
使用Visual C++和MFC,我想实现一个受最佳表单设计师启发的表单设计师:

特别是,我想模仿我最喜欢的两个功能:
正在设计的表单位于容器内.因此,通过简单地将容器的尺寸调整到合适的尺寸,可以设计任意大的形式而不浪费太多的屏幕空间.
"与网格对齐"选项使得设计具有专业外观的用户界面不那么令人沮丧.事实上,我会说使用Visual Basic的表单设计器创建具有专业外观的用户界面实际上是简单,有趣和愉快的.即便是像我这样的左脑程序员.
所以,我有以下问题:
如何制作表单设计器,其中正在设计的表单位于容器内?被设计的表单是否包含在另一个窗口中的实际窗口?或者它只是表单设计师"手动"绘制的模型?
Windows API和/或MFC是否包含函数,类,以及任何可以轻松创建"可选择"项目的内容(选中时用小白框或蓝框包围,当被其中一个"抓住"时可调整大小"边")?
如何实现"对齐网格"功能?
在多线程应用程序中调试崩溃时,我终于在此语句中找到了问题:
CSingleLock(&m_criticalSection, TRUE);
Run Code Online (Sandbox Code Playgroud)
请注意,它正在创建一个CSingleLock类的未命名对象,因此在此语句之后,临界区对象会立即解锁.这显然不是编码员想要的.此错误是由简单的输入错误引起的.我的问题是,有些我可以防止在编译时自己创建类的临时对象,即上面的代码类型应该生成编译器错误.一般来说,我认为每当一个类尝试进行某种资源获取时,就不应该允许该类的临时对象.有没有办法强制执行呢?
我从未成为MFC的忠实粉丝,但这不是重点.我读到微软将于2010年发布一个新版本的MFC,这真让我感到奇怪 - 我认为MFC已经死了(没有恶意,我真的这么做了).
MFC用于新开发吗?如果是这样,那么好处是什么?我无法想象它对诸如C#之类的东西有任何好处(或者甚至只是使用Win32 API的c ++).
我有使用C和C++编写控制台和网络客户端/服务器应用程序的经验,但我对使用win32 visual API,MFC,Qt,wxWidgets等几乎一无所知.哪里是一个好的起点,我应该采用什么方法专注于,以便将来做好准备并且健壮吗?
我做得对吗?
我的一个客户有一个小组,我正在开发基于Qt的客户端 - 服务器的东西,有很多有趣的小部件和套接字.
公司内的另一个团队希望使用基于QTcpSocket的客户端数据提供程序类的封装版本.(基本上它听起来像,提供从服务器到客户端显示器的数据)
但是,该组有一个巨大的应用程序,主要是使用MFC构建的,这根本不会很快改变.基于Qt的DLL也是延迟加载的,因此在某些配置中可以在没有此功能的情况下部署它.
我有它的工作,但它有点hacky.这是我目前的解决方案:
DLL包装器类构造函数调用QCoreApplication :: instance()以查看它是否为NULL.如果它为NULL,则假定它在非Qt应用程序中,并创建它自己的QCoreApplication实例:
if (QCoreApplication::instance() == NULL)
{
int argc = 1;
char* argv[] = { "dummy.exe", NULL };
d->_app = new QCoreApplication(argc, argv); // safe?
}
else
d->_app = NULL;
Run Code Online (Sandbox Code Playgroud)
然后它将设置一个Windows计时器,偶尔调用processEvents():
if (eventTimerInterval > 0)
{
// STATE: start a timer to occasionally process the Qt events in the event queue
SetTimer(NULL, (UINT_PTR)this, eventTimerInterval, CDatabaseLayer_TimerCallback);
}
Run Code Online (Sandbox Code Playgroud)
回调只是使用timerID作为指向类实例的指针来调用processEvents()函数.SetTimer()文档说当HWND为NULL时它会忽略timerID,所以这看起来完全有效.
VOID CALLBACK BLAHBLAH_TimerCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
((BLAHBLAH*)idEvent)->processEvents(); // basically just …Run Code Online (Sandbox Code Playgroud) 我可以将a转换Double为CString使用_ecvt
result_str=_ecvt(int,15,&decimal,&sign);
Run Code Online (Sandbox Code Playgroud)
那么,有没有像上面这样的方法转换int为CString?
当我在Windows 7中运行Windows应用程序(MFC)时,我收到以下警告.
'XXX.exe': Loaded 'C:\2010\Debug\bin\plugins\control\libhotkeys_plugin.dll', Binary was not built with debug information.
请帮助我.谢谢
当我安装vs2017时,我确实选择了带有C++选项的Windows开发.但是,在安装之后,我没有看到已添加MFC.果然,我在编译应用程序时遇到错误,
致命错误C1083:无法打开包含文件:'afxwin.h':没有这样的文件或目录
我在控制面板中找不到我的vs2017安装的更改/修改选项.如何添加"Microsoft基础类C++"包?
mfc ×10
c++ ×4
visual-c++ ×3
qt ×2
winapi ×2
windows ×2
dll ×1
frameworks ×1
lifecycle ×1
media-player ×1
menubar ×1
temporary ×1
toolbar ×1