请教:我现在做了一个类似于VC开发环境的界面,现在想实点击某个按钮后,在右边的workspace嵌入一个DLL做的界面,在界面上显示一个曲线,当然曲线也是DLL自己画出的,说白了就是调用一个模块,将其嵌入到VC开发的界面中。我现在会从DLL调用函数和类。
请问:
      1.如何将界面写入DLL中?
      2.如何将它嵌入到VC开发的界面中?
      2.有没有相关的参考资料,有例子就更好了...     
    (分不够可以再加,系统不让发大于100分的帖子,谢谢 )
      

解决方案 »

  1.   

    当然可以。而且办法不少。
    没有具体从头开发过这样的工程,不过有几条供你参考:
    1.用Borland C++ Build之类的其它IDE开发带界面的DLL,VC只要知道其入口函数就行了。
    2.用VC开发DLL工程,可以尝试在DLL中创建窗口,并负责其消息循环(就行没有MFC时编写WIN32程序一样)。
    3.用VC开发DLL,可以尝试在DLL中直接用MFC的窗口。总之,窗口在哪里创建无所谓,只要你的DLL入口函数在执行时会调用窗口创建函数就OK了。
      

  2.   

    你的意思是不是把窗口封装到DLL里???这个窗口具有消息循环,能处理消息等和一般窗口的功能??
    唯一不同的就是这个窗口在DLL里??
      

  3.   

    以前倒写过一个这样的程序:把窗口封装到DLL,然后这个DLL向外提供个接口,只要加载这个模块,就弹出个窗口..
      

  4.   

    当然可以例子在这里:http://www.vckbase.com/code/listcode.asp?mclsid=13&sclsid=1303&page=2下载下面几个例子DLL输出对话框类的例子在Dll中创建对话框并调用 在动态连接库内封装应用程序框架
      

  5.   

    没问题,DLL里面插入对话框资源,该咋调用就咋用。
      

  6.   

    当然可以,不过映射都要自己添加,没有窗体框架直接给你用了~~  自己写main
      

  7.   

    谢谢各位,找到思路了...
    TO:lizigang34,你的理解很正确。如果方便的话请把你的例子发给我看下,谢谢,我的邮箱是[email protected]
      

  8.   

    主要就是通过DLL封装对话框在里面,用MFC的对话框,记得加上AFX_MANAGE_STATE(AfxGetStaticModuleState)..
    然后把对话框的位置移到你想要的位置。
      

  9.   

    发了几次都不成功..代码也不多,就贴出来吧..
    先创建DLL工程,下面是DLL.h,#ifdef      __cplusplus
            
    #define     DLL_API extern "C" __declspec (dllexport)
            
    #else
            
    #define     DLL_API __declspec (dllexport)
            
    #endif
    #include <windows.h>///////////////////////////////////////////////////
    //          导出函数
    /////////////////////////////////////////////////////功能: 新建一窗口
    //参数: void
    //返回: 成功返回TRUE,失败返回FALSE
    DLL_API BOOL  NewDialog();///////////////////////////////////////////////////
    //          内部函数
    /////////////////////////////////////////////////////功能: 窗口过程函数,和一般程序类似
    //参数: 
    //返回: 
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);下面是DLL.C#include  "NewDialog.h"#define MAX_LENGTH 100
            
    TCHAR     szAppName [] = TEXT ("StrProg") ;
            
    TCHAR szString [MAX_LENGTH + 1] ;int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
            
    {

            
               return TRUE ;
            
    }
            
    DLL_API BOOL  NewDialog()        
    {
             HWND                          hwnd ;
            
               MSG                   msg ;
            
               WNDCLASS              wndclass ;
            
       
            
               wndclass.style                               = CS_HREDRAW | CS_VREDRAW ;
            
               wndclass.lpfnWndProc                         = WndProc ;
            
               wndclass.cbClsExtra                          = 0 ;
            
               wndclass.cbWndExtra                          = 0 ;
            
               wndclass.hInstance                           = NULL ;
            
               wndclass.hIcon                               = LoadIcon (NULL, IDI_APPLICATION) ;
            
               wndclass.hCursor                   = LoadCursor (NULL, IDC_ARROW) ;
       //LoadCursor (NULL, IDC_ARROW) ;
            
               wndclass.hbrBackground              = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
            
               wndclass.lpszMenuName                = szAppName ;
            
               wndclass.lpszClassName               = szAppName ;
                       if (!RegisterClass (&wndclass))        
               {
       DWORD dwErr = GetLastError();

                      MessageBox (  NULL, TEXT ("This program requires Windows NT!"),
            
                                                                           szAppName, MB_ICONERROR) ;
            
                      return FALSE ;        
    }
                       hwnd = CreateWindow (szAppName, TEXT ("DLL Demonstration Program"),
            
                                      WS_OVERLAPPEDWINDOW,
            
                                      CW_USEDEFAULT, CW_USEDEFAULT,
            
                                     CW_USEDEFAULT, CW_USEDEFAULT,
            
                                      NULL, NULL, NULL, NULL) ;
            
       
            
               ShowWindow (hwnd, SW_SHOW) ;
            
               UpdateWindow (hwnd) ;
            
       
            
               while(TRUE)
    {
     if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ))
     {
     if(msg.message == WM_QUIT)
     {
    break;
     }
    TranslateMessage( &msg );
    DispatchMessage( &msg );
     }
     
    }
    UnregisterClass(szAppName, NULL);  
            
               return msg.wParam ;
            
    }
            LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)        
    {
            
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rc = {50, 50, 500, 400};
               switch (message)        
               {    case WM_PAINT:
    hdc = BeginPaint(hwnd, &ps);
    DrawText(hdc, "单击鼠标左键,弹出消息框", -1, &rc, DT_VCENTER);
    EndPaint(hwnd, &ps);
       break;
       case WM_KEYDOWN:
       switch(wParam) 
       {
       case 0x1B:
        CloseWindow(hwnd);
    // PostQuitMessage (0);
        break;
       
       }
      

       return 0 ;
       case WM_LBUTTONDOWN:
       MessageBox(NULL, "LButton Clicked", "", MB_OK);
       return 0;
       case WM_DESTROY:
       PostQuitMessage (0) ;   
      return 0;       
            
       }     
                   return DefWindowProc(hwnd, message, wParam, lParam);
            
    }下面创建一工程用于测试,我建的是控制台程序..#include "stdafx.h"
    #include "NewDialog.h"
    #pragma comment(lib, "NewDialog.lib")int main(int argc, char* argv[])
    {
    NewDialog();
    return 0;
    }
      

  10.   

    我要将DLL中的对话框嵌入到SDI中,这个对话框是不是必须是无模式对话框啊?
      

  11.   

    和窗口程序一样,自己创建按钮,再自己响应消息,但这些都得用SDK编程了.
    参考《Windows程序设计》。。