C++ get知识 ——每天学习一点点

来源:互联网 发布:手写文字图片制作软件 编辑:程序博客网 时间:2024/05/30 23:03
1:
COORD:是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。其定义为:
typedef struct _COORD {
SHORT X; // horizontal coordinate
SHORT Y; // vertical coordinate
} COORD;


2:
HANDLE:句柄,是Windows用来表示对象的(不是C++的对象),HWND是其中一种,HWND是HANDLE,但HANDLE不只是HWND,HANDLE是一个通用句柄表示,HWND是一个专用表示窗口的句柄。包含在winnt.h头文件中。
HANDLE(句柄)是Windows操作系统中的一个概念。在Windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为它们分配内存,并返回标示这些资源的标示号,即句柄。句柄指的是一个核心对象在某一个进程中的唯一索引,而不是指针。由于地址空间的限制,句柄所标识的内容对进程是不可见的,只能由操作系统通过进程句柄列表来进行维护。句柄列表:每个进程都要创建一个句柄列表,这些句柄指向各种系统资源,比如信号量,线程,和文件等,进程中的所有线程都可以访问这些资源。

3:
SetConsoleCursorPosition:如果用户定义了 COORD pos,那么pos其实是一个结构体变量,其中X和Y是它的成员,通过修改pos.X和pos.Y的值就可以实现光标的位置控制。
//设定光标的位置

4:
srand函数:是随机数发生器的初始化函数。原型:void srand(unsigned int seed);
srand和rand()配合使用产生伪随机数序列。rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列
eg1:

#include <stdio.h> 

#include <iostream> 

#include <time.h> 

using namespace std; 

#define MAX 100 

int main(int argc, char* argv[]) 

       srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的

随机种子.应该放在for等循环语句前面 不然要很长时间等待

for (int i=0;i<10;i++) 

cout<<rand()%MAX<<endl;//MAX为最大值其随机域为0~MAX-1

   return 0; 



5:
kbhit():功能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
         用 法:int kbhit(void);
         包含头文件: include <conio.h>
         在VC++6.0下为_kbhit()
         功能及返回值同上;

6:
getch():这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性!

7:
SLEEP:是一种函数。
作用:延时,程序暂停若干时间。
时间,就是他的参数,单位是毫秒。
例如:
Sleep (500) ; //注意第一个字母是大写,windows C语言中单位是毫秒。
Linux C语言中 sleep的单位是秒
sleep(5); //停5秒
包含在 <unistd.h>头文件

8:
CreateMutex()函数可用来创建一个有名或无名的互斥量对象
CreateMutex作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。

9:
DWORD 就是 Double Word, 每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位。
typedef unsigned long DWORD;

10:
WINAPI————#define WINAPI      __stdcall
视窗操作系统应用程序接口(Windows API),有非正式的简称法为WinAPI,是微软对于Windows操作系统中可用的内核应用程序编程接口的称法。它设计为由C/C++程序调用,而且它也是应用软件与Windows系统最直接的交互方式。

11:
LPVOID,是一个没有类型的指针,也就是说你可以将LPVOID类型的变量赋值给任意类型的指针,比如在参数传递时就可以把任意类型传递给一个LPVOID类型为参数的方法,然后在方法内再将这个“任意类型”从传递时的“LPVOID类型”转换回来。
typedef void far            *LPVOID;

12:
SetConsoleTextAttribute是API设置控制台窗口字体颜色和背景色的函数。广泛应用于电脑编程。
原型
BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);

SetConsoleTextAttribute参数

consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
GetStdHandle(nStdHandle)是返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄。
其参数nStdHandle的值为下面几种类型的一种:
含义STD_INPUT_HANDLE标准输入的句柄STD_OUTPUT_HANDLE标准输出的句柄STD_ERROR_HANDLE标准错误的句柄
wAttributes是用来设置颜色的参数:
wAttributes颜色对应的值FOREGROUND_BLUE字体颜色:蓝1FOREGROUND_GREEN字体颜色:绿2FOREGROUND_RED字体颜色:红4FOREGROUND_INTENSITY前景色高亮显示8BACKGROUND_BLUE背景颜色:蓝16BACKGROUND_GREEN背景颜色:绿32BACKGROUND_RED
背景颜色:红
64BACKGROUND_INTENSITY背景色高亮显示128
也就是说SetConsoleTextAttribute函数是靠一个字节的低四来控制前景色,高四位来控制背景色。

