VC的使用

github: 微软官方vc示例程序
关于vs2005、vs2008和vs2010项目互转的总结
旧的vs2005或2008工程项目转换成vs2010更高版本时遇到的3个问题

0、各种错误解决

1、error C4996: ‘strncpy’: This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
解决方法:项目属性-》c++ --》预处理器 —》预处理定义中加入:_CRT_SECURE_NO_WARNINGS。注意用;隔开。

2、error C4996: ‘WSAAsyncSelect’: Use WSAEventSelect() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
解决方法:有两种
(1)项目属性->C/C+±>常规,把SDL检查改成“否”,再次编译错误就没了。
(2)在 “stdafx.h” 文件中添加上下面这句
#define _WINSOCK_DEPRECATED_NO_WARNINGS 1 (这句不要放的太下面,放上面一点不然也会报错)
3、warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失…
(1)转换Code文件为Unicode格式;

(2)在Project -> Properties -> Configuration Properties -> C/C++ -> Advance 的 Disable Specific Warnings 中添加相应的警告编号:4819;

(3)或找出不符合Unicode格式的文件,然后在该文件的开始处加入下面的语句:

    # pragma warning (disable:4819)

(4)哪个文件出现这个警告错误,打开它, 用VS2010的查找替换功能,打开允许正则表达式选项,选择当前窗口,查找替换 \n 为 \n , 然后,这个世界就清净了。原因: 查找的 \n 是跨平台的回车,替换的 \n 却是当前代码页的回车了。

一、VC编译器的快捷键

F12/shift+F12		定义/实现
Alt+G				定义实现切换
Alt+O				.h.cpp切换
ctrl+-/ctrl+shift+-	后退前进
Ctrl+L 				剪切当前行
ctrl+shift+F		全局搜索
Ctrl+K+C			注释
Ctrl+K+U			取消注释
crtl+ alt+c			调用堆栈窗口,菜单:调试->窗口->调用堆栈,挂了别马上叉掉,去看调用堆栈

1、头文件和源文件间切换
有VAX: Alt+O
2、函数定义与实现间切换

有VAX: Alt+G
F12 :Goto definition,查看定义
Shift+F12 :Goto reference,查看实现

3、切换打开的文件视图
Ctrl+TAB 切换打开的文件视图,(顺序向后切换)
Ctrl+Shift+TAB切换打开的文件视图,(如果按住shift,顺序向前切换)
Alt + Tab 能够在最近查看过的两个文件之间切换。
Ctrl+PgUp 逆序切换工作区视图
Ctrl+PgDn 顺序切换工作区视图
在这里插入图片描述
在这里插入图片描述

4、查找
Alt+F3/Ctrl+F :查找
F3 :查找下一个
Shift+F3 :查找上一个

5、对称符号的切换
在源文件中定位光标到对称的#if, #endif,使用Ctrl+K.
Ctrl+]/Ctrl+E :寻找下一半括弧
Ctrl+Shift+] :寻找下一半括弧并选定括弧之间的部分(包括括弧)
Ctrl+Shift+E :寻找下一半括弧并选定括弧之间的部分(包括括弧)
Ctrl+} 匹配括号(),{}。// 如当时光标在"{" 处,则跳到配对的 “}”。如当时光标在"}" 处,则跳到配对的 “{”。

6、格式重排
Alt+F8 :自动格式重排

7、调试常用

Shift+F9 	QuickWatch, 并显示关标所在处的变量值
Alt+3 		Watch 查看窗口
Alt+4 		Variables 监视变量( 常用)
Alt+5 		显示寄存器
Alt+6 		显示内存( 常用)
Alt+7 		显示堆栈情况( 当机了多看看)
Alt+8 		显示汇编码

8、定位
Ctrl+G 跳到文件中第n 行
Ctrl+End :文档尾
Ctrl+Shift+End :选定从当前位置到文档尾
Ctrl+Home :文档头
Ctrl+Shift+Home :选定从当前位置到文档头

