如何在静态库中使用MFC对话框资源

funnymoon_dncs 2012-11-19 03:11:57
有个问题请教下大家。我有一个动态库里面有一个CDialog类用来弹出对话框。现在我想把这个库改成静态的,这样就可以减少DLL的数量。目前有个问题,就是静态编译以后运行时弹出对话框的地方会出错。具体就在AfxGetResourceHandle这个函数。我查了下资料,说是静态库没有自己的资源,需要使用调用者的资源。调用者是个动态库。我尝试把静态库的资源加入到动态库的资源中,但是没有变化仍然会崩溃。

由于对话框比较复杂,不想弄一大堆API来实现这个对话框。所以在此请问下具体如何操作才能解决这个问题。谢谢大家的帮助。

附带说明一下,我使用的是VS2005,谢谢。
...全文
485 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
funnymoon_dncs 2013-01-06
  • 打赏
  • 举报
回复
引用 5 楼 bsnry 的回复:
引用 4 楼 funnymoon_dncs 的回复: AFX_MANAGE_STATE(AfxGetStaticModuleState()); 这句话一般在动态库里面含有MFC资源的时候使用。我在静态库中弹出对话框的函数前头已经加了这句话了的。我试过,无论有没有这句话都会崩溃的。 发代码到我邮箱,我帮你调试一下, 谢谢 邮箱你站内信里有
刚看见回信 源码比较大 我绕过这个问题了 谢谢
bsnry 2012-11-23
  • 打赏
  • 举报
回复
引用 4 楼 funnymoon_dncs 的回复:
AFX_MANAGE_STATE(AfxGetStaticModuleState()); 这句话一般在动态库里面含有MFC资源的时候使用。我在静态库中弹出对话框的函数前头已经加了这句话了的。我试过,无论有没有这句话都会崩溃的。
发代码到我邮箱,我帮你调试一下, 谢谢 邮箱你站内信里有
funnymoon_dncs 2012-11-21
  • 打赏
  • 举报
回复
AFX_MANAGE_STATE(AfxGetStaticModuleState()); 这句话一般在动态库里面含有MFC资源的时候使用。我在静态库中弹出对话框的函数前头已经加了这句话了的。我试过,无论有没有这句话都会崩溃的。
bsnry 2012-11-19
  • 打赏
  • 举报
回复
我觉得不是是你的静态库的问题 而是动态库吧 动态库被主程序调用,动态库中又有资源,因为已经静态库插入到你的 dll中了。 此时有2中法子解决 afxsetresourcehandle 还有afxmodulestatic 等宏吧 我记得不是很正确,大概是有这2中法子。 // // Make sure the MFC state is correct. // AFX_MANAGE_STATE(AfxGetAppModuleState()) // // The rest of your code... //
傻X 2012-11-19
  • 打赏
  • 举报
回复
静态库体积太大。建议DLL内容合并来减少DLL数量
尘中远 2012-11-19
  • 打赏
  • 举报
