精华内容
下载资源
问答
  • VC chat.cpp

    2013-04-14 09:42:49
    VC做的聊天小程序 // Chat.cpp : 定义应用程序的类行为。 // #include "stdafx.h" #include "Chat.h" #include "ChatDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CChatApp BEGIN_MESSAGE_MAP...
  • VC6 1 创建一个 win32程序 创建类 #include .h 调用类中的函数 正确 2 创建一个 win32程序 创建类 将类在工程中删除 #include .h 调用类中的函数 会提示 error LNK2001: unresolved external symbol ...
  • 编写一个类似VC6添加文件,单击则动态显示一个Edit编辑框与一个Button。效果如下图: 1.新建一个类(如CMyListBox),继承自CListBox 2.头文件中定义Edit与CButton变量 CEdit m_edit; CButton m_btn; 3.定义一个...

    编写一个类似VC6添加文件,单击则动态显示一个Edit编辑框与一个Button。效果如下图:

    1.新建一个类(如CMyListBox),继承自CListBox

    2.头文件中定义Edit与CButton变量

    CEdit m_edit;

    CButton m_btn;

    3.定义一个初始化函数,供对话框调用。

    首先在.cpp中定义2个ID

    #define MY_EDIT 10001

    #define MY_BTN  10002

    void CMyListBox::Init()
    {
        m_edit.Create(WS_BORDER | WS_CHILD | ES_AUTOHSCROLL,CRect(0,0,10,10),this,MY_EDIT);
        // 设置字体
        // 方法一:
        HFONT hf = reinterpret_cast<HFONT>(::GetStockObject(DEFAULT_GUI_FONT));
        m_edit.SetFont(CFont::FromHandle(hf));
        // 方法二:
        //HFONT hf = CreateFont(22,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS,
        //    CLIP_DEFAULT_PRECIS,CLEARTYPE_QUALITY,FIXED_PITCH,_T("Courier New"));
        //if(hf != NULL)
        //{
        //    ::SendMessage(GetDlgItem(MY_EDIT)->m_hWnd,WM_SETFONT,reinterpret_cast<WPARAM>(hf),TRUE);
        //}
    
        m_btn.Create(_T("..."),WS_CHILD,CRect(0,0,10,10),this,MY_BTN);
    
        m_menu.LoadMenu(IDR_MY_MENU);
    }

    4.重载OnLButtonDown 与 OnLbnSelchange 函数

    (1)OnLbutton函数要做的是:

    获取数据个数(GetCount);

    判断左键按下是否在有效的行(GetItemRect); 不在,SetCurSel(-1);调用 更新显示函数(UpdateDisplay)。

    void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        // 获取个数
        int nCount = GetCount();
        int i = 0;
        CRect rc;
        for(i=0; i<nCount; ++i)
        {
            GetItemRect(i,rc);
            if(rc.PtInRect(point))
            {
                break;
            }
        }
    
        if(i >= nCount) // 未找到,不在
        {
            SetCurSel(-1);
            UpdateDisplay(); // 更新位置函数
        }
    
        CListBox::OnLButtonDown(nFlags, point);
    }

    (2)OnLbnSelchange函数:

    判断edit与button是否可见,可见则隐藏。更新显示(UpdateDisplay)

    void CMyListBox::OnLbnSelchange()
    {
        // TODO: 在此添加控件通知处理程序代码
        if(m_edit.IsWindowVisible())
        {
            m_edit.ShowWindow(SW_HIDE);
        }
        if(m_btn.IsWindowVisible())
        {
            m_btn.ShowWindow(SW_HIDE);
        }
        UpdateDisplay();
    }

    更新显示函数(UpdateDisplay):

    获取当前所选项(GetCurSel);为LB_ERR则让edit与button隐藏

    获取按下位置的当前矩形大小GetItemRect;

    edit与button根据获取到的矩形区域,设置rect,调用MoveWindow;

    获取当前行的text,更新到edit控件上显示。

    edit设置焦点。

    // 更新显示函数
    void CMyListBox::UpdateDisplay()
    {
        int index = GetCurSel();
        if(index == LB_ERR)
        {
            if(m_edit.IsWindowVisible())
            {
                m_edit.ShowWindow(SW_HIDE);
            }
            if(m_btn.IsWindowVisible())
            {
                m_btn.ShowWindow(SW_HIDE);
            }
            return;
        }
    
        CRect rc;
        GetItemRect(index,rc); // 获取在第几行
    
        CRect rcEdit(rc.left,rc.top,rc.right-20,rc.bottom+5);
        m_edit.MoveWindow(rcEdit);
    
        CRect rcBtn(rc.right-20,rc.top,rc.right,rc.bottom+5);
        m_btn.MoveWindow(rcBtn);
    
        // 更新Edit显示内容
        CString strContent;
        GetText(index,strContent);
        m_edit.SetWindowText(strContent);
        m_edit.SetSel(0,-1); // 全选
    
        if(!m_edit.IsWindowVisible())
        {
            m_edit.ShowWindow(SW_SHOW);
        }
        if(!m_btn.IsWindowVisible())
        {
            m_btn.ShowWindow(SW_SHOW);
        }
    
        m_edit.SetFocus();
    }

    动态按钮(MY_BTN):

    自定义消息与响应函数

    afx_msg void OnMyBtnClick();
    ON_BN_CLICKED(MY_BTN,OnMyBtnClick)

    响应为 弹出一个选择文件夹对话框,点击确定后,更新CListBox中内容。

    void CMyListBox::OnMyBtnClick()
    {
        CString strPath;
    
        TCHAR szDir[MAX_PATH];
        BROWSEINFO bi;    
        bi.hwndOwner = this->m_hWnd;
        bi.pidlRoot = NULL;
        bi.pszDisplayName = szDir;
        bi.lpszTitle = _T("请选择目录");
        bi.ulFlags = BIF_STATUSTEXT | BIF_USENEWUI | BIF_RETURNONLYFSDIRS;
        bi.lpfn = NULL;
        bi.lParam = 0;
        bi.iImage = 0;
    
        ITEMIDLIST *pidl = SHBrowseForFolder(&bi);
        if(pidl == NULL)
        {
            return;
        }
        if(!SHGetPathFromIDList(pidl,szDir))
        {
            return;
        }
        else
        {
            strPath = szDir;
            UpdateContent(strPath); // 更新CListBox数据
        }
    }

    更新CListBox数据UpdateContent:

    删除默认行,重新插入数据到当前行,末尾加上默认行,让edit与button隐藏

    // 更新ListBox内容
    void CMyListBox::UpdateContent(const CString str)
    {
        int index = GetCurSel();
        DeleteString(index);
        AddString(str);
    
        InsertFlagString();
        SetCurSel(-1);
        SetFocus();
    
        if(m_edit.IsWindowVisible())
        {
            m_edit.ShowWindow(SW_HIDE);
        }
        if(m_btn.IsWindowVisible())
        {
            m_btn.ShowWindow(SW_HIDE);
        }
    }

    4. 右键菜单:删除

    资源中添加菜单,类中定义一个CMenu变量。初始化时LoadMenu。

    右键按下时响应函数OnRButtonDown:

    void CMyListBox::OnRButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        CRect rc;
        CMenu *popMenu = m_menu.GetSubMenu(0);
    
        int nCount = GetCount();
        int i = 0;
        for(; i<nCount; ++i)
        {
            GetItemRect(i,rc);
            if(rc.PtInRect(point))
            {
                if(i == nCount-1)
                {
                    SetCurSel(-1);
                    popMenu->EnableMenuItem(ID_DELETE,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); 
                }
                else
                {
                    SetCurSel(i);
                    popMenu->EnableMenuItem(ID_DELETE,MF_BYCOMMAND | MF_ENABLED); 
                    break;
                }
            }
        }
        ClientToScreen(&point);
        popMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x,point.y,this);
    
        CListBox::OnRButtonDown(nFlags, point);
    }

    删除(ID_DELETE)添加处理函数OnDelete:

    void CMyListBox::OnDelete()
    {
        // TODO: 在此添加命令处理程序代码
        int index = GetCurSel();
        DeleteString(index);
    }

     

    此时,初步完成以上效果,当点击...按钮弹出 "选择文件对话框",点OK后,更新显示在ListBox中。唯一不足是,edit数据内容只能通过...按钮点确定后才更改,直接点击修改不起作用。可能需要窗口子类化。有时间再修改。

     

    转载于:https://www.cnblogs.com/sylar-liang/p/4120066.html

    展开全文
  • C# VC6调用VC6的动态库DLL 一 VC创建动态库 ...启动VC6.0, 新建一个“Win32 Dynamic-Link Library”工程...2. 打开vc_dll.cpp,在其末尾添加如下代码:  动态链接库导出的一般有两种调用协议,_stdcall和_cdecl

    C# VC6调用VC6的动态库DLL


    一 VC创建动态库


    1. DLL的创建
    启动VC6.0, 新建一个“Win32 Dynamic-Link Library”工程,选择“A simple dll project”的工程名称为Vc6MakeDll
    2.  打开vc_dll.cpp,在其末尾添加如下代码:
     动态链接库导出的一般有两种调用协议,_stdcall和_cdecl,默认是_cdecl
    // Vc6MakeDll.cpp : Defines the entry point for the DLL application.
    //
    #include "stdafx.h"
    BOOL APIENTRY DllMain( HANDLE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
          )
    {
        return TRUE;
    }
    extern "C" __declspec(dllexport) int add(int a, int b)
    {//没有使用,等同 _cdecl
     return a+b;
    }
    extern "C" __declspec(dllexport) int _stdcall sub(int a, int b)
    {//使用了 _stdcall
     return a-b;
    }
    3 编译选项
    在编译指定的dll时一般编译器会指定/MD进行编译,/MD选项不会把引用的相关Dll的引入库进行联接到你自己的Dll中,所以你要打开项目的属性,菜单 project--setting--C/C++—>在Category中选择—> 代码生成 Code Generation—> 在运行时库 Use run-time library 中选择 多线程(/MT)Debug Multithreaded,也就是将/MD编译改变为/MT ,然后编译生成动态库Vc6MakeDll.dll。
    4 查看函数的名称变动
    C:\Program Files\Microsoft Visual Studio\VC98\Bin\Dumpbin.exe
    使用vc自带工具Dumpbin.exe或者从网络上下载 eXeScope或者 Depends(更好)查看到
    使用_cdecl的函数add名称没有改变,而使用_stdcall 的函数 sub 的名称已经变为 _sub@8。
    调用时虽然vc6仍然使用sub,但其它语言就要使用_sub@8。因此,除非特别需要,建议使用_cdecl,以便各语言不用改名就能使用。
     
    --------
    二 VC6调用VC6的动态库DLL
     
    1 VC中加载DLL的LIB文件的方法有以下3种:
     (1) LIB文件直接加入到工程文件列表中
     在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中“Add Files to Project”菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。
     (2) 设置工程的 Project Settings来加载DLL的LIB文件
     打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件。
     (3) 通过程序代码的方式
     #pragma comment (lib,"x.lib"),还要把DLL对应的函数原型声明的头文件包含到其中 #include "x.h"
    2 VC6调用动态库DLL方法有以下2种:
     (1) VC6新建一个对话框工程Vc6UseVc6Dll
     (2) 将文件Vc6MakeDll.dll复制到本目录,也可能复制.lib和.h
    方法1:隐式链接,就是在程序开始执行时就将DLL文件加载到应用程序当中。
    // 使用以下预编译语句装入库
       #pragma comment(lib,"Vc6MakeDll.lib")
    // 使用以下语句导入函数声明,或者它们在头文件中 #include "Vc6MakeDll.h" 引入也可
       extern "C" _declspec(dllimport) int add(int a,int b);
       extern "C" _declspec(dllimport) int sub(int a,int b);
    void CVc6UseVc6DllDlg::OnButton1()
    {//需要有Vc6MakeDll.dll和Vc6MakeDll.lib
     char ch[90];
     int a=1,b=2,c=0;
     c=add(a,b);
     sprintf(ch,"%d+%d=%d",a,b,c);
     MessageBox(ch);
    }
    方法2:显式链接,是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件
    void CVc6UseVc6DllDlg::OnButton2()
    {//只需要有Vc6MakeDll.dll即可
     typedef int(*padd)(int a,int b);//定义指向和DLL中相同的函数原型指针
     typedef int(*psub)(int a,int b);
     HINSTANCE hDLL=LoadLibrary("Vc6MakeDll.dll");//加载动态链接库Vc6MakeDll.dll 文件;
     padd add=(padd)GetProcAddress(hDLL,"add");//得到函数入口地址
     c=add(a,b);
     sprintf(ch,"%d+%d=%d",a,b,c);
     MessageBox(ch);
     FreeLibrary(hDLL);//卸载MyDll.dll文件;
    }
    --------


    三 C#调用VC6的动态库DLL
    1 使用vs2010 创建一个,项目 -- Visual C# -- Windows窗体应用程序,名称为Vs2010CsharpUseVc6Dll
    2 将vc创建的动态库 Vc6MakeDll.dll 复制到工程执行目录\bin\Debug下面
    3 文件开头引用
    using System.Runtime.InteropServices; // 用 DllImport 需用此 命名空间
    using System.Reflection; // 使用 Assembly 类需用此 命名空间
    using System.Reflection.Emit; // 使用 ILGenerator 需用此 命名空间
    4 使用方法
      注意:与VC动态链接库导出的两种调用协议_stdcall和_cdecl对应,
    方法1:使用DllImport导入库, 需要StdCall和Cdecl,否则匹配错误。
          [DllImport("Vc6MakeDll.dll", EntryPoint = "add", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
          static extern int addY(int a, int b);//上面有EntryPoint ,这里就可以使用别名,注意使用Cdecl
          [DllImport("Vc6MakeDll.dll", EntryPoint = "sub", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
          static extern int subY(int a, int b);//上面有EntryPoint ,这里就可以使用别名,注意使用StdCall
    方法2:使用LoadLibrary,GetProcAddress,装载库和函数之后,在声明委托时要指定调用约定时,也要注意 StdCall和Cdecl
          //方法2  加入Cdecl等,否则调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配
          [UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]//注意使用Cdecl
          delegate int add(int a, int b);
     
          [UnmanagedFunctionPointerAttribute(CallingConvention.StdCall)]//注意使用StdCall
          delegate int sub(int a, int b);
     
    5 完整代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;// 用 DllImport 需用此 命名空间
    using System.Reflection; // 使用 Assembly 类需用此 命名空间
    using System.Reflection.Emit; // 使用 ILGenerator 需用此 命名空间
    namespace Vs2010CsharpUseVc6Dll
    {
        class csharp_call_vc6_dll
        {
            //这里是集成的用于访问动态库的一个C#类call_vc_dll
            //若要使用其它函数名,可以使用EntryPoint属性设置,如:
            //[DllImport("user32.dll", EntryPoint="MessageBoxA")]
            //static extern int MsgBox(int hWnd, string msg, string caption, int type);
            //其它可选的 DllImportAttribute 属性:
            //CharSet 指示用在入口点中的字符集,如:CharSet=CharSet.Ansi;
            //SetLastError 指示方法是否保留 Win32"上一错误",如:SetLastError=true;
            //ExactSpelling 指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配,如:ExactSpelling=false;
            //PreserveSig指示方法的签名应当被保留还是被转换, 如:PreserveSig=true;
            //CallingConvention指示入口点的调用约定,如:CallingConvention=CallingConvention.Winapi;


            //1 DllImport 调用没有静态变量的dll
            //2 使用LoadLibrary调用含有静态变量的dll,当然动态也可以
            [DllImport("kernel32.dll")]
            static extern IntPtr LoadLibrary(string lpFileName);
            [DllImport("kernel32.dll")]
            static extern IntPtr GetProcAddress(IntPtr hModule, string lpFuncName);
            [DllImport("kernel32", EntryPoint = "FreeLibrary", SetLastError = true)]//EntryPoint指原函数名
            static extern bool FreeLibrary(IntPtr hModule);//这里就可以是别名
            private IntPtr hModule = IntPtr.Zero;
            public IntPtr farFunc = IntPtr.Zero;
            public void LoadDll(string lpDllFileName)
            {
                hModule = LoadLibrary(lpDllFileName);
                if (hModule == IntPtr.Zero)
                    throw (new Exception(" 没有找到动态库 :" + lpDllFileName + "."));
            }
            public void LoadDll(IntPtr HMODULE)
            {
                if (HMODULE == IntPtr.Zero)
                    throw (new Exception(" 所传入的函数库模块的句柄 HMODULE 为空 ."));
                hModule = HMODULE;
            }
            public void LoadFun(string lpFuncName)
            { // 若函数库模块的句柄为空,则抛出异常
                if (hModule == IntPtr.Zero)
                    throw (new Exception(" 函数库模块的句柄为空 , 请确保已进行 LoadDll 操作 !"));
                // 取得函数指针
                farFunc = GetProcAddress(hModule, lpFuncName);
                // 若函数指针,则抛出异常
                if (farFunc == IntPtr.Zero)
                    throw (new Exception(" 没有找到 :" + lpFuncName + " 这个函数的入口点 "));
            }
            public void LoadFun(string lpDllFileName, string lpFuncName)
            { // 取得函数库模块的句柄
                hModule = LoadLibrary(lpDllFileName);
                // 若函数库模块的句柄为空,则抛出异常
                if (hModule == IntPtr.Zero)
                    throw (new Exception(" 没有找到 :" + lpDllFileName + "."));
                // 取得函数指针
                farFunc = GetProcAddress(hModule, lpFuncName);
                // 若函数指针,则抛出异常
                if (farFunc == IntPtr.Zero)
                    throw (new Exception(" 没有找到 :" + lpFuncName + " 这个函数的入口点 "));
            }
            public void UnLoadDll()
            {
                FreeLibrary(hModule);
                hModule = IntPtr.Zero;
                farFunc = IntPtr.Zero;
            }
        }
    }


    6 装载动态库,得到其函数地址的集成类
    这里是集成的用于访问vc6动态库的C#类csharp_call_vc6_dll.cs,来自网上
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices; // 用 DllImport 需用此 命名空间
    using System.Reflection; // 使用 Assembly 类需用此 命名空间
    using System.Reflection.Emit; // 使用 ILGenerator 需用此 命名空间
    public enum ModePass
    {
        ByValue = 0x0001,
        ByRef = 0x0002
    }
    namespace Vs2010CsharpUseVc6Dll
    {
        class csharp_call_vc6_dll
        {
            //这里是集成的用于访问vc6动态库的C#类csharp_call_vc6_dll
           
            //若要使用其它函数名,可以使用EntryPoint属性设置,如:
            //[DllImport("user32.dll", EntryPoint="MessageBoxA")]
            //static extern int MsgBox(int hWnd, string msg, string caption, int type);
            //其它可选的 DllImportAttribute 属性:
            //CharSet 指示用在入口点中的字符集,如:CharSet=CharSet.Ansi;
            //SetLastError 指示方法是否保留 Win32"上一错误",如:SetLastError=true;
            //ExactSpelling 指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配,如:ExactSpelling=false;
            //PreserveSig指示方法的签名应当被保留还是被转换, 如:PreserveSig=true;
            //CallingConvention指示入口点的调用约定,如:CallingConvention=CallingConvention.Winapi;


            //1 DllImport 调用没有静态变量的dll
            //2 使用LoadLibrary调用含有静态变量的dll,当然动态也可以
           
            [DllImport("kernel32.dll")]
            static extern IntPtr LoadLibrary(string lpFileName);
            [DllImport("kernel32.dll")]
            static extern IntPtr GetProcAddress(IntPtr hModule, string lpFuncName);
            [DllImport("kernel32", EntryPoint = "FreeLibrary", SetLastError = true)]//EntryPoint指原函数名
            static extern bool FreeLibrary(IntPtr hModule);//这里就可以是别名
            private IntPtr hModule = IntPtr.Zero;
            public IntPtr farFunc = IntPtr.Zero;
            public void LoadDll(string lpDllFileName)
            {
                hModule = LoadLibrary(lpDllFileName);
                if (hModule == IntPtr.Zero)
                    throw (new Exception(" 没有找到动态库 :" + lpDllFileName + "."));
            }
            public void LoadDll(IntPtr HMODULE)
            {
                if (HMODULE == IntPtr.Zero)
                    throw (new Exception(" 所传入的函数库模块的句柄 HMODULE 为空 ."));
                hModule = HMODULE;
            }
            public void LoadFun(string lpFuncName)
            { // 若函数库模块的句柄为空,则抛出异常
                if (hModule == IntPtr.Zero)
                    throw (new Exception(" 函数库模块的句柄为空 , 请确保已进行 LoadDll 操作 !"));
                // 取得函数指针
                farFunc = GetProcAddress(hModule, lpFuncName);
                // 若函数指针,则抛出异常
                if (farFunc == IntPtr.Zero)
                    throw (new Exception(" 没有找到 :" + lpFuncName + " 这个函数的入口点 "));
            }
            public void LoadFun(string lpDllFileName, string lpFuncName)
            { // 取得函数库模块的句柄
                hModule = LoadLibrary(lpDllFileName);
                // 若函数库模块的句柄为空,则抛出异常
                if (hModule == IntPtr.Zero)
                    throw (new Exception(" 没有找到 :" + lpDllFileName + "."));
                // 取得函数指针
                farFunc = GetProcAddress(hModule, lpFuncName);
                // 若函数指针,则抛出异常
                if (farFunc == IntPtr.Zero)
                    throw (new Exception(" 没有找到 :" + lpFuncName + " 这个函数的入口点 "));
            }
            public void UnLoadDll()
            {
                FreeLibrary(hModule);
                hModule = IntPtr.Zero;
                farFunc = IntPtr.Zero;
            }


        }
    }

    展开全文
  • VC++6的插件,放到C:\Program Files\Microsoft Visual Studio\COMMON\MSDev98\AddIns目录下直接可用. 使用时输入焦点放到CPP中的函数名行,直接点击快捷按钮就可自动提取函数名/参数生成函数说明.如下格式: /***...
  • vc6添加环境变量的支持

    千次阅读 2010-05-28 00:58:00
    在系统环境变量中自定义自己的环境变量,那样编译程序时,如果绝对路径变了,改环境变量就好了,不用再IDE中一个一个... 先编译一个lib, 头是ls.h, 实现是ls.cpp, 静态库是ls.lib把.h和.lib摆到自定义的include目录和

    在系统环境变量中自定义自己的环境变量,那样编译程序时,如果绝对路径变了,改环境变量就好了,不用再IDE中一个一个的改绝对路径。

    以前室友说:java好的地方就是把JAVA_HOME改下,再build就行了,方便的很。

     

    我现在想说:c++也行。

     

    先编译一个lib, 头是ls.h, 实现是ls.cpp, 静态库是ls.lib

    把.h和.lib摆到自定义的include目录和lib目录中供别的程序调用。

    设置自定义环境变量LS_INC和LS_LIB

    值得注意的细节是变量的路径值最后面不能有'/'符号,反正是个不带'/'符号的全路径名称。否则,编译时Link报错。

     

    以vc6为例,设置编译的头路径和库路径。

     

    在主程序中包含头文件和库文件

     

    build一下,通过。

     

    这种方便整洁的感觉很好~

    展开全文
  • 我想在vc6 mfc ClassWizard中添加成员变量,但是 Add Variable老是加灰,无法添加成员变量. 最后发现是因为对应的 .h和.cpp文件是只读,把对应的 .h和.cpp文件的只读属性关掉就可以了。 转载于:...
    我想在vc6 mfc ClassWizard中添加成员变量,但是 Add Variable老是加灰,无法添加成员变量.

    最后发现是因为对应的 .h和.cpp文件是只读,把对应的 .h和.cpp文件的只读属性关掉就可以了。

    转载于:https://www.cnblogs.com/finema/archive/2007/12/11/990485.html

    展开全文
  • OPC通信,6个官方VC源文件,并附详细添加步骤: OPC.h opccomn_i.h opcda_i.h OPC.cpp opccomn_i.c opcda_i.c 添加OPC类步骤.doc
  • VC6生成和调用lib

    2021-01-07 04:21:46
    win7, vc6; 新建一个win32静态库; 默认; 添加cpp文件; demo.cpp, demo.h; #include "demo.h" int iadd(int x, int y) { return (x+y); } #ifndef LIB_H #define LIB_H int iadd(int x, int y)...
  • win7-en-32 vc6 创建的mfc工程,openssl路径已经设置好,加入 ``` #include <openssl/ssl.h> #include <openssl/err.h> #include #pragma comment(lib, "libeay32.lib") #pragma comment(lib, "ssleay32.lib") #...
  • 如何用vc6创建和使用静态库(lib)

    千次阅读 2014-02-17 15:54:28
    vc6下建立工程的当前目录是当前工程的顶级目录(非debug目录)。...3、添加cpp文件,在cpp文件里实现函数 4、编译工程,编译后可以在该工程的Debug里发现一个.lib文件。 为了验证该静态链接库,
  • VC6使用GDI+示例

    2013-04-02 14:37:16
    3. 在你将要使用GDI+的cpp(或者加入xxxApp.cpp)中加入: #include "WwInitGdiPlus.h" static CWwInitGdiPlus __wwInitGdiPlus; ----------------------------------------------------------------
  • VC6+DDK编译环境配置

    千次阅读 2012-02-17 02:07:29
    1.使用VC6IDE创建一个makefile项目[TestDrv] 2.添加TestDrv.h,TestDrv.cpp并编写代码,代码内容略 3.设置项目,选择菜单[Project]->Settings  Command Line:  MakeDrv D:\WINDDK\2600 fre  Rebuild All ...
  • VC6的List控件默认是不能为subitem提供tooltip的,只有通过重写CListCtrl类来实现。在网上找了一个写好的CToolTipListCtrl类可以显示该功能,只需调用即可。具体步骤如下:  1.将ToolTipListCtrl.h和...
  • 下面将演示使用VC6编写静态库,然后在另一个程序中链接使用。 一、创建 static library 工程 选择 Win32 Static Library 不勾选预编译头和MFC,直接Finish 二、编写代码 添加一个头文件和一个cpp
  • vc6修改项目结构后,将源文件移到src和include目录。 因重新添加stdafx.cpp造成编译错误: fatal error C1083: Cannot open precompiled header file 此时只要打开.dsp文件,找到 [code=" "]SOURCE=....
  • <br />因为代码元素是只读的....多个解决办法 解决方案: 1、重启VC 2、打开Resource.h文件看看一看就知道了有些定义重复了...6、把你要添加事件的对话框相应的类文件(*.h和*.cpp)给关了就
  • VC6中使用CDialogBar类

    2011-05-13 14:56:00
    VC6中可以在资源中新建DialogBar的对话框资源,但在类向导中创建新类时却不见CDialogBar的踪影。好在MSDN上有手动添加的方法可以参考。 1.在新建类(CMyDiagBar)时,将基类选为CDialog 2.在...
  • log4cpp应用速成手册

    万次阅读 2006-08-09 17:22:00
    2 打开/log4cpp-0.3.4b/msvc6/msvc6.dsw 编译log4cpp工程Release版。 3 将编译后的log4cpp.lib复制到VC的Lib目录中。4 将头文件的目录log4cpp-0.3.4b/include/log4cpp/ 复制到VC的Include目录. (或者添加log4cpp-...
  • vc和evc的插件,支持添加注释,支持在.h和.cpp间切换,用tab切换代码。 这个本来是vc的插件,我移植到evc和pb上了。 使用方法,以vc为例(其他系统都差不多),菜单 Tools -> Customize -> Add-ins and Macro Files ...
  • vc6[1].0使用方法

    2011-11-11 14:44:49
    如果是楼主您有代码如:cpp文件,或 .h 文件,想添加VC6.0里来测试的话,可以这样做: 首先,要理解一下 文件扩展名为 ,cpp,和.h 文件扩张名是.h,代表的话头文件,一般是书写一些函数原型,以及一些在整个程序中常...
  • vc6控制台程序利用SoapToolkit3.0调用WebService 1. 首先要安装SoapToolkit3.0安装包并安装(我的安装目录为:D:\Program Files\MSSOAP\) 2. 新建vc控制台程序(空项目),项目名称:WinConsole6InvokeWebService...
  • MFC:VC6向VS2015重构过程

    2019-04-28 23:03:26
    20190428新发现 在Scan01.cpp中的InitEnveroment()中调用一句XXX的日志...1 在VS2015的解决方案下一定要添加XXXcommonl.lib静态库并且添加到项目中,若不添加会出现如下错误,函数被调用但是找不到声明,此时声明...
  • 四:添加文件会有影响吗? 五:解决办法 一:什么是工程? 一个工程就是一个exe文件,能够运行的是exe文件 二:什么事cpp文件? cpp文件是没有经过编译的源代码,cpp不能直接运行 三:工程和CPP文件的...
  • VC6学习经验积累

    千次阅读 2008-10-07 14:37:00
    个人经验,谨作抛砖引玉。欢迎共同探讨和批评指正!===============================2008/09/23处理MFC的ClassView中没有...一、在dialog的cpp添加MessageMap: BEGIN_MESSAGE_MAP
  • 启动VC6利用向导新建MFC规则共享DLL,如项目名:SQLStrBase 2.添加自定义的头文件和源文件,如:SQLStrSet.h和SQLStrSet.cpp 3.输出目录及拷贝头文件路径设置 3.1输出目录设置 Project->Setting.....
  • VC6如果想在stdafx.h中定义全局变量,由于该头文件会被include多次,所以,经常会出现以下经典的错误:already defined in StdAfx.obj。 解决方法:把该变量的定义int g_flag放到stdafx.cpp中,然后在使用的地方...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 214
精华内容 85
关键字:

vc6添加cpp