9、编辑
Ctrl+L :剪切当前行
Ctrl+Shift+L :删除当前行

10、点击文件自动定位到解决方案资源管理器中文件所在目录位置
Tools->Option->Projects And Solutions->General, tick “track Active Item in Solution Explorer”
工具-> 选项->项目和解决方案-> 常规-> 在解决方案资源管理器中跟踪活动项

11、vax最有用的几个快捷键:
VS 和Visual Assist X快捷键
(1)Alt + G: 在定义与声明之间互跳。
(2)Alt + O: 在.h与.cpp之间互跳。(O是字母O,不是数字零)
(3)Alt + Shift + Q:鼠标定位到函数名上,若是在h文件中,按此快捷键会弹出右键菜单,里面有个选项–创建定义;若是在cpp文件中,则按此快捷键会弹出右键菜单,里面有一个选项–创建声明。 这在定义好接口之后,再来写实现时,配合Alt+O是非常快捷的。当然,这种情况下,鼠标右击与Alt+O配合会更快,嘿嘿。
(4)Alt + Shift + R:当想改掉一个类名或是其他东西的命名时,可能已经有很多地方引用这个名称了,这时按下此快捷键,可以很方便的辅助你重命名。
(5)Alt + Shift + S:方便你寻找某个对象或变量等等。
(6)Alt + Shift + O:定位文件。项目文件太多时,这个会帮上大忙,当然,你的文件名命名最好有个比较好的规范。
(7)Alt + Shift + F:光标放到某个字符串上,按下此键,会找出所有引用了这个字符串的地方。
上面有些快捷键使用的前提是需要光标定位到函数或类、对象、变量名上。
12、classWizard快捷键
vc6: ctrl+w
vc2010: ctrl+shift+x
13、在Solution Explorer中,自动跟踪定位当前选中的文件
在主编辑区域,选中一个文件,在Solution Explorer自动跟踪定位该文件的位置
VS2010, VS2012 打开方式如下:
[Tools] -> [Options] -> [Projects and Solutions] -> [General]-> [Track Active Item in Solution Explorer]

二、自定义消息

VC6的ClassWizard不允许增加用户自定义消息,所以你必须手工进行添加。当你添加了自定义的消息以后,ClassWizard就可以像处理其它消息一样处理你定义的消息了。
一、VC6.0添加自定义消息步骤:

1、首先在用户类中声明自定义消息WM_SHOWTASK(当然可以为其他):

#define WM_MYMESSAGE WM_USER + 101

2、然后在类成员声明中声明消息处理函数

afx_msg void MyMessageProc();

3.1 头文件中加上自定义消息的处理函数原型
//在DECLARE_MESSAGE_MAP()语句之前,一对AFX_MSG之间加上如下形式的函数原型:

afx_msg LRESULT OnProcName( WPARAM wParam, LPARAM lParam )

//对Win32来说,wParam, lParam是传递消息最常用的手段。

3.2 在实现文件中加上接受消息映射的宏

在cpp文件里,BEGIN_MESSAGE_MAP语句之后,在一对AFX_MSG_MAP之间,增加 如下形式的代码:

ON_MESSAGE(WM_MYMESSAGE, OnProcName)

(如果用户需要一个整个系统唯一的消息,可以调用 SDK 函数 RegisterWindowMessage 并使用 ON_REGISTER_MESSAGE 宏指令取代 ON_MESSAGE 宏指令,其余步骤同上。)

4、在类实现文件中添加消息处理函数

LRESULT CMyDlg::MyMessageProc()

二、VC6添加自定义消息
1、定义消息。在Windows中,所有的消息都用一个特定的整数值来表示,为了避免自定义消息与已存在的其他消息发生冲突,应该利用Windows提供的一个常量:WM_USER,小于这个常量的是系统保留的。即用户自定义的消息至少为WM_USER+1,注意最后表示的消息的数值不要超过0x7FFF。在开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。

	#define UM_PROGRESS WM_USER + 100