13:
CreateThread:Windows API函数。该函数在主线程的基础上创建一个新线程。微软在Windows API中提供了建立新的线程的函数CreateThread。
声明位置:processthreadsapi.h
返回值类型:HANDLE
调用方式:__stdcall 

14:
GetAsyncKeyState,是一个函数,用来判断函数调用时指定虚拟键的状态。
返回值 Long
自对GetAsyncKeyState函数的上一次调用以来,
如键已被按过,则位0设为1;否则设为0。如键目前处于按下状态,则位15设为1;
如抬起,则为0。
微软的win32手册指出:
倘若输入焦点从属于与调用函数的输入线程不同的另一个输入线程,则返回值为0(例如,一旦另一个程序拥有焦点,则它应返回零)。证据显示,函数实际是在整个系统的范围内工作的。

常用键的VK值:
VK_SHIFT Shift键
VK_LSHIFT 左Shift键
VK_RSHIFT 右Shift键
VK_CONTROL Ctrl键
VK_LCONTROL 左Ctrl键
VK_RCONTROL 右Ctril键
VK_MENU Alt键
VK_LMENU 左Alt键
VK_RMENU 右Alt键
VK_LBUTTON 鼠标左键
VK_RBUTTON 鼠标右键
VK_ESCAPEESC键
VK_RETURN回车键
VK_TABTAB键
VK_SPACE空格键

15:
OnLButtonDown:该成员函数由框架调用,让您的应用程序处理一个Windows消息。参数传递给函数时,反映收到的消息框架收到的参数。如果调用此函数的基类的实现,该实现将使用原来的消息,而不是您提供的参数传递给函数的参数。
eg:           
OnLButtonDown(UINT nFlags, CPoint point)
                    
nFlags
指示是否各种虚拟键是否被按下。这个参数可以是任何以下值的组合:
MK_CONTROL 如果Ctrl键按下时设置这个标志。
MK_LBUTTON 如果鼠标左键按下时设置这个标志。
MK_MBUTTON 如果鼠标中键按下时设置这个标志。
MK_RBUTTON 如果鼠标右键按下时设置这个标志。
MK_SHIFT 如果Shift键按下时设置这个标志。
point
指定x和y坐标的光标。这些坐标总是相对于窗口的左上角。
afx_msg void OnLButtonDown( UINT nFlags, CPoint point );


16:
互斥对象
互斥对象是系统内核维护的一种数据结构,它保证了对象对单个线程的访问权
互斥对象的结构:包含了一个使用数量,一个线程ID,一个计数器
使用数量是指有多少个线程在调用该对象,线程ID是指互斥对象维护的线程的ID
计数器表示当前线程调用该对象的次数

互斥对象的创建:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, 安全属性结构指针,可为NULL,表示默认安全性
BOOL bInitialOwner, //是否占有该互斥量,TRUE:占有,FALSE:不占有
LPCTSTR lpName //设置互斥对象的名字
);

互斥对象的获取:
DWORD WaitForSingleObject( HANDLE hHandle,//互斥对象的句柄 DWORD dwMilliseconds//Time-out interval, in milliseconds.
//The function returns if the interval elapses,
//even if the object's state is nonsignaled.
//If dwMilliseconds is zero, the function tests the object's state and returns immediately.
//If dwMilliseconds is INFINITE, the function's time-out interval never elapses. );
如果第二个参数是0,则是测试对象的状态后立即返回
如果是INFINITE,则一直测试对象状态直到接受到信号

互斥对象的释放:
如果一个线程拥有了一个互斥对象后,当该线程运行完成后就要释放该互斥对象,不然其他的线程得不到互斥对象则无法运行
ReleaseMutex(HWND);操作
它的具体作用是每调用它一次将互斥对象的计数器减一,直到减到零为止,此时释放互斥对象,并将互斥对象中的线程id
置零。
它的使用条件是,互斥对象在哪个线程中被创建,就在哪个线程里面释放。因为调用的时候会检查当前线程的id是不是
与互斥对象中保存的id一致,若一致,则此次操作有效,不一致,则无效。