回复
AFX_MANAGE_STATE(AfxGetStaticModuleState());
在对话框调用函数最前面加上那句
//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
//		则从此 DLL 导出的任何调入
//		MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
//		该函数的最前面。
//
//		例如:
//
//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// 此处为普通函数体
//		}
//
//		此宏先于任何 MFC 调用
//		出现在每个函数中十分重要。这意味着
//		它必须作为函数中的第一个语句
//		出现,甚至先于所有对象变量声明,
//		这是因为它们的构造函数可能生成 MFC
//		DLL 调用。
//
//		有关其他详细信息,
//		请参阅 MFC 技术说明 33 和 58。
//
目 录 译者序 前言 第一部分 基础知识 第1章 窗口 2 1.1 窗口和API环境 2 1.1.1 三种类型窗口 2 1.1.2 客户区和非客户区 3 1.2 窗口和MFC环境 4 1.3 怎样应用MFC创建一个窗口 5 1.4 怎样使用MFC销毁一个窗口 9 1.4.1 捆绑到一个已有的窗口 9 1.4.2 窗口类 10 1.4.3 窗口进程 10 1.5 怎样使用MFC创建一个窗口类 11 1.5.1 使用AfxRegisterWndClass () 函数注册一个窗口类 11 1.5.2 使用AfxRegisterClass ()函数 创建一个窗口类 12 1.6 怎样销毁一个MFC窗口类 14 1.7 厂商安装的窗口类 14 1.8 其他类型窗口 15 1.9 桌面窗口 16 1.10 小结 16 第2章 类 18 2.1 基类 18 2.1.1 CObject 18 2.1.2 CCmdTarget 19 2.1.3 CWnd 19 2.2 应用程序、框架、文档和视图类 19 2.2.1 CWinApp(O/C/W) 20 2.2.2 CView (O/C/W) 21 2.3 其他用户界面类 22 2.3.1 通用控件类 23 2.3.2 菜单类 23 2.3.3 对话框类 24 2.3.4 控制条类 24 2.3.5 属性类 25 2.4 绘图类 25 2.4.1 设备环境类 25 2.4.2 图形对象类 25 2.5 文件类 26 2.6 数据库类 26 2.6.1 ODBC类 26 2.6.2 DAO类 27 2.7 数据集类 27 2.8 其他数据类 27 2.9 通信类 28 2.10 其他类 29 2.11 小结 31 第3章 消息处理 32 3.1 发送或寄送一个消息 32 3.1.1 发送一个消息 32 3.1.2 寄送一个消息 32 3.1.3 发送一个消息与寄送一个消息 的比较 32 3.2 怎样使用MFC发送一个消息 33 3.3 怎样用MFC寄送一个消息 33 3.4 三种类型的消息 34 3.4.1 窗口消息 34 3.4.2 命令消息 34 3.4.3 控件通知 34 3.5 MFC怎样接收一个寄送的消息 36 3.6 MFC怎样处理一个接收到的消息 36 3.7 处理用户界面的对象 44 3.8 创建自定义窗口消息 45 3.8.1 静态分配的窗口消息 45 3.8.2 动态分配的窗口消息 46 3.9 重定向消息 47 3.9.1 子分类和超分类 47 3.9.2 用MFC子分类窗口 48 3.9.3 重载OnCmdMsg ( ) 49 3.9.4 使用SetWindowsHookEx ( ) 49 3.9.5 使用SetCapture ( ) 49 3.9.6 专有的消息泵 50 3.10 小结 50 第4章 绘图 51 4.1 设备环境 51 4.2 在MFC环境创建一个设备环境 52 4.2.1 屏幕 52 4.2.2 打印机 53 4.2.3 内存 54 4.2.4 信息 54 4.3 绘图例程 55 4.3.1 画点 55 4.3.2 画线 55 4.3.3 画形状 55 4.3.4 形状填充和翻转 55 4.3.5 滚动 56 4.3.6 绘制文本 56 4.3.7 绘制位图和图标 56 4.4 绘图属性 56 4.4.1 设备环境属性 57 4.4.2 画线属性 58 4.4.3 形状填充属性 58 4.4.4 文本绘制属性 58 4.4.5 映像模式 59 4.4.6 调色板属性 62 4.4.7 混合属性 62 4.4.8 剪裁属性 63 4.4.9 位图绘制属性 64 4.5 元文件和路径 65 4.5.1 元文件 65 4.5.2 路径 66 4.6 颜色和调色板 66 4.6.1 抖动色 67 4.6.2 未经抖动色 67 4.6.3 系统调色板 67 4.6.4 使用系统调色板 68 4.6.5 动画色 71 4.7 控制什么时候在哪里绘图 71 4.7.1 处理WM_PAINT 71 4.7.2 只绘制被无效化的区域 72 4.7.3 处理WM_DRAWITEM 72 4.7.4 在其他时间绘图 73 4.8 小结 74 第二部分 用户界面实例 第5章 应用程序与环境 76 5.1 例1 规划MFC应用程序 76 5.2 例2 用AppWizard创建一个MFC 应用程序 79 5.3 例3 用ClassWizard创建一个类 83 5.4 例4 初始化应用程序屏幕 84 5.5 例5 保存应用程序屏幕 86 5.6 例6 处理命令行选项 88 5.7 例7 动态改变应用程序图标 91 5.8 例8 提示用户优先选项 93 5.9 例9 保存和恢复用户优先选项 97 5.10 例10 终止应用程序 100 5.11 例11 创建一个启动窗口 101 第6章 菜单 107 6.1 例12 使用菜单编辑器 107 6.2 例13 添加一个菜单命令处理函数 109 6.3 例14 根据当前可视文档动态改 变菜单 110 6.4 例15 启用和禁用菜单命令 111 6.5 例16 复选标记菜单命令 112 6.6 例17 单选标记菜单命令 113 6.7 例18 动态修改菜单 114 6.8 例19 动态修改系统菜单 116 6.9 例20 触发一个菜单命令 117 6.10 例21 创建弹出式菜单 117 第7章 工具栏和状态栏 120 7.1 例22 使用工具栏编辑器 120 7.2 例23 启用和禁用工具栏按钮 122 7.3 例24 为工具栏按钮添加字 123 7.4 例25 非标准工具栏大小 128 7.5 例26 保持工具栏按钮按下 129 7.6 例27 保持工具栏按钮组 一个按钮按下 130 7.7 例28 为工具栏添加非按钮控件 131 7.8 例29 修改应用程序的状态栏 136 7.9 例30 更新状态栏窗格 138 7.10 例31 为状态栏添加其他控件 139 第8章 视图 145 8.1 例32 滚动视图 145 8.2 例33 改变鼠标光标形状 147 8.3 例34 沙漏光标 148 8.4 例35 窗体视图 149 8.5 例36 列表视图 152 8.6 例37 动态分割一个视图 163 第9章 对话框和对话条 166 9.1 例38 使用对话框编辑器 166 9.2 例39 创建一个对话框类 168 9.3 例40 模式对话框 170 9.4 例41 无模式对话框 171 9.5 例42 在无模式对话框的控件间 切换焦点 172 9.6 例43 对话框的动画 173 9.7 例44 消息框 174 9.8 例45 对话条 176 第10章 控件窗口 182 10.1 例46 在任意位置创建一个控 件窗口 182 10.2 例47 用子分类定制一个通用 控件窗口 183 10.3 例48 用超分类定制一个通用 控件窗口 188 10.4 例49 在按钮上放置位图 190 10.5 例50 动态填充一个组合框 192 10.6 例51 排序一个列表控件 194 10.7 例52 分隔线控件 196 第11章 绘图 198 11.1 例53 绘制图形 198 11.2 例54 绘制文本 201 11.3 例55 从任意位置装入一个图 标并绘制 203 11.4 例56 从任意位置装入一个位 图和绘制一个位图 204 11.5 例57 从文件创建一个位图 206 11.6 例58 创建一个自绘位图 211 第三部分 内部处理实例 第12章 消息 215 12.1 例59 添加消息处理函数或重 载MFC类 216 12.2 例60 添加命令范围消息处理函数 219 12.3 例61 重定向命令消息 221 12.4 例62 创建自己的窗口消息 222 第13章 文件、串行化和数据库 225 13.1 例63 访问二进制文件 225 13.2 例64 访问标准I/O文件 227 13.3 例65 访问内存文件 228 13.4 例66 在数据类实现串行化 229 13.5 例67 串行化SDI或MDI文档 235 13.6 例68 按要求串行化 240 13.7 例69 透明地更新串行化的文档 242 13.8 例70 串行化多态类 246 13.9 例71 串行化数据集 248 13.10 例72 访问ODBC数据库 252 13.11 例73 访问DAO数据库 257 第14章 杂类 263 14.1 例74 剪切、拷贝和粘贴文本 数据 263 14.2 例75 剪切、拷贝、粘贴多信 息文本数据 268 14.3 例76 剪切、拷贝和粘贴二进制 数据 273 14.4 例77 数组函数 280 14.5 例78 列表函数 281 14.6 例79 映像函数 283 14.7 例80 系统键盘输入 285 14.8 例81 时间 288 第四部分 打包实例 第15章 库 291 15.1 例82 静态链接C/C++库 291 15.2 例83 动态链接C/C++库 295 15.3 例84 动态链接MFC扩展类库 300 15.4 例85 资源库 303 第五部分 附录 附录A 控件窗口风格 305 附录B 消息、控件通知和消息映像宏 323 附录C 访问其他应用程序类 328 附录D 开发注意事项 330 附录E MFC快速参考指南 339
使用GDI+库显示gif动态图片,该类接口如下: 可以看出,该ImageEx完全继承了基类的接口函数。 说明: 如果打开非多帧图片,该类几乎完全等价于基类,比如你可以把该类的对象代入Graphics类系列的成员函数; 如果打开的是多帧的图片,你只要打开图片后不调用InitAnimation函数(它会创建线程),则上述做法依然可以; 但如果调用InitAnimation函数后(单帧图像没关系,因为不会创建线程),则不可以了, 所有的基类继承过来的接口成员函数和配合gdi+库其他类的函数调用都是不可以的,因为没有作线程同步, 你只能调用下面位数不多的几个public成员函数,调用Destroy成员函数后,则就可以了,因为它会关闭线程。 其实你会发现下面的public成员函数操作的成员变量都是新增的成员变量,没涉及到线程同步问题。 class ImageEx : public Image { public: //以长度为nSize的内存pBuff的内容构造图像 ImageEx(const void* pBuff, size_t nSize, BOOL useEmbeddedColorManagement = FALSE); //以类型为sResourceType,名称为sResource的资源构造图像 ImageEx(LPCTSTR sResourceType, LPCTSTR sResource, BOOL useEmbeddedColorManagement = FALSE); //以文件构造图像 ImageEx(LPCTSTR filename, BOOL useEmbeddedColorManagement = FALSE); //调用Destroy成员函数 ~ImageEx(); public: //如果已经构造的对象是动画,则创建动画线程,并返回true, //如果为静态图像或已经创建过动画线程,则也返回false // 图像将绘制在m_hWnd客户区的rect区域,会拉伸,支持镜像 bool InitAnimation(HWND hWnd, RECT rect); //判断是否为动画 bool IsAnimatedGIF() { return m_nFrameCount > 1; } //设置动画暂停与否 void SetPause(bool bPause); //判断动画是否处于暂停状态 bool IsPaused() { return m_bPause; } //关闭动画,事实上基类Image还有的两个成员变量没有关闭,因为析构函数会调用基类析构函数进行关闭的 void Destroy(); //另外的非public的东西省略.. }; 用法: MFC对话框程序在下面添加: BOOL CTestDlgDlg::OnInitDialog() { CDialog::OnInitDialog(); //其它的初始化代码 // GDI+ //m_image为ImageEx指针类型成员变量,"GIF"为资源类型,"HEARTS"为资源名称 m_image = new ImageEx( _T("GIF"), _T("HEARTS") ); RECT rc; GetClientRect(&rc); m_image->InitAnimation(this->m_hWnd, rc);//创建gif播放线程 return TRUE; // return TRUE unless you set the focus to a control } CTestDlgDlg::~CTestDlgDlg() { // GDI+ delete m_image; } 其的m_image = new ImageEx( _T("GIF"), _T("HEARTS") );你可以换成ImageEx类的另外两个构造函数
VS2013 MFC 编程基础,共有19个专题实例,作为VS2013、VC++和MFC开发的基础入门资料,对初学者很有帮助!N和weet45厘序量D以量 #目度 M用啊 Mnua ca+程 WICELL 名啊 位 B日经验 进入应用程序向导,一开始会给出默认的项目配置,点击“下一步”即可 MFC应用柱序:Deme 欢使用Mc应用程序向导 鞋速 这些是当前啧自设置: 应用程序典型 送卡式多交检界面O) 无数据斥查持 合文植支持 不持复台交档 文档幔属性 可自定义某单栏和工具栏界面 数据支持 YiYuN studie200应用程序外观 节u$φ项目样式阗有资管理器画格、输出格和属性面格 用户畀击功 ·重新启管理器支持新打开文档,应用程序恢复) 亮级功能 在任一画囗单击“完成”,接受当前设置● 生的疯 项目后请该项目的rtt文件,了解有兴项目功能和所生的文件的 上到『元础 选择“基于对话框”, 可以选择在静态库使用,或者在共享使用。一般选择共 亨使用就行,静态库使用会把所有用到的集成到文件,最终生成的文件一般可 以直接使用,但占用更大空间。 MFc应用程度肉导Demo 应周程序卖型 成用程岸类 目共 应用程序典型 ◎单个文档巴) 复合文植支持 多个植思 酒管理器) 文档板国性 □选项卡式文档0) 提支 蓝十对话① Orifice Ur 用户卿面功能 □使用对话粗q 视武样式和色①D 亳级功能 无略星的控件@ is当本机/认 生的 $个级文档①) 口启闻体式切c 团究档/视图持 C的使用 在共享L使用c 区安全开发生命周期6〕检置c 在静态库使用cg 资语语言) 交傳;国) 选择主框架样式,可以自由选择是否添加最小化框、最大化框。如果觉得没必要“关于″对 话框也可以去掉,对话框标题一般不需要更改 MFC应用序匀导:Demo 用户畀面功能 粗速 主粗样式 命任碳单/工具栏/能区 应用程序英型 框粗架① @便用经肉单 复合文植持 团使用传始停工具栏收 四量大化框 □使用器样到的工具栏 挡板国性 国量小化 O使用单仁和工具栏 量大化g 团用户定义的工具栏和②) 户卿面功 d系统单① 个性化单行为 级功能 “关于糕更 回初态栏0D 使用功能区 生欣的 口括分面口) 对话标题 于粗式 子量小化 团子最大化粗( 口子最大化② 上步口产燕 高级功能一般默认即可,但如果用不上 控件”可以去掉勾选;如果需要涉及网络 编程就把“ 套接字”选上。不过没选上也不要紧,在程序可以自己添加部分代码 导入套接字。 MFc应用序向导Dema 高级功齬 粗速 级功能 色格: 口打印和打印Q □资富度器得窜面格② 应用程序典 自动化 合文植支持 □国性傅面临 交档板国性 口导航面格 据库支持 □标任 用户界面功糙 已L售y) 公控否单思 高级其单项显示/蒙活面格吧 幕级功能 团支持亚新理器 最近文列离上的文件数① 生邱的 □重新打开以打开的档① 口支应用程岸复0 〈上一步[下-步习□ 最后是自动生成的两个类的头文件和源文件名称,可以修改基类,但一般不用改,默认完成 就行。至此,一个基于对话框的项目就创建好了。 MFc应用序导Dmo 生兩的 生成的 应用程序典型 已E+g 合文植支特 文档吸板国性 数支持 卖名① h交件② 用户界面功糙 Damotlg h 级功能 》又件電) 山建 AmalG cpp B温 CDHamlDi aloe 当工1 d经验 jingyan.baidu.com 注意事项 合理的向导设置可以减少后续编程的麻烦 基于对话框编程:项目整体结构 当我们创建好一个项目以后,为了更快速的编程,快速找到需要修改的部分这就得熟悉 开发环境的各个模块的作用,各个模块之间的关系。 工具原料 项目整体结构 创建好一个工程,观察项目界面的布局,上面是菜单栏和工具栏,在设计界面的左 侧可以调出工具箱;右侧是属性栏、类视图、资源视图和资源管理器等;底部是一些显示错 误信息、符号查询结果、项目生成信息的栏目;最下方是状态栏,显示当前开发状态。 应南计断酒 d经验 ingyanbaidu.com 打开解决方案资源管理器,可以看到所有的头文件、源文件以及资源文件都归类排序摆放, 便于快速寻找需要打开的内容。点开头文件前面的三角号可以查看类的成员变量和函数。 解决方案资源铛理器 X 搜素解决方客资源管理器(Ctrl+) 丙解央方案"Demo"(1个项目) Demo 头文件 p画 Demo.h L DemoDlg, h +s CDemoDlg CDemo Dlg(CWnd b e unnamed enum 0005 1 DoData Exchange(CDatal 回 IDD DEMO DIALOG hIc 4. OnInitDialog0 2. OnPaint * OnQueryDraglcon0 4. On Sys Command(UINT, LPAR. p画 Resource. h stdatx. h D targeteer. h p外部依项 源文件 Demo, cpp D * DemoDlg cp + stdafxcpp 资源文件 园 Demo. ico Demo. rc B Demo. rc2 自 ReadMe tBa经验 lingyanbaidu.com 看看资源视图,资源视图包含了应用程序用到的所有资源,包括对话框资源、应用图标、菜 单、字符串、软件信息等等。 资源视图-Demo A图Demo Demo, rc 当 Dialog 国 IDD ABOUT BOX 国 IDD_DEMODIALOG d Icon B IDR MAINFRAME a String Table 回 String Table 向 Version 画 S VERSION INF Baid经驵 jingyan. baiducom 打开版本信息,可以看到自己编写的应用程序的相关信息,比如版本号、公司名称等,自己 觉得需要修改的可以依情况修改。 wwtn lgds kaner 工1 1b aeoutedx 用人系 2贴N人M L01 Ba 经验 jingyan.baidu.com 再看类视图,类视图包含了应用程序用到的所有类,包括自动生成的类以及开发者自己创建 的类。点击类名,在下方会显示该类包含的所有成员变量和函数,不同类型的函数或者变量 都有不同的符号标记。 通过类视图可以快速访问类的头文件和源文件,双击类名打开头文件,点击下方的函数可直 接跳转到对应的函数定义处 类视图 口X ⊙。·年 ≤搜素 pom映射 宏和常量 6全局函数和变量 b t CAboutDIg p CDemoApp 4t CDemoDlg 9 CDemoDlg(CWnd"pArent =NULL) o. Do Data Exchange(CDataExchange'pDX Q@, OnInit Dialog @. On Paint 6. OnQueryDraglcon0 9. OnSys Command(UINT nID, LPARAM IParam a m hIcon Baid经验 jingyanbaidu.com 属性页用来修改和査看对话框控件(包括对话框本身)的各项属性,毎类控件的属性项都 不一样,需要根据情况修改,当然所有的属性都可以以代码形式实现,但能直接修改最好 方便快捷。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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