2、在类头文件的AFX_MSG块中声明消息处理函数:

	class CMainFrame:public CFrameWnd{
	protected:
	//{{AFX_MSG(CMainFrame)
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnTimer(UINT nIDEvent);
	afx_msg LRESULT OnProgress(WPARAM wParam, LPARAM lParam);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()

3、在类的实现文件中,使用ON_MESSAGE宏指令将消息映射到消息处理表中。

	BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_MESSAGE(UM_PROGRESS, OnProgress)//注意这条语句的后面没有分号
	//}}AFX_MSG_MAP
	END_MESSAGE_MAP() 

4、实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。

	LPESULT CMainFrame::OnProgress(WPARAM wParam,LPARAM lParam){
	CRect rect;
	m_wndStatusBar.GetItemRect(2,&rect); //获得窗格区域
	//创建进度栏,注意第三个参数为CWnd* pParentWnd,根据情况选择父窗体
	m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,rect,this,123);
	m_progress.SetPos(50);
	return 0;
	}

5、在适当的时候发送自定义消息,进行消息处理。需要注意使用SendMessage还是PostMessage进行处理:SendMessage是消息处理完毕后再返回;而PostMessage则是把消息放到消息队列后立即返回。

SendMessage(UM_PROGRESS); //等待返回
PostMessage(UM_PROGRESS);//只发送
 ::PostMessage(hWnd, WM_MYMESSAGE, 0, 0);  //将自定义消息插入消息队列

如果用户需要整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。
三、VC2003添加自定义消息
在VC2003中添加自定义消息和VC6基本一致。需要注意的是VC6处理的消息可以没有参数,但VC2003消息处理的函数必须带有两个参数wParam和lParam,并且其返回值类型为LRESULT。这里,还有另一种方法可以实现地定义消息的处理(VC6和VC2003均适用):
1、定义消息:

#define UM_PROGRESS WM_USER + 100

2、重载CMainFrame的DefWindowProc函数,然后添加对用户自定义消息处理:

	LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
	{
	switch(message)
	{
		case UM_PROGRESS:
		{
			//通过指定资源ID获得相应的索引
			int index = m_wndStatusBar.CommandToIndex(IDS_PROGRESS); 
			CRect rect;
			m_wndStatusBar.GetItemRect(index,&rect);
			m_progress.Create(WS_CHILD|WS_VISIBLE,rect, &m_wndStatusBar,123);
			m_progress.SetPos(50);
			break;
		}
		default:
			break;
	}
	return CFrameWnd::DefWindowProc(message, wParam, lParam);
	}

何谓消息、消息处理函数、消息映射?
消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。具体的某个操作是你写的一系列代码。称为消息处理函数。在SDK中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络。一个switchcase语句就可以搞定,消息循环直到遇到WM_QUIT消息才会结束,其余的消息均被拦截后调用相应的处理函数。但在封装了API的MFC中,消息似乎变的有些复杂了,我们看不到熟悉的switchcase语句了,取而代之的是一个叫消息映射的东西。为什么MFC要引入消息映射机制,你可以想象一下,在现在的程序开发活动中,你的一个程序是否拥有多个窗体,主窗口就算只有一个,那菜单、工具条、控件这些都是子窗口,那我们需要写多少个switchcase,并且还要为每个消息分配一个消息处理函数,这样做是多么的复杂呀。因此MFC采用了一种新的机制。利用一个数组,将窗口消息和相对应的消息处理函数进行映射,你可以理解成这是一个表。这种机制就是消息映射。这张表在窗口基类CWnd定义,派生类的消息映射表如果你没有动作它是空的,也就是说如果你不手工的增加消息处理函数,则当派生窗口接受一个消息时会执行父类的消息处理函数。这样做显然是高效的。
MFC提供的消息结构
同时MFC定义了下面的两个主要结构:

AFX_MSGMAP_ENTRY
struct AFX_MSGMAP_ENTRY{
	UINT nMessage; // Windows消息的ID号
	UINT nCode; // 控制消息的通知
	UINT nID; // Windows控制消息的ID
	UINT nLastID; //表示是一个指定范围的消息被映射的范围
	UINT nSig; //表示消息的动作标识
	AFX_PMSG pfn; // 指向消息处理函数的指针
};


