丐版逃跑按钮
前言就是窗口上有个按钮,然后鼠标过去按钮就移动。
正文新建MFC项目选中基于对话框用户界面的东西基本用不到高级功能打印也用不到其它都正常创建
核心思想跟网上流传的网页版本可能有区别吧,这个原理就是两个按钮,当发现鼠标要触碰到这个按钮就隐藏这个,启用另一个。
首先就是拖俩button控件
然后将左边的按钮属性中 可见 这一属性设为FALSE
那么跑起来的效果就是这样的,看不到左边
然后给这两个控件添加变量,[过程不做演示了,mfc用多了就习惯了]
123public: CButton m_btn_right; CButton m_btn_left;
对于对话框而言,能第一时间想到触碰按钮的消息,也就是跟鼠标移动有关的。那么显然是有这么一个消息的OnMouseMove
添加完之后
1234567891011void CRunningButtonDlg::OnMouseMove(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 CRect left, right; m_bt ...
MFC基础
前言微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
正文MFC为何物传统手工业,需要很多人,然后手工去操作,对于厂家而言,人工费高,质量不确定。而改用机器后,只需要投入材料,一天内的效应会大于人工,而且质量比较平均,当然不是所有的传统手工业都能被机器代替,只是部分。
这也就是普通c/c++代码和api的区别,经过多次封装它自然就变得看起来简单,复用性高。
MFC既然是微软设计的,自然只适合在windows上做应用开发,像xp、win7、win10兼容性肯定没得说,毕竟也是个亲儿子。不过目前的更新迭代之下,MFC的场景也会比较少,后面还有个跨平台的Qt。虽然少,但是老公司的项目没有转型之前,大部分还是需要维护的。可能外包比较多。
MFC的学习方式
(1.c++多态、2.windows ...
动态链接库
前言动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll”、”.ocx”(包含ActiveX控制的库)或者 “.drv”(旧式的系统驱动程序)。——百度百科
正文与之对应的在基础那会学过静态链接库.lib,要使用特定的功能,就必须加载这个静态库,这样在编译的时候其实exe就包含了这个lib。而现在的动态链接库,他只管调用,不去负责连接的过程,要么你写好了不用,他不发生连接,要么写了要用的时候才会去连接。
静态库编译完成后,已经和exe合并,所以这个exe会比较大。动态库在内存中连接,并没有本质上的合并,相对而言exe比较小,但是计算机如果缺失这个动态库,那么这个exe基本就废了。
windows常见的动态库(.dll)
gdi32.dll 绘图
user32.dll 用户界面有关的函数
kernel32.dll 内存、线程、进程
d3d9x_11.dll 绘图
动态链接库的意义
模块化
方便更 ...
windows文件处理
前言windows常见的文件操作有日志、操作配置文件、ini、注册表、音视频的文件存储。而linux系统具有一切皆文件的概念。
正文c/c++那会都是打开一个文件然后以什么模式,用完还要关闭。
c/c++ win32 mfc文件操作c文件操作fopen函数
1234_ACRTIMP FILE* __cdecl fopen( _In_z_ char const* _FileName, _In_z_ char const* _Mode );
fopen_s函数
12345_ACRTIMP errno_t __cdecl fopen_s( _Outptr_result_nullonfailure_ FILE** _Stream, _In_z_ char const* _FileName, _In_z_ char const* _Mode );
fwrite函数
123456_ACRTIMP size_t __cdecl ...
进程
前言进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。——百度百科
正文基本情况下,我们查看任务进程,包括kill一个未响应的进程,都会在任务管理器中操作。不过微软自己有个进程资源管理器看到的会更详细一点,链接戳此处
注:需要科学上网,不然很慢
进程实际上就一个纯粹的容器,进程本身不执行任何东西。代码的实现靠的的是线程,进程只相当于一个环境。子进程也还是一个进程,它是指由另一个进程(对应称为父进程)所创建的进程。子进程的线程既可以在父进程终止之后执行代码,也可以在父进程运行过程中执行代码。
创建进程CreateProcess用来创建进程的函数。其原型,参数一贯的又臭又长
123456789101112CreateProcessW( _In_opt_ LPCWSTR lpApplicationName, //该字符串可以指定要执 ...
线程-续
前言加上代码片段,markdown上一篇写的有点长了,自己都不好理了,还是分开写写吧。
正文内核对象
内核对象windows中的每个内核对象都是一个内存块,它由操作系统内和分配,并且只能由操作系统内核进程访问,应用程序不能在内存中定位这些数据结构并直接更改其内容。这个内存卡本质上是一个数据结构,其成员维护着与对象相关的信息。CreateFile如file文件对象,event事件对象,process进程,thread线程,iocompletatinport完成端口,mailslot邮槽,mutex互斥量和registry注册表等
内核对象的使用计数和生命周期因为所有者是操作系统内核,而非进程,所以说当进程退出,内核对象不一定就被销毁。初次创建内核对象,使用计数为1,当另一个进程获得访问权之后,使用计数+1,当使用计数为0,操作系统内核会主动销毁内核对象。
操作内核对象通过Create之类的函数构建,成功构建后返回句柄,否则返回NULL。在32位进程中,句柄是一个32位值;在64位进程中,句柄则是一个64位值。
内核对象和其他类型的对象windows除了内核对象还有,窗口、 ...
线程
前言线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。——百度百科
正文123456789101112131415#include <stdio.h>#include <windows.h>int main(){ while (true){ printf("hello\n"); Sleep(3000); printf("world!\n"); Sleep(5000); printf("hhhh\n"); Sleep(7000); } return 0;}
像上述代码中,我们依次延时输出 ...
网络截取文件
前言socket的基础语法看过了,但是要说掌握那也是没掌握住~往下看用到再补。
正文当然基础的截取,肯定先知道ip地址,然后权限开放程度高点。
123456int main(){ printf("Steal start!\n"); DoSteal("E:\\mysdk\\"); return 0;}
“E:/mysdk”,使用反斜杠的做法同样有效,似乎是起源于unix写法,linux也很好的传承了,比如/etc/hosts之类的,而双斜杠自然是为了转译,毕竟单斜杠就会转译后面的字符了,如果是中文那才是真的gg。
客户端能够多次使用,就做一个函数,传递的自然是文件路径,就用字符串,为了保证不被修改,加上const修饰
12345678int DoSteal(const char *filePath){ //遍历文件 WIN32_FIND_DATA FindFileData; //表示文件,记不住留印象下次翻文档 HANDLE hListFile; //文件以句柄表示 / ...
socket
前言所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。-百度说的
正文很好,百度说的太抽象看不懂。
c/s模式就是客户端和服务端
服务端
首先服务器启动之后,根据请求提供相应的服务。
打开一个通信通道,在某一地址和端口上接受请求。
等待客户请求达到该端口
接收到重复服务请求,处理该请求并发送应答信号。
返回第二部,等待另一客户请求
关闭服务器。
客户端
打开一个通信通道,并连接到服务器所在主机的特定端口。
向服务器发送服务请求,等待并接受应答;继续提出请求。
请求结束后关闭通信通道并终止。
常见端口,如http服务端口号为80,https为443等
ip地址和端口号win+r打开运行,输入cmd回车都是些基本操作了。
windows用ipconfiglinux用ifconfig就能查看最基本的几个网卡的信息 ...
vs2022空项目构建windows窗口报错
前言空项目的设置基本都是套console的,所以run不起来
正文批注不一致1_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPreInstance, _In_ LPSTR CmdLine, _In_ int nCmdShow
将WinMain里面的参数改成这样。
此方法不实用,后面改了即便不用这个也没影响
LNK2019无法解析的外部符号 _main,函数 “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ) 中引用了该符号
原有就是前言提到的,main函数是非图形化入库,windows的入口时WinMain。
所以要在项目属性里修改
将其修改为_WINDOWS原先是console的
同样的切换就好
编码一般情况下不要动
工具集虽然这里显示143,但是如果装的是142之类的应该是会向下兼容的,毕竟这个143现在还很杂有很多小版本。
除此之外其余的就不动了,然后之前写的就能编译了。
123456789101112#include<Windows.h>#inc ...