VC++(MFC)中动态创建和管理按钮控件,怎么做?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++(MFC)中动态创建和管理按钮控件,怎么做?相关的知识,希望对你有一定的参考价值。

基于MFC 的对话框应用程序

需要动态创建若干按钮(或者用其它控件形式?)来表示数据节点,类似地图标记效果
(http://zhidao.baidu.com/question/1957627632659261340.html?quesup2&oldq=1)
并且最好能够相应按钮单击事件。
现在的问题是,要创建的按钮要可以是无限多个,要怎么样去标示这些按钮控件呢?
而且,这是按钮控件的属性(比如按钮提示文本,在窗口中的位置信息等)是要保存在数据库中的,关闭软件再在下次打开时,需要自动加载。
怎么样实现?
求指导……
感谢大虾帮忙

动态Create按钮的时候,有个参数是ID,这个ID就可以用来相应按钮的单击事件。你把所有动态创建的按钮指针存放到map中,ID作为key,按钮指针作为value,这样就可以管理了。数据库中相似的也存Id,跟对应的一些属性,下次读入ID,又可以Create。追问

谢谢你的回答,给你我不少启发,不过还是有点不懂。
MFC中有个消息响应宏定义,如按钮按下消息:
ON_BN_CLICKED(IDOK, &CDlgAddEquipment::OnBnClickedOk)
IDOK就是按钮ID ,OnBnClickedOk 是响应函数,
如果是动态创建ID的话,事先的这个宏就没法写了吧,那怎么样实现单击事件的响应呢?
最好能给出一个简单代码示例,感激不尽。

追答

ON_COMMAND(id, FUNC)这样就通过按钮的id跟func这个函数映射起来了。这个消息映射要自己写。

追问

这个 id 可以用变量代替么?如果 id 在写代码的时候必须固定,那也就没办法做到动态映射了。

追答

可以,你试试不就知道了。

参考技术A 定义一个结构保存每一个节点信息。追问

不是定义什么的问题,是怎么定义的问题。
因为是要可以无限添加,就不能事先定义好,必须有一个动态创建和管理的机制。

追答

使用链表进行管理或使用MFC里面管理对象指针的类来管理。

MFC如何调用DLL(VC++)

我现在要用MFC对话框,点击确定按钮,弹出另一个用uistyler创建的对话框(db),现在有db.dll,db.cpp,db.h,db.lib等文件。用:

HINSTANCE dll123;
dll123=LoadLibrary("D:\\USER\\application\\db.dll");
if (dll123 == NULL)

MessageBox("can,t");


貌似加载成功了,但怎么运行啊?弹不出来对话框啊?

  你得自己调显示的函数啊。你加载模块了得调相应的函数显示啊。
  步骤如下:
  1.加载动态库(使动态库程序运行)
  HMODULE LoadLibrary(
  LPCTSTR lpFileName
  // 动态库的名称或全路径
  );//返回动态库的实例句柄(HINSTANCE)。
  如果dll文件与.exe文件在同一路径下,只需要写动态库名称,不在同一路径下,则需写带盘符的全路径
  2.
  获取函数地址
  FARPROC GetProcAddress(
  HMODULE hModule,
  // 动态库实例句柄
  LPCSTR lpProcName
  // 函数名称
  );//执行成功,返回函数地址。

  //现在才是你需要注意的地方,比如你dll中有一个show函数是显示对话框的,你就根据上面第2步传show参数得到的函数地址,通过函数指针直接调用就可以显示了。

  3.
  卸载动态库
  BOOL FreeLibrary(
  HMODULE hLibModule
  // 动态库实例句柄
  );追问

extern int call1 ( int *response )是db.cpp中的,应该是个入口,具体怎么做啊,能不能帮忙写下啊?

追答

我当调用这个函数能显示对话框啊。
1.typedef int (*DLL_CALL)(int* );//这是将函数指针类型定义出来,在头文件中的类声明前加上

2.在你调用LoadLibrary后会返回一个句柄hDll,想调用函数的时候

DLL_CALL myCall1 = (DLL_CALL) GetProcAddress( hDll, "call1" );
myCall1(/*内面填写你要传的参数*/);

现在就将call1函数调用了。
3.FreeLibrary(hDll);

你得确定call1确实是显示对话框函数,至少我从意思上看不像啊。db是数据库的

参考技术A HINSTANCE hInst = LoadLibrary(L"User32.DLL"); // 加载DLL
if(hInst)

// 加载成功
// 定义待访问函数原型
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
// 获取函数地址
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)

// 成功
fun(hWnd, RGB(0, 0, 0), 255, 2 | 1);

FreeLibrary(hInst); //释放 DLL


基本上就是这么一个流程,LoadLibrary->成功->获取函数入口点->调用函数->最后FreeLibrary,注意FreeLibrary是必须要实现的不然会造成资源泄漏。
参考技术B lib跟dll放一块儿

加入代码
#include "db.h" //或者写绝对路径

#pragma comment(lib,"db.lib") //或者写绝对路径

后面直接调用dll中的函数就可以了,参考db.h追问

db.h和db.lib已经加进去了,调用call1时,编译成功,但不能生成, error LNK2001: 无法解析的外部符号 _call1,该怎么办啊?

追答

在dll导出函数前面使用extern "C" __declspec(dllexport)修饰而不是extern,再重新生成dll。
你那个dll根本就没有把函数导出嘛

以上是关于VC++(MFC)中动态创建和管理按钮控件,怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

VC 怎么动态改变控件大小

怎么样在MFC中创建动态控件

MSVS 2008 如何MFC添加控件?

VC中按钮问题

MFC中如何让一个控件装载几个控件

如何使用 CSpinButtonCtrl 类在 MFC 中动态创建微调按钮控件?