AFX_MSGMAP
struct AFX_MSGMAP{
	#ifdef _AFXDLL
		const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
	#else
		const AFX_MSGMAP* pBaseMap;
	#endif
	const AFX_MSGMAP_ENTRY* lpEntries;
};
///AFX_MSGMAP可以得到基类的消息映射入口地址和得到本身的消息映射入口地址。

MFC下一个消息的处理过程是一般是这样的。

1、_AfxCbtFilterHook截获消息(这是一个钩子函数)
2、_AfxCbtFilterHook把窗口过程设定为AfxWndProc。
3、函数AfxWndProc接收Windows操作系统发送的消息。
4、函数AfxWndProc调用函数AfxCallWndProc进行消息处理。
5、函数AfxCallWndProc调用CWnd类的方法WindowProc进行消息处理。

如何添加自己的消息?
我们已经了解了WINDOW的消息机制,如何加入我们自己的消息呢?好我们来看
一个标准的消息处理程序是这个样子的
在 CWnd 类中预定义了标准 Windows 消息 (WM_XXXX WM是WINDOW MESSAGE的缩写) 的默认处理程序。类库基于消息名命名这些处理程序。例如,WM_PAINT 消息的处理程序在 CWnd 中被声明为:
afx_msg void OnPaint();
afx_msg 关键字通过使这些处理程序区别于其他 CWnd 成员函数来表明 C++ virtual 关键字的作用。但是请注意,这些函数实际上并不是虚拟的,而是通过消息映射实现的。我们在本文的一开始便说明了为什么要这样做。
所有能够进行消息处理的类都是基于CCmdTarget类的,也就是说CCmdTarget类是所有可以进行消息处理类的父类。CCmdTarget类是MFC处理命令消息的基础和核心。

若要重写基类中定义的处理程序,只需在派生类中定义一个具有相同原型的函数,并创建此处理程序的消息映射项。我们通过ClassWizard可以建立大多数窗口消息或自定义的消息,通过ClassWizard可以自动建立消息映射,和消息处理函数的框架,我们只需要把我们要做的事情填空,添加你要做的事情到处理函数。这个非常简单,就不细说了。但是也许我们需要添加一些ClassWizard不支持的窗口消息或自定义消息,那么就需要我们亲自动手建立消息映射和消息处理的框架,通常步骤如下:
第一步:定义消息。Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。

#define WM_MYMESSAGE (WM_USER + 100)

第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。

LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam) 
{ 
	// TODO: 处理用户自定义消息,填空就是要填到这里。
	return 0; 
} 

第三步:在类头文件的AFX_MSG块中说明消息处理函数:

// {{AFX_MSG(CMainFrame) 
	afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); 
//}}AFX_MSG 
DECLARE_MESSAGE_MAP() 

第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。

ON_MESSAGE( WM_MYMESSAGE, OnMyMessage )

可以看出,用户自定义的消息和我们通过ClassWizard添加的消息一样,都是利用了ON_MESSAGE宏,建立的消息映射。

