请问如何在 Dialog 中,动态加载图片控件?

解决方案 »

  1.   

    在运行时建立控件
    问:在SDI程序中,我需要在运行时于视类中(继承于CScrollView)构造及建立一个编辑框, 一个组合框以及一个按钮,并显示及处理它们的消息.答:这是通常使用的一个巧妙而简单方法   1)改写视中的OnCreate(),建立所有的控件以及相应的ID参数,然后在每个控件的Create() 初始化各自的尺寸;
      2)改写视中的OnSize(),以你所想的任何方式处理在OnCreate()建立的控件尺寸,比如容下他们.
      3)从控件常用的消息映像中处理你想处理的消息.在消息映像定义处你必须以建立时同一个ID 来处理该控件.这点你只能手工处理,因为类向导不能真正帮助你处理其类向导未知的控件的消 息.不过你可以通过下面的方法来完成(很容易理解):在一个对话框模板中放入相同的控件以及 相同的ID,用类向导建立消息处理句柄,将每个消息句柄拷贝至该控件的定义处,然后清除类向导 加入的消息映像入口以及原型.
      (第二个回答)首先你不要在OnDraw(), OnPaint()重画任何控件(象编辑框,列表框等等),你只需要做的 只是建立相应的控件,在你所说的例子中,你应在视中的OnInitialUpdate()建立控件.
    比如: m_pEdit = new CEdit; // m_pEdit is of type CEdit * - member of the viewclass
    m_pEdit->Create(WS_BORDER | WS_VISIBLE | ES_LEFT, CRect(0, 0, 20, 20),
    this /*pointer to parent window - important*/, 1001 /*id of control*/);
      接下来,控件自己会重画自己的(除非是定义为自画控件,这时你需要手工处理重画, 另外这不是在OnDraw()中实现).然后写为这些控件编写处理函数.下面给出所要做的.
      1.为你所想处理的消息增加一个消息映像,比如如果你想处理编辑框的change消息,那么 在BEGIN_MESSAGE_MAP() and END_MESSAGE_MAP()中加入ON_EN_CHANGE(1001 /* the controls id*/, CMyView::OnMyEditChange) in between CMyView::OnMyEditChange为你处理该消息的函数.CMyView是你的视类. 
      2.然后在.h中入函数声明 afx_msg void  OnMyEditChange();
      3.在cpp文件中实现函数的功能. void CMyView::OnMyEditChange()
    {
     // Your code here - to handle changes in the edit controls text.
    }