其实消息类别可以分成多种,上面说的只是其中之一。有三种主要的消息类别:(以下部分摘自MSDN)
1、Windows 消息
此类消息主要包括以前缀 WM_ 开头的消息,WM_COMMAND 除外。Windows 消息由窗口和视图处理。此类消息往往带有用于确定如何处理消息的参数。
2、控件通知
此类消息包括从控件和其他子窗口发送到其父窗口的 WM_COMMAND 通知消息。例如,当用户在编辑控件 (Edit Control)中执行可能更改文本的操作后,该编辑控件 (Edit Control) 将向其父级发送包含 EN_CHANGE 控件通知代码的WM_COMMAND 消息。该消息的窗口处理程序以某种适当的方式响应此通知消息,例如在控件中检索该文本。
框架像传送其他 WM_ 消息一样传送控件通知消息。但是有一个例外的情况,即当用户单击按钮时由按钮发送的 BN_CLICKED 控件通知消息。该消息被作为命令消息特别处理,并像其他命令一样传送。
3、命令消息
此类消息包括用户界面对象(菜单、工具栏按钮和快捷键)发出的 WM_COMMAND 通知消息。框架处理命令的方式与处理其他消息不同,可以使用更多种类的对象处理命令。
Windows 消息和控件通知消息由窗口来处理(窗口是从 CWnd 类派生的类的对象)。包括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及从这些基类派生的您自己的类。这些对象封装了 HWND——Windows 窗口的句柄。
命令消息可以由范围更广的对象(文档、文档模板以及应用程序对象本身)处理,而不仅仅由窗口和视图处理。当某一命令直接影响到某个特定对象时,应当让该对象处理此命令。例如,“文件”菜单中的“打开”命令在逻辑上与应用程序相关联:该应用程序接收到此命令时会打开指定的文档。因此“打开”命令的处理程序是应用程序类的成员函数。

命令消息我们比较常见的便是菜单项和工具条了,大家可以看到他的消息映射宏和窗口消息不太一样,一般的形式是这样的

ON_COMMAND(id,memberFxn)

第一个参数是命令ID,一个ID号对应一个消息处理,当然你可以让多个ID共用一个处理函数。常见的应用例如:菜单项打开文档的ID和工具条按钮打开文档的ID同时使用一个处理函数,或者直接将它们的ID设成相同的。

还有一种消息叫通知消息。例如树型控件的等一些复杂的控件在单击后需要传递更多的信息,例如光标的位置和当前项的一个结构,所以MFC为控件的每个通知消息也定义了一个宏,它长成了这个样子:

ON_CONTROL(EN_CHANGE,id,memberFxn)

还有很多种消息存在于MFC,宏定义有区别,大家可以触类旁通。

窗口消息有上百个。你可以从MSDN上查到WM_开头的,或者查看CWnd的成员函数,会给你列出很多,别忘了还有很多非窗口消息。
四、vs2010添加自定义消息步骤:
1.#define UM_MYMESSAGE WM_USER+1
2.在类向导中为对话框类选择 添加自定义消息
3.编辑自定义消息处理函数对应的代码。(一般在步骤2只是生成了函数名,还没函数体)
在这里插入图片描述

三、在指定控件上弹出右键菜单的三种方法

添加二级子菜单,需要继续添加选择响应函数,否则二级子菜单灰显。
(一)继承控件类,改写该类的OnContextMenu(CWnd* , CPoint point)函数

void CMyListBox::OnContextMenu(CWnd* , CPoint point)
{
    CMenu  menu; 
    VERIFY(menu.LoadMenu(IDM_LISTBOXPOPUP));//加载菜单资源
    CMenu*   pPopup=menu.GetSubMenu(0); 
    ASSERT(pPopup!=NULL); 
    pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this); //在鼠标当前位置弹出菜单

}

这种方法的优点是所有该类控件均支持同样的弹出菜单,从代码的可重用性来说效率是非常高的,你不用对每一个控件单独增加弹出菜单的代码,减少了代码编写的工作量。但这种方法需要新增加一个类,包括一个.h文件和.cpp文件,使得代码管理更加麻烦,特别类本来就比较多的程序中,同时如果你希望多个控件产生不同的右键弹出菜单,或者你需要产生右键弹出菜单的控件并不多,这种方法就显得比较呆板了

(二)修改控件所在窗口的OnContextMenu(CWnd* , CPoint point)函数

void CSmartHomeClientView::OnContextMenu(CWnd* , CPoint point)
{
	CRect rect;//定义矩形区域
	CMenu  menu; 
	VERIFY(menu.LoadMenu(IDM_FILEPOPUP));
	CMenu*   pPopup=menu.GetSubMenu(0); 
	ASSERT(pPopup!=NULL);  
	pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this); //在鼠标当前位置显示指定菜

}

(三)自定义右键消息

ON_COMMAND:是菜单和工具栏项处理消息的宏
ON_MESSAGE: 是处理自定义消息的宏
ON_NOTIFY: 是控件向其父窗口发送消息处理的宏

自定义ON_NOTIFY消息

//首先定义右键消息函数:
afx_msg  void  OnRBClick(NMHDR* pNMHDR, LRESULT* pResult);    

//然后在消息循环中定义消息对应关系:
ON_NOTIFY(NM_RCLICK, ID_TREECTRL, OnRbClick)

//接着定义消息函数内容:
void OnRBClick(NMHDR* pNMHDR, LRESULT* pResult)
{
	CPoint point;
	GetCursorPos(&point);
	CPoint pointInTree = point;
	m_TreeCtrl.ScreenToClient(&pointInTree);
	HTREEITEM item;
	UINT flag = TVHT_ONITEM;
	item = m_TreeCtrl.HitTest(pointInTree, &flag);
	if(item != NULL)
	{
	    m_TreeCtrl.SelectItem(item);
	    CMenu menu;
	    menu.LoadMenu(IDR_MENU1);
	    menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | 
	               TPM_RIGHTBUTTON, point.x, point.y, this, NULL);
	}
}

四、项目融合

多人项目整合在一起,不能将文件不能一次全加进来,要逐个类的h/cpp成对填加,否则报错:出现lnk2001无法解析的外部符号。

五、VC2017打开VC2019的工程

VS2017打开VS2019创建的项目的方法

解决办法:
1.项目属性—配置–常规–平台工具集–改为VS2017
2.项目-重定解决方案–10.0.17763.0

六、添加附加包含目录

1、区别
包含目录和附加包含目录(库目录和附加库目录)的区别:

包含目录:修改了系统的include宏的值,是全局的;
附加包含目录:用于当前项目,对其他项目没有影响。

(库目录和附加库目录的区别同上)

要使用一个库,除了要include其头文件以外(附加包含目录),还要在链接过程中把lib加进去(附加库目录、附加依赖项)。

2、添加方法:

附加包含目录—添加工程的头文件目录:项目->属性->配置属性->C/C++ ->常规->附加包含目录:加上头文件的存放目录;

附加库目录—添加文件引用的lib静态库路径:项目->属性->配置属性->链接器->常规->附加库目录:加上lib文件的存放目录;

附加依赖项—添加工程引用的lib文件名:项目->属性->配置属性->链接器->输入->附加依赖项:加上lib文件名。

当需要向项目中添加.dll动态链接库时,直接拷贝到exe运行文件夹下。
(项目->属性->配置属性->常规->输出目录,可以看到.exe生成在哪个目录下)。

七、快速改工程名

1、把xxx.sln、xxx.VC.db、xxx.vcxproj.user三文件和Debug、Release目录删掉
2、修改xxx.vcxproj、xxx.vcxproj.filters两文件的名称为新名字

八、控制台改窗口

项目属性-》链接器-》系统-》子系统:窗口

九、调试dll时设置主程序

项目–>属性–>配置属性–>调试->命令:
$(TargetDir)\testdll.exe
//因testdll.exe放在dll的生成的debug目录中

十、vc6打开多个工程

随便打开一个文件夹,然后在菜单中选 工具 -> 文件夹选项 -> 文件类型-> dsw-> 高级-> 选中open操作,点编辑按钮-> 把 "使用DDE " 复选勾去掉

11、VC2017使用mmscom串口控件

vc2017中使用MScomm

12、静态库、动态库的生成和使用

C/C++编程技术】动态库静态库开发
动态库的生成:注意导出符号

手动调用:

#pragma once

#ifdef MYSHAREDLIB_EXPORTS 		//这里替换为自己的动态库名称
	#define MYSHAREDLIB_API __declspec(dllexport)
#else
	#define MYSHAREDLIB_API __declspec(dllimport)
#endif

13、使文件和解决方案目录同步

VS2015-工具-选项-项目和解决方案- 勾选“在解决方案资源管理器中跟踪活动项”

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值