mfc笔记
来源:互联网 发布:锐捷软件怎么样 编辑:程序博客网 时间:2024/05/14 03:18
##############基础类型################
bit/位 1位的取值范围 0~1
byte/字节 1字节的取值范围0~11111111(2进制)~255(10进制)~FF(16进制)
word/单字(2字节) 1个单字范围 0~1111111111111111(2进制)~65535(10进制)~FFFF(16进制)
dword/双字(4字节) 1个双字范围 0~111111111111111*(2进制)~4294967296(10进制)~FFFFFFFF(16进制)
//char 8位----1byte
//short 16位---2byte
//int 32位----4byte
HWND是HANDLE的一种,但是HANDLE并不是HWND.
HANDLE是操作系统一系列内核对象的句柄。
HWND仅是窗口对象的句柄
a[y][x]---------######
######
横是x 竖是y ######
######
HINSTANCE是应用程序实例句柄,HWND是窗口句柄
4.指针移动
int *pa;
int a[10];
pa = &a[0];
pa+1将指向下一个元素a[1]:
>> 内存中的变化:"指针加1"会根据指针指定的类型int移动4个内存单元,
其实本身并没有移动,只是pa+1等于第5个内存单元地址——
“指针加1”中的1的大小是取决于pa的类型int的,
指针类型决定指针跨内存单元的步长。
5.规则:
>> &a[i]和a+i含义相同,相互使用。a+i是a之后第i个元素地址。
>> 数组名代表数组第一个元素的地址。
############itoa##############
int number = 123456;
char string[25];
itoa(number, string, 10);
###########atoi#############
int n;
char *str = "12345.67";
n = atoi(str);
###long转CString###
CString str;
str.Format(_T("%ld"),rect.bottom);
###定时器使用###
#####添加热键#########
1、.h文件中添加 afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
2、.cpp消息映射区域里面添加 ON_MESSAGE(WM_HOTKEY,OnHotKey)
3、OnInitDialog中添加注册热键 RegisterHotKey(GetSafeHwnd(),1001,NULL,VK_F2); 为F2
4、实现函数 LRESULT CNiHuaWoCaiDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
//wParam是注册热键的ID,lParam是关于按键的信息
if(wParam==1001)
{
//操作
}
return 0;
}
###对话框###
1、在资源页面,对话框上双击可为这个对话框创建类
(1)DoDataExchange()初始化对话框控件到变量,或者变量获取对话框的数据
(2)UpdateData(); 来调用DoDataExchange()
2、创建模态对话框:
(1)MyNewDialog md; //实例化一个对话框的对象
(2)md.DoModal(); //初始化一个模态对话框 自动创建
3、创建非模态对话框:
(需要是成员变量)
(1)MyNewDialog md; //实例化一个对话框的对象
(2)md.Create(ID(ID号),this(父窗口指针)); //初始化一个模态对话框
4、创建按钮:
(1)CButton cbt;
(2)cbt.Create(_T("按钮"),BS_DEFPUSHBUTTON | WS_VISIBLE|WS_CHILD,CRect(0,0,100,100)[巨型区域],this,111[id]);
*(3)cbt.DestroyWindow();销毁
5、在创建窗口都时候都会创建一个句柄变量 m_hWnd 可通过btn.m_hWnd 直接访问
6、GetWindowText(str) 获取窗口的文本
7、SetWindowText(str) 修改窗口的文本
8、GetDlgItem(int ID) 通过ID获取对话框上控件的指针
9、GetDlgItemText(str) 通过文本获取对话框上的指针
10、SetDlgItemText(ID,str) 修改窗口的文本
11、GetDlgItemInt();
12、SetDlgItemInt();
13、通过发送消息来获取窗口的文本
(调用api函数前面用::)
::SendMessage(GetDlgItem(int ID).m_hWnd[句柄],WM_GETTEXT[消息类型],10,ch);
14、对话框发送消息
SendDlgItemMessage(ID,WM_GETTEXT[消息类型],ch);
15、获得窗口大小GetWindowRect(&CRect)
16、设置窗口大小SetWindowPos();
####################外挂常用API########################
1、通过标题获取窗口句柄 FindWindow(NULL,"QQ");
2、获取窗口的信息 GetWindowRect(HWND.RECT)
3、改变鼠标位置坐标SetCursorPos(x,y); 相对于显示器window
4、得到鼠标的位置坐标GetCursorPos(&POINT);
5、获取窗口进程ID GetWindowThreadProcessId()
6、打开指定进程 OpenProcess();
7、读取指定进程内存数据 ReadProcessMemory();
8、发送消息 SendMessage/PostMessage
9、查找子窗口的句柄
函数原型:HWND ChildWindowFromPoint (HWND hWnd, LONG xPoint, LONG yPoint);
函数功能:返回父窗口中包含了指定点的第一个子窗口的句柄。
函数参数:hWnd 父窗口的句柄
xPoint 点的X坐标,以像素为单位
yPoint 点的Y坐标,以像素为单位
返回值:发现包含了指定点的第一个子窗口的句柄。如未发现任何窗口,则返回hWnd(父窗口的句柄)。如指定点位于父窗口外部,则返回零。
<!--------读取其他程序内存---样例--------------->
{//获得窗口句柄
HWND gameh = ::FindWindow(NULL,_T("QQ游戏 - 连连看角色版"));
//会的窗口进程ID
DWORD processid;
::GetWindowThreadProcessId(gameh,&processid);
//打开指定的进程
HANDLE processH = ::OpenProcess(PROCESS_ALL_ACCESS,false,processid);
//读取指定的进程 内存数据
DWORD byread;
LPCVOID pbase = (LPCVOID)0x00189F78 ;//基址
LPVOID nbuffer = (LPVOID)GAMEDARA; //读取数据存放的地址
ReadProcessMemory(processH,pbase,nbuffer,11*19,&byread);
}
<1-------调用其他程序 call 样例----------------->
//获取窗口的句柄
HWND game_hwnd = ::FindWindow(NULL,_T("WG_MyGame1"));
DWORD id;
LPDWORD pid = &id; //指针引用
//获取窗口进程ID
::GetWindowThreadProcessId(game_hwnd,pid);
//打开指定进程
HANDLE processH = ::OpenProcess(PROCESS_ALL_ACCESS,false,id);
//创建远程线程 调用call
DWORD tid;
CreateRemoteThread(processH,NULL,0,(LPTHREAD_START_ROUTINE)(0x003B1950),NULL,0,&tid);
#######################钩子##############################
1、::SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
/**
*参数1:钩子过滤的消息
*参数2:钩子回调方法
*参数3:创建钩子的进程
*参数4:钩子的进程ID
*
*/
2、BOOL UnhookWindowsHookEx(HHOOK hhk); //移除钩子
例子1 屏蔽本进程的键盘操作
:SetWindowsHookEx(WH_KEYBOARD,KeyboardProcs,NULL,GetCurrentThreadId());
LRESULT CALLBACK KeyboardProcs(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
){
return 1;
}
例子2 屏蔽所有程序
1、创建DLL程序 中的钩子函数
extern "C" _declspec(dllexport) void SetHook(){
SetWindowsHookEx(WH_MOUSE,KeyboardProcs,g_hInst,0);
}
实例句柄:g_hInst 通过DllMain 入口函数的 hinstDLL获得
2、在EXE程序中调用DLL中的 钩子函数SetHook
//动态添加链接库
typedef void(_cdecl* FunctionAdd)();
HINSTANCE hDll;//dll句柄;
hDll=LoadLibrary(_T("Hook3.dll"));
if (NULL==hDll)
{
MessageBox(_T("Dll加载失败"));
}
FunctionAdd MyHook;
MyHook=(FunctionAdd)GetProcAddress(hDll,"SetHook");
if(MyHook == NULL)
{
MessageBox(TEXT("没找到函数"));
}
MyHook();
例子3 挂载到其他进程(比如QQ)
1、创建DLL程序 中的钩子函数
HWND hwndQQ = FindWindow(NULL,TEXT("QQ"));
//取得线程ID(标示符)
if(!hwndQQ)
{
MessageBox(0,TEXT("没有获得窗口句柄!!"),TEXT("问好"),MB_OK);
return;
}
DWORD tid = GetWindowThreadProcessId(hwndQQ,NULL);
if(!tid)
{
MessageBox(0,TEXT("没有获得QQ进程ID!!"),TEXT("问好"),MB_OK);
return;
}
MessageBox(0,TEXT("成功挂载到QQ进程"),TEXT("问好"),MB_OK);
SetWindowsHookEx(WH_MOUSE,KeyboardProcs,g_hInst,tid);
2、在EXE程序中调用DLL中的 钩子函数SetHook
//动态添加链接库
typedef void(_cdecl* FunctionAdd)();
HINSTANCE hDll;//dll句柄;
hDll=LoadLibrary(_T("Hook3.dll"));
if (NULL==hDll)
{
MessageBox(_T("Dll加载失败"));
}
FunctionAdd MyHook;
MyHook=(FunctionAdd)GetProcAddress(hDll,"SetHook");
if(MyHook == NULL)
{
MessageBox(TEXT("没找到函数"));
}
21、资源对话框 CFileDialog();
/*******************绘图********************/
1、
CDC *pDC= GetDC();
pDC->MoveTo(20,20);
pDC->LineTo(100,100);
ReleaseDC(pDC);
2、
/*
CClientDC派生于CDC
CClientDC dc(this);
dc.MoveTo(0,0);
dc.LineTo(100,100);
//自己调用ReleaseDC
*/
/**获取父窗口的DC*/
//CClientDC dc(GetParent());
/**获得桌面窗口的DC*/
/*CClientDC dc(GetDesktopWindow());
dc.MoveTo(0,0);
dc.LineTo(100,100);
*/
/**获取最顶层窗口DC*/
/*
CPen pen(PS_SOLID,12,RGB(255,0,0));
3、
CWindowDC dc(GetDesktopWindow());//获得桌面DC
*/
/**画线*/
/*CPen *Poldpen = dc.SelectObject(&pen);
dc.MoveTo(0,0);
dc.LineTo(100,100);
dc.SelectObject(Poldpen);
*/
/**画方块*/
/*CBrush brush(RGB(0,222,0));
CRect crect(100,100,200,200);
dc.FillRect(crect,&brush);
*/
/**加载位图*/
/*CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush2(&bitmap);
CRect crect2(200,200,300,300);
dc.FillRect(crect2,&brush2);
*/
字体颜色,设置字体背景色
dc.SetTextColor(RGB(255,0,0));
dc.SetBkColor(TRANSPARENT);
########文件对话框############
CString filter;
filter="所有文件(*.bmp)|*.bmp|BMP(*.bmp)|";
CFileDialog fdlg(TRUE , NULL,NULL,OFN_HIDEREADONLY,filter,NULL);
if(fdlg.DoModal() == IDOK){
BmpPathName = fdlg.GetPathName();//获取路径
}
/*******************IO操作******************************/
1.函数功能
用来读写一个数据块。
2.一般调用形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
4.例:
1.fread(&id,1,10,f)就是把f里面的值读到id里面,每次读1个字节,一共读10次,或者把id里面的值都读完,不到10次也会停止。
2.fwrite(&id,1,10,f)就是把id里面的值读到f里面,每次读1个字节,一共读10次或是fread(&id,10,1,f)就是把id里面的值读到里面,每次读10个字节,一共读1次。
/******************************GetDC和CreateDC有什么区别? ******************/
GetDC和releaseDC配对。
CreateDC和DeleteDC配对。
GetDC是获取别人的。不能修改别人的参数。
GreateDC是自己创建的。可以任意修改的。
CreateDC和CreateIC区别
CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL),
获取整个屏幕的设备描述表。等同与:GetDC(NULL);
CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL),
只用于获取设备描述表的属性信息,不能用于绘图。
获取客户区大小
CRect rect;
GetClientRect(hWnd,&rect);
获取桌面大小
HWND hWnd = ::GetDesktopWindow(); //桌面句柄
GetWindowRect(hWnd,&rect);//
创建对话框
CMyDialog cd;
cd.DoModal();//创建模态对话框
CMyDialog cd;//注意cd生命周期
cd.Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );//创建非模态对话框
cd.showWindow(SW_SHOW);
设置窗口样式属性
SetWindowPos();
关闭对话框
退出程序
结束程序
PostMessage(WM_CLOSE );
SendMessage(WM_DESTROY);
//DestoryWindow();
//OnOK();
//EndDialog(0);
DC填充为透明
CBrush *cb = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
发送重绘消息
Invalidate();
重绘相应函数
OnEraseBkgnd(CDC* pDC)
集合类
CStringArray---CString对象
CPtrArray---void类型指针
移除菜单
SetMenu(NULL);
创建窗口样式
WS_BORDER 创建一个有边框的窗口
WS_CAPTION 创建一个有标题栏的窗口
WS_CHILDWINDOW(or WS_CHILD)创建一个子窗口(不能与WS_POPUP一起使用)
WS_CLIPCHILDREN 当在父窗口内绘制时,把子窗口占据的区域剪切在外,即不在该区域内绘图
WS_CLIPSIBLINGS 裁剪相互有关系的子窗口,不在被其它子窗口覆盖的区域内绘图,仅与WS_CHILD一起使用
WS_DISABLED 创建一个初始被禁止的窗口
WS_DLGFRAME 创建一个有双边框但无标题的窗口
WS_HSCROLL 创建一个带水平滚动杠的窗口
WS_VSCROLL 创建一个带垂直滚动杠的窗口
WS_ICONIC 创建一个初始为图标的窗口,仅可以与WS_OVERLAPPEDWINDOWS一起使用
WS_MAXIMIZE 创建一个最大尺寸的窗口
WS_MINIMIZE 创建一个最小尺寸的窗口(即图标)
WS_MAXIMIZEBOX 创建一个带有极大框的窗口
WS_MINIMIZEBOX 创建一个带有极小框的窗口
WS_OVERLAPPED 创建一个重叠式窗口,重叠式窗口带有标题和边框
WS_POPUP 创建一个弹出式窗口,不能与WS_CHILD一起使用
WS_SYSMENU 窗口带有系统选单框,仅用于带标题栏的窗口
WS_THICKFRAME 创建一个边框的窗口,使用户可以直接缩放窗口
WS_VISIBLE 创建一个初始可见的窗口
WS_EX_ACCEPTFILES = 0x00000010
指明了一个已创建视窗具有拖拽文件功能
WS_EX_APPWINDOW = 0x00040000
强制一个可见的顶级视窗到工具栏上
WS_EX_CLIENTEDGE = 0x00000200
使一个视窗具有凹陷边框
WS_EX_COMPOSITED = 0x02000000
Windows XP:将一个窗体的所有子窗口使用双缓冲按照从低到高方式绘制出来,参阅remark项.如果这个视窗已经使用经典样式中的下列值CS_OWNDC , CS_CLASSDC,WS_EX_CONTEXTHELP.此参数将不能使用.
这个样式的视窗在标题栏上有一个问号,当拥护点击着个问号,鼠标变成一个问号,如果用户然后点击一个子窗口,子窗就会收到一条WM_HELP消息.子窗口 将把这个消息传递给他的父进程,这个父进程将用HELP_WM_HELP命令调用WinHelp函数.这个帮助程序常常弹出一个典型的包含其子窗口的帮助 的窗口
本参数不能和WS_MAXIMIZEBOX ,WS_MINIMIZEBOX一起使用
WS_EX_CONTROLPARENT = 0x00010000
这个窗体本身包含了参与对话框导航的子窗口.如果使用了这个参数,对话框管理器?入这个窗体的子窗口,当执行导航操作时,比如按住TAB键,方向键.
WS_EX_DLGMODALFRAME = 0x00000001
创建一个具有双边框的窗口,这个窗口可以通过使用WS_CAPTION样式被创建成具有一个标题栏的窗口.
WS_EX_LAYERED = 0x00080000
Windows 2000/XP:创建一个分层的窗口.注意,这不能用在子窗口上.同样,如果窗口具有CS_OWNDC ,CS_CLASSDC样式,这也不用使用.
WS_EX_LAYOUTRTL = 0x00400000
阿拉伯以及西伯来版本的98/ME,2000/XP创建一个水平起点在右边的窗口.越往左边水平坐标值变大.
WS_EX_LEFT = 0x00000000
创建一个窗口具有一般的左对齐属性.此为默认
WS_EX_LEFTSCROLLBAR = 0x00004000
如果外壳语言是西伯来,阿拉伯,或者其他阅读顺序的语言,竖滚动条将会在客户区的左边.对其他语言,此参数忽略.
WS_EX_LTRREADING = 0x00000000
窗体的文字按照从左到右排列.此为默认.
WS_EX_MDICHILD = 0x00000040
创建一个多文档界面的子窗口.
WS_EX_NOACTIVATE = 0x08000000
Windows 2000/XP:一个使用此参数创建的顶级窗口不会变成前台窗口,当用户点击他时.系统不会将此窗口放到前台,当用户最小化或者关闭这个前台窗口.
要激活这样的窗口,使用SetActiveWindow或者SetForegroundWindow函数
此类型的窗口默认不会显示在任务栏上.要强行将这样的窗口显示到任务栏上,使用WS_EX_APPWINDOW参数.
WS_EX_NOINHERITLAYOUT = 0x00100000
Windows 2000/XP:用此参数创建的窗体不会传递他的窗口布局给他的子窗口
WS_EX_NOPARENTNOTIFY = 0x00000004
指明一个使用此参数创建的窗口不发送WM_PARENTNOTIFY消息给他的父窗口当这个窗口被创建或者销毁的时候.
WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
联合了WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles
WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)
联合了WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
WS_EX_RIGHT = 0x00001000
窗口具有一般的右对齐属性.这要依靠这个窗口的类.这个样式只有外壳语言是西伯来语,阿拉伯语等其他阅读顺序的语言才有影响,否则此样式别忽略
对文字标签或者编辑框使用WS_EX_RIGHT样式跟使用SS_RIGHT 或者 ES_RIGHT影响是一样的.对按钮使用这个样式跟使用BS_RIGHT 和BS_RIGHTBUTTON的影响是一样的
WS_EX_RIGHTSCROLLBAR = 0x00000000
竖直滚动条显示在客户区的右边.默认.
WS_EX_RTLREADING = 0x00002000
如果外壳语言是西伯来语,阿拉伯语等支持排列方式阅读的语言,窗体文字将按照从右到左的阅读顺序.对其他语言,此样式忽略.
WS_EX_STATICEDGE = 0x00020000
创建一个窗口具有三维边框用来表示一个项目不接受用户输入.
WS_EX_TOOLWINDOW = 0x00000080
创建一个工具窗口:也就是说,这个窗口被用来做浮动工具条.一个工具窗口具有一个比一般的标题栏短的标题栏,并且系统在标题栏使用小字体.作为工具窗口, 它不显示在工具栏上.当用户用ALT+TAB切换时也不出现在对话框中.如果一个工具窗有系统菜单,那么他的图标不会被显示在标题栏上.但是,你可以通过 键入ALT+TAB或者右键点击标题栏来显示系统菜单.
WS_EX_TOPMOST = 0x00000008
指明用此参数创建的窗口将会放在所有顶级视窗上并且停在最上面.即使这个窗口不是活动的.要添加或者移除他,使用SetWindowPos函数.
WS_EX_TRANSPARENT = 0x00000020
用此参数创建的的窗口在他同一线程的窗口被绘制前将不会被绘制.这个窗口透明的显示,因为同一线程的窗口已经绘制出来
要脱离这个限制激活透明,使用SetWindowRgn函数.
WS_EX_WINDOWEDGE = 0x00000100
使一个窗口具有凸起的边框.
获取屏幕宽度,长度(全屏显示)
int nFullWidth = GetSystemMetrics(SM_CXSCREEN);
int nFullHeight = GetSystemMetrics(SM_CYSCREEN);
在PreCreateWindow中
cs.style |= WS_MAXIMIZE;
int nWidth; // window width
int nHeight; // window height
nWidth=GetSystemMetrics(SM_CXSCREEN);//获得系统的分辨率
nHeight=GetSystemMetrics(SM_CYSCREEN);//获得系统的分辨率
cs.cx=nWidth;
cs.cy=nHeight;
窗体透明
::SetWindowLong(this->m_hWnd,GWL_EXSTYLE,GetWindowLong(this->m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
::SetLayeredWindowAttributes(
this->m_hWnd,
RGB(255,255,255),
0,
LWA_COLORKEY // LWA_ALPHA
);
透明
AlphaBlend
透明2
dc.TransparentBlt(0,0,1370,600,&MemDc,0,0,1370,600,RGB(255,255,15));
用于设定当前前景色的混合模式。
SetROP2
输入字符背景颜色为透明
SetBkMode(TRANSPARENT)
防止背景闪烁
设置背景画刷
static CBrush brush(RGB(255,0,0));
SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush);
防止背景闪烁
重载OnEraseBkgnd(CDC* pDC)直接返回TRUE
重要的消息
WM_ACTIVATE //窗口被激活或者取消激活
WM_ACTIVATEAPP
WM_CLOSE //关闭窗口,在消息WM_DESTROY 和 WM_QUIT传递之间被发送
WM_MOVE //移动到新的位置时候触发
WM_MOVEING //正在移动触发
WM_SIZE
WM_SIZEING
键盘消息
WM_CHAR ASCLL码
wparam---包含所按下键的ASCALL 码
lparam---包含一个按位编码的状态矢量,
WM_KEYDOWN / WM_KEYUP 扫描码 Scan code
GetAsyncKeyState()
按键详解见《windows游戏变成大师技巧》第三章,处理重要消息事件
任务。
用win32写个window窗口,
1、画图
2、写字
3、消息
4、按钮子控件
模拟点击按钮---向控件发送信息
获取计算机的信息
GetSystemMetrics();
取高位
LOWORD(lparam);
取低位
HIWORD(lparam);
全屏窗口中去掉边框(默认的凹凸边框)
在OnCreate中添加
ModifyStyleEx(WS_EX_CLIENTEDGE, NULL);
不在标题栏中显示应用
在创建的时候添加
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
添加热键,快捷键
1、//注册热键
RegisterHotKey(GetSafeHwnd(),1001,NULL,VK_F2);
2、监听OnHotKey消息
判断 if(wParam==1001) 是否等于注册ID
修改程序图标
VS2010生成的exe文件图标是用Icon下几个图标中value值最小的,
顺序为IDR_MAINFRAME、IDR_ICONTETYPE、新加 的,
所以想更改生成的exe文件图标,只要保证图标的value值是Icon下几个图标中最小的就可以了
添加系统托盘
1、添加m_nid为类成员变量类型为NOTIFYICONDATA
2、添加成员函数ToTray()
{
m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
m_nid.hWnd = this->m_hWnd;
m_nid.uID = IDR_MAINFRAME;
m_nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP ;
m_nid.uCallbackMessage = WM_SHOWTASK;
m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
wcscpy(m_nid.szTip,_T("魏亚恒是大帅哥"));
Shell_NotifyIcon(NIM_ADD,&m_nid);//在托盘区添加图标
}
3、定义消息#define WM_SHOWTASK WM_USER+1,添加消息WM_SHOWTASK的响应函数afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
在BEGIN_MESSAGE_MAP(CUserDlg, CDialog)和END_MESSAGE_MAP()之间加代码:
ON_MESSAGE(WM_SHOWTASK,onShowTask)
3、编写该函数:
LRESULT CUserDlg::onShowTask(WPARAM wParam,LPARAM lParam){
//wParam接收的是图标的ID,lParam接收的是鼠标的行为
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam){
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
//隐藏),将程序结束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"退出");
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
this->ShowWindow(SW_SHOWNORMAL);//简单的显示主窗口
}
break;
}
return 0;
}
然后在OnInitDialog函数中调用ToTray();
4、为使应用程序退出时图标消失,映射WM_DESTROY消息,在OnDestroy()函数中加入:
::Shell_NotifyIcon(NIM_DELETE,&m_tnid);
5、至此,托盘图标程序的常规功能我们均已实现。我们还可以通过Shell_NotifyIcon()函数的调用实现不同状态下图标的改变,就象金山词霸在主窗口打开与暂停取词时图标有所改变一样。 它常 用来显示一些系统的状态。如:系统时间,音量控制以及其它的一些图标
总体的思想就是这样的
添加自定义右键菜单/ 托盘菜单
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu* pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_LEFTALIGN| TPM_RIGHTBUTTON,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete pPopup;
delete lpoint;
失去焦点菜单消失
SetForegroundWindow();
从磁盘读取位图
LoadImage();
文件操作/文件写入/文本写入文件
FILE *fp1;
fp1 = fopen("E:\\a.txt","w");//只读方式打开文件a.txt
fputs("hello world!",fp1);
fclose(fp1);
CString转成char *
CString str=_T("hello kitty 12345 hello jackson");
int len=str.GetLength();
char *buffer=new char[len+1];
memset(buffer,0,len+1);
WideCharToMultiByte(CP_OEMCP, NULL, (LPCWSTR)str, -1,NULL, 0, NULL, FALSE);
WideCharToMultiByte(CP_OEMCP, NULL, (LPCWSTR)str, -1,(LPSTR)buffer, len, NULL, FALSE);
buffer[len]='\0';
char * 转成 CString
char *str="abcd1234";
//预转换,得到所需空间的大小
int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, inputbuffer, strlen(inputbuffer), NULL, 0);
//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
wchar_t* wszString = new wchar_t[wcsLen + 1];
//转换
::MultiByteToWideChar(CP_ACP, NULL, inputbuffer, strlen(inputbuffer), wszString, wcsLen);
//最后加上'\0'
wszString[wcsLen] = '\0';
//附加到CString对象上
CString content;
content.Append(wszString);
文件操作/创建文件
HANDLE CreateFile(
LPCTSTR lpFileName, // 指向文件名的指针
DWORD dwDesiredAccess, // 访问模式(写 / 读)
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针
DWORD dwCreationDisposition, // 如何创建
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 用于复制文件句柄
);
参数
类型及说明
lpFileName
String ,要打开的文件的名字
dwDesiredAccess
Long ,如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
dwShareMode
Long ,零表示不共享; FILE_SHARE_READ 和 / 或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
lpSecurityAttributes
SECURITY_ATTRIBUTES ,指向一个 SECURITY_ATTRIBUTES 结构的指针,定义了文件的安全特性(如果操作系统支持的话)
dwCreationDisposition
Long ,下述常数之一:
CREATE_NEW
创建文件;如文件存在则会出错
CREATE_ALWAYS
创建文件,会改写前一个文件
OPEN_EXISTING
文件必须已经存在。由设备提出要求
OPEN_ALWAYS
如文件不存在则创建它
TRUNCATE_EXISTING
讲现有文件缩短为零长度
dwFlagsAndAttributes
Long ,一个或多个下述常数
FILE_ATTRIBUTE_ARCHIVE
标记归档属性
FILE_ATTRIBUTE_COMPRESSED
将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
FILE_ATTRIBUTE_NORMAL
默认属性
FILE_ATTRIBUTE_HIDDEN
隐藏文件或目录
FILE_ATTRIBUTE_READONLY
文件为只读
FILE_ATTRIBUTE_SYSTEM
文件为系统文件
FILE_FLAG_WRITE_THROUGH
操作系统不得推迟对文件的写操作
FILE_FLAG_OVERLAPPED
允许对文件进行重叠操作
FILE_FLAG_NO_BUFFERING
禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
FILE_FLAG_RANDOM_ACCESS
针对随机访问对文件缓冲进行优化
FILE_FLAG_SEQUENTIAL_SCAN
针对连续访问对文件缓冲进行优化
FILE_FLAG_DELETE_ON_CLOSE
关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
也可在 Windows NT 下组合使用下述常数标记:
SECURITY_ANONYMOUS , SECURITY_IDENTIFICATION , SECURITY_IMPERSONATION , SECURITY_DELEGATION , SECURITY_CONTEXT_TRACKING , SECURITY_EFFECTIVE_ONLY
hTemplateFile
Long ,如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性
获取窗口位置
GetWindowRect();
动态链接库创建
动态链接库导出函数
_declspec(dllexport) int add(int a,int b){
return a+b;
}
使用动态链接库
1、把lib文件放到工程目录中
2、项目---> 属性--->配置属性-->链接器---->输入---附加依赖项, 加入库名,如: my_API.lib;
2.1、或是在cpp源文件中用代码#pragma comment(lib,"my_API.lib")代替.
3、首先声明函数
extern int add(int a,int b);
或者
_declspec(dllimport) int add(int a,int b); 效率更高
curl笔记
初始化一个curl
curl = curl_easy_init();
为curl设置参数
curl_easy_setopt(curl,)
PHP中的CURL函数库(Client URL Library Function)
curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息
curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。
多字节转宽字符(unicode)
MultiByteToWideChar
例程:
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, (char *)buffer, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwNum];
if(!pwText){
delete []pwText;
}
MultiByteToWideChar (CP_ACP, 0, (char *)buffer, -1, pwText, dwNum);
我们在最开始学习MFC的时候,毫无疑问会遇到这样的问题。
VC6的设置:多字节。
vs的默认设置:Unicode,在属性中可以改成多字节。
多字节编码:char,string,CStringA。
Unicode编码:wchar_t,wstring,CStringW。
注意:如果项目是Unicode,那么CString就被定义为CStringW,否则就是CStringA。
附:
LPSTR = char*;LPCSTR = const char*;
LPWSTR = wchar_t*;LPCWSTR = const wchar_t*;
至于LPCTSTR也是根据项目字符集来定义为LPCWSTR(Unicode)或LPCSTR(多字节)。
OK,上面的定义很明显了,注意用的时候别弄混了,我觉得最好的方式是,使用wchar_t和wstring(api大多使用unicode,即使是多字节版本也是把多字节转成unicode再去调用unicode版api),我不太喜欢CString。
接下来就是转换:www.2cto.com
// C++
char* 到 string:string str("char"); 或者string str = "char";
string 到 char*:const char* ch = str.c_str();
wchar_t* 和 wstring与上相同。
// MFC
char* 到 CStringA:CStringA str("char");
CStringA 到 char*:const char* ch = str.operator LPCSTR(); (注意:反对使用GetBuffer,因为使用这个,必须要ReleaseBuffer,而且很多时候没必要去分配空间)
wchar_t* 和 CStringW与上相同。
// 字符集之间转换
char* 到 wchar_t*:CA2W a2w("char"); const wchar_t* wch = a2w.operator LPCWSTR();
wchar_t* 到 char*:CW2A w2a(L"wchar_t"); const char* ch = w2a.operator LPCSTR(); (注意:反对使用_T("chs")这种方式,程序字符集在一开始就该确定,而且最好选择Unicode)
关于CA2W和CW2A这两个类,可以在atlconv.h中找到源代码,其实就是对WideCharToMultiByte和MultiByteToWideChar的封装。
鼠标拖拽窗口。窗口移动
if(LisDown){
int nX = point.x - prePoint.x;
int nY = point.y - prePoint.y;
CRect rect;
GetWindowRect(&rect);
rect.OffsetRect(nX,nY);
MoveWindow(rect, TRUE);
}
指针。内存分配
realloc
calloc
malloc
memset
不在任务栏显示,隐藏程序
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);//从任务栏中去掉.
设置窗口样式,窗口风格
ModifyStyleEx
bit/位 1位的取值范围 0~1
byte/字节 1字节的取值范围0~11111111(2进制)~255(10进制)~FF(16进制)
word/单字(2字节) 1个单字范围 0~1111111111111111(2进制)~65535(10进制)~FFFF(16进制)
dword/双字(4字节) 1个双字范围 0~111111111111111*(2进制)~4294967296(10进制)~FFFFFFFF(16进制)
//char 8位----1byte
//short 16位---2byte
//int 32位----4byte
HWND是HANDLE的一种,但是HANDLE并不是HWND.
HANDLE是操作系统一系列内核对象的句柄。
HWND仅是窗口对象的句柄
a[y][x]---------######
######
横是x 竖是y ######
######
HINSTANCE是应用程序实例句柄,HWND是窗口句柄
4.指针移动
int *pa;
int a[10];
pa = &a[0];
pa+1将指向下一个元素a[1]:
>> 内存中的变化:"指针加1"会根据指针指定的类型int移动4个内存单元,
其实本身并没有移动,只是pa+1等于第5个内存单元地址——
“指针加1”中的1的大小是取决于pa的类型int的,
指针类型决定指针跨内存单元的步长。
5.规则:
>> &a[i]和a+i含义相同,相互使用。a+i是a之后第i个元素地址。
>> 数组名代表数组第一个元素的地址。
############itoa##############
int number = 123456;
char string[25];
itoa(number, string, 10);
###########atoi#############
int n;
char *str = "12345.67";
n = atoi(str);
###long转CString###
CString str;
str.Format(_T("%ld"),rect.bottom);
###定时器使用###
#####添加热键#########
1、.h文件中添加 afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
2、.cpp消息映射区域里面添加 ON_MESSAGE(WM_HOTKEY,OnHotKey)
3、OnInitDialog中添加注册热键 RegisterHotKey(GetSafeHwnd(),1001,NULL,VK_F2); 为F2
4、实现函数 LRESULT CNiHuaWoCaiDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
//wParam是注册热键的ID,lParam是关于按键的信息
if(wParam==1001)
{
//操作
}
return 0;
}
###对话框###
1、在资源页面,对话框上双击可为这个对话框创建类
(1)DoDataExchange()初始化对话框控件到变量,或者变量获取对话框的数据
(2)UpdateData(); 来调用DoDataExchange()
2、创建模态对话框:
(1)MyNewDialog md; //实例化一个对话框的对象
(2)md.DoModal(); //初始化一个模态对话框 自动创建
3、创建非模态对话框:
(需要是成员变量)
(1)MyNewDialog md; //实例化一个对话框的对象
(2)md.Create(ID(ID号),this(父窗口指针)); //初始化一个模态对话框
4、创建按钮:
(1)CButton cbt;
(2)cbt.Create(_T("按钮"),BS_DEFPUSHBUTTON | WS_VISIBLE|WS_CHILD,CRect(0,0,100,100)[巨型区域],this,111[id]);
*(3)cbt.DestroyWindow();销毁
5、在创建窗口都时候都会创建一个句柄变量 m_hWnd 可通过btn.m_hWnd 直接访问
6、GetWindowText(str) 获取窗口的文本
7、SetWindowText(str) 修改窗口的文本
8、GetDlgItem(int ID) 通过ID获取对话框上控件的指针
9、GetDlgItemText(str) 通过文本获取对话框上的指针
10、SetDlgItemText(ID,str) 修改窗口的文本
11、GetDlgItemInt();
12、SetDlgItemInt();
13、通过发送消息来获取窗口的文本
(调用api函数前面用::)
::SendMessage(GetDlgItem(int ID).m_hWnd[句柄],WM_GETTEXT[消息类型],10,ch);
14、对话框发送消息
SendDlgItemMessage(ID,WM_GETTEXT[消息类型],ch);
15、获得窗口大小GetWindowRect(&CRect)
16、设置窗口大小SetWindowPos();
####################外挂常用API########################
1、通过标题获取窗口句柄 FindWindow(NULL,"QQ");
2、获取窗口的信息 GetWindowRect(HWND.RECT)
3、改变鼠标位置坐标SetCursorPos(x,y); 相对于显示器window
4、得到鼠标的位置坐标GetCursorPos(&POINT);
5、获取窗口进程ID GetWindowThreadProcessId()
6、打开指定进程 OpenProcess();
7、读取指定进程内存数据 ReadProcessMemory();
8、发送消息 SendMessage/PostMessage
9、查找子窗口的句柄
函数原型:HWND ChildWindowFromPoint (HWND hWnd, LONG xPoint, LONG yPoint);
函数功能:返回父窗口中包含了指定点的第一个子窗口的句柄。
函数参数:hWnd 父窗口的句柄
xPoint 点的X坐标,以像素为单位
yPoint 点的Y坐标,以像素为单位
返回值:发现包含了指定点的第一个子窗口的句柄。如未发现任何窗口,则返回hWnd(父窗口的句柄)。如指定点位于父窗口外部,则返回零。
<!--------读取其他程序内存---样例--------------->
{//获得窗口句柄
HWND gameh = ::FindWindow(NULL,_T("QQ游戏 - 连连看角色版"));
//会的窗口进程ID
DWORD processid;
::GetWindowThreadProcessId(gameh,&processid);
//打开指定的进程
HANDLE processH = ::OpenProcess(PROCESS_ALL_ACCESS,false,processid);
//读取指定的进程 内存数据
DWORD byread;
LPCVOID pbase = (LPCVOID)0x00189F78 ;//基址
LPVOID nbuffer = (LPVOID)GAMEDARA; //读取数据存放的地址
ReadProcessMemory(processH,pbase,nbuffer,11*19,&byread);
}
<1-------调用其他程序 call 样例----------------->
//获取窗口的句柄
HWND game_hwnd = ::FindWindow(NULL,_T("WG_MyGame1"));
DWORD id;
LPDWORD pid = &id; //指针引用
//获取窗口进程ID
::GetWindowThreadProcessId(game_hwnd,pid);
//打开指定进程
HANDLE processH = ::OpenProcess(PROCESS_ALL_ACCESS,false,id);
//创建远程线程 调用call
DWORD tid;
CreateRemoteThread(processH,NULL,0,(LPTHREAD_START_ROUTINE)(0x003B1950),NULL,0,&tid);
#######################钩子##############################
1、::SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
/**
*参数1:钩子过滤的消息
*参数2:钩子回调方法
*参数3:创建钩子的进程
*参数4:钩子的进程ID
*
*/
2、BOOL UnhookWindowsHookEx(HHOOK hhk); //移除钩子
例子1 屏蔽本进程的键盘操作
:SetWindowsHookEx(WH_KEYBOARD,KeyboardProcs,NULL,GetCurrentThreadId());
LRESULT CALLBACK KeyboardProcs(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
){
return 1;
}
例子2 屏蔽所有程序
1、创建DLL程序 中的钩子函数
extern "C" _declspec(dllexport) void SetHook(){
SetWindowsHookEx(WH_MOUSE,KeyboardProcs,g_hInst,0);
}
实例句柄:g_hInst 通过DllMain 入口函数的 hinstDLL获得
2、在EXE程序中调用DLL中的 钩子函数SetHook
//动态添加链接库
typedef void(_cdecl* FunctionAdd)();
HINSTANCE hDll;//dll句柄;
hDll=LoadLibrary(_T("Hook3.dll"));
if (NULL==hDll)
{
MessageBox(_T("Dll加载失败"));
}
FunctionAdd MyHook;
MyHook=(FunctionAdd)GetProcAddress(hDll,"SetHook");
if(MyHook == NULL)
{
MessageBox(TEXT("没找到函数"));
}
MyHook();
例子3 挂载到其他进程(比如QQ)
1、创建DLL程序 中的钩子函数
HWND hwndQQ = FindWindow(NULL,TEXT("QQ"));
//取得线程ID(标示符)
if(!hwndQQ)
{
MessageBox(0,TEXT("没有获得窗口句柄!!"),TEXT("问好"),MB_OK);
return;
}
DWORD tid = GetWindowThreadProcessId(hwndQQ,NULL);
if(!tid)
{
MessageBox(0,TEXT("没有获得QQ进程ID!!"),TEXT("问好"),MB_OK);
return;
}
MessageBox(0,TEXT("成功挂载到QQ进程"),TEXT("问好"),MB_OK);
SetWindowsHookEx(WH_MOUSE,KeyboardProcs,g_hInst,tid);
2、在EXE程序中调用DLL中的 钩子函数SetHook
//动态添加链接库
typedef void(_cdecl* FunctionAdd)();
HINSTANCE hDll;//dll句柄;
hDll=LoadLibrary(_T("Hook3.dll"));
if (NULL==hDll)
{
MessageBox(_T("Dll加载失败"));
}
FunctionAdd MyHook;
MyHook=(FunctionAdd)GetProcAddress(hDll,"SetHook");
if(MyHook == NULL)
{
MessageBox(TEXT("没找到函数"));
}
21、资源对话框 CFileDialog();
/*******************绘图********************/
1、
CDC *pDC= GetDC();
pDC->MoveTo(20,20);
pDC->LineTo(100,100);
ReleaseDC(pDC);
2、
/*
CClientDC派生于CDC
CClientDC dc(this);
dc.MoveTo(0,0);
dc.LineTo(100,100);
//自己调用ReleaseDC
*/
/**获取父窗口的DC*/
//CClientDC dc(GetParent());
/**获得桌面窗口的DC*/
/*CClientDC dc(GetDesktopWindow());
dc.MoveTo(0,0);
dc.LineTo(100,100);
*/
/**获取最顶层窗口DC*/
/*
CPen pen(PS_SOLID,12,RGB(255,0,0));
3、
CWindowDC dc(GetDesktopWindow());//获得桌面DC
*/
/**画线*/
/*CPen *Poldpen = dc.SelectObject(&pen);
dc.MoveTo(0,0);
dc.LineTo(100,100);
dc.SelectObject(Poldpen);
*/
/**画方块*/
/*CBrush brush(RGB(0,222,0));
CRect crect(100,100,200,200);
dc.FillRect(crect,&brush);
*/
/**加载位图*/
/*CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush2(&bitmap);
CRect crect2(200,200,300,300);
dc.FillRect(crect2,&brush2);
*/
字体颜色,设置字体背景色
dc.SetTextColor(RGB(255,0,0));
dc.SetBkColor(TRANSPARENT);
########文件对话框############
CString filter;
filter="所有文件(*.bmp)|*.bmp|BMP(*.bmp)|";
CFileDialog fdlg(TRUE , NULL,NULL,OFN_HIDEREADONLY,filter,NULL);
if(fdlg.DoModal() == IDOK){
BmpPathName = fdlg.GetPathName();//获取路径
}
/*******************IO操作******************************/
1.函数功能
用来读写一个数据块。
2.一般调用形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
4.例:
1.fread(&id,1,10,f)就是把f里面的值读到id里面,每次读1个字节,一共读10次,或者把id里面的值都读完,不到10次也会停止。
2.fwrite(&id,1,10,f)就是把id里面的值读到f里面,每次读1个字节,一共读10次或是fread(&id,10,1,f)就是把id里面的值读到里面,每次读10个字节,一共读1次。
/******************************GetDC和CreateDC有什么区别? ******************/
GetDC和releaseDC配对。
CreateDC和DeleteDC配对。
GetDC是获取别人的。不能修改别人的参数。
GreateDC是自己创建的。可以任意修改的。
CreateDC和CreateIC区别
CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL),
获取整个屏幕的设备描述表。等同与:GetDC(NULL);
CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL),
只用于获取设备描述表的属性信息,不能用于绘图。
获取客户区大小
CRect rect;
GetClientRect(hWnd,&rect);
获取桌面大小
HWND hWnd = ::GetDesktopWindow(); //桌面句柄
GetWindowRect(hWnd,&rect);//
创建对话框
CMyDialog cd;
cd.DoModal();//创建模态对话框
CMyDialog cd;//注意cd生命周期
cd.Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );//创建非模态对话框
cd.showWindow(SW_SHOW);
设置窗口样式属性
SetWindowPos();
关闭对话框
退出程序
结束程序
PostMessage(WM_CLOSE );
SendMessage(WM_DESTROY);
//DestoryWindow();
//OnOK();
//EndDialog(0);
DC填充为透明
CBrush *cb = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
发送重绘消息
Invalidate();
重绘相应函数
OnEraseBkgnd(CDC* pDC)
集合类
CStringArray---CString对象
CPtrArray---void类型指针
移除菜单
SetMenu(NULL);
创建窗口样式
WS_BORDER 创建一个有边框的窗口
WS_CAPTION 创建一个有标题栏的窗口
WS_CHILDWINDOW(or WS_CHILD)创建一个子窗口(不能与WS_POPUP一起使用)
WS_CLIPCHILDREN 当在父窗口内绘制时,把子窗口占据的区域剪切在外,即不在该区域内绘图
WS_CLIPSIBLINGS 裁剪相互有关系的子窗口,不在被其它子窗口覆盖的区域内绘图,仅与WS_CHILD一起使用
WS_DISABLED 创建一个初始被禁止的窗口
WS_DLGFRAME 创建一个有双边框但无标题的窗口
WS_HSCROLL 创建一个带水平滚动杠的窗口
WS_VSCROLL 创建一个带垂直滚动杠的窗口
WS_ICONIC 创建一个初始为图标的窗口,仅可以与WS_OVERLAPPEDWINDOWS一起使用
WS_MAXIMIZE 创建一个最大尺寸的窗口
WS_MINIMIZE 创建一个最小尺寸的窗口(即图标)
WS_MAXIMIZEBOX 创建一个带有极大框的窗口
WS_MINIMIZEBOX 创建一个带有极小框的窗口
WS_OVERLAPPED 创建一个重叠式窗口,重叠式窗口带有标题和边框
WS_POPUP 创建一个弹出式窗口,不能与WS_CHILD一起使用
WS_SYSMENU 窗口带有系统选单框,仅用于带标题栏的窗口
WS_THICKFRAME 创建一个边框的窗口,使用户可以直接缩放窗口
WS_VISIBLE 创建一个初始可见的窗口
WS_EX_ACCEPTFILES = 0x00000010
指明了一个已创建视窗具有拖拽文件功能
WS_EX_APPWINDOW = 0x00040000
强制一个可见的顶级视窗到工具栏上
WS_EX_CLIENTEDGE = 0x00000200
使一个视窗具有凹陷边框
WS_EX_COMPOSITED = 0x02000000
Windows XP:将一个窗体的所有子窗口使用双缓冲按照从低到高方式绘制出来,参阅remark项.如果这个视窗已经使用经典样式中的下列值CS_OWNDC , CS_CLASSDC,WS_EX_CONTEXTHELP.此参数将不能使用.
这个样式的视窗在标题栏上有一个问号,当拥护点击着个问号,鼠标变成一个问号,如果用户然后点击一个子窗口,子窗就会收到一条WM_HELP消息.子窗口 将把这个消息传递给他的父进程,这个父进程将用HELP_WM_HELP命令调用WinHelp函数.这个帮助程序常常弹出一个典型的包含其子窗口的帮助 的窗口
本参数不能和WS_MAXIMIZEBOX ,WS_MINIMIZEBOX一起使用
WS_EX_CONTROLPARENT = 0x00010000
这个窗体本身包含了参与对话框导航的子窗口.如果使用了这个参数,对话框管理器?入这个窗体的子窗口,当执行导航操作时,比如按住TAB键,方向键.
WS_EX_DLGMODALFRAME = 0x00000001
创建一个具有双边框的窗口,这个窗口可以通过使用WS_CAPTION样式被创建成具有一个标题栏的窗口.
WS_EX_LAYERED = 0x00080000
Windows 2000/XP:创建一个分层的窗口.注意,这不能用在子窗口上.同样,如果窗口具有CS_OWNDC ,CS_CLASSDC样式,这也不用使用.
WS_EX_LAYOUTRTL = 0x00400000
阿拉伯以及西伯来版本的98/ME,2000/XP创建一个水平起点在右边的窗口.越往左边水平坐标值变大.
WS_EX_LEFT = 0x00000000
创建一个窗口具有一般的左对齐属性.此为默认
WS_EX_LEFTSCROLLBAR = 0x00004000
如果外壳语言是西伯来,阿拉伯,或者其他阅读顺序的语言,竖滚动条将会在客户区的左边.对其他语言,此参数忽略.
WS_EX_LTRREADING = 0x00000000
窗体的文字按照从左到右排列.此为默认.
WS_EX_MDICHILD = 0x00000040
创建一个多文档界面的子窗口.
WS_EX_NOACTIVATE = 0x08000000
Windows 2000/XP:一个使用此参数创建的顶级窗口不会变成前台窗口,当用户点击他时.系统不会将此窗口放到前台,当用户最小化或者关闭这个前台窗口.
要激活这样的窗口,使用SetActiveWindow或者SetForegroundWindow函数
此类型的窗口默认不会显示在任务栏上.要强行将这样的窗口显示到任务栏上,使用WS_EX_APPWINDOW参数.
WS_EX_NOINHERITLAYOUT = 0x00100000
Windows 2000/XP:用此参数创建的窗体不会传递他的窗口布局给他的子窗口
WS_EX_NOPARENTNOTIFY = 0x00000004
指明一个使用此参数创建的窗口不发送WM_PARENTNOTIFY消息给他的父窗口当这个窗口被创建或者销毁的时候.
WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
联合了WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles
WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)
联合了WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
WS_EX_RIGHT = 0x00001000
窗口具有一般的右对齐属性.这要依靠这个窗口的类.这个样式只有外壳语言是西伯来语,阿拉伯语等其他阅读顺序的语言才有影响,否则此样式别忽略
对文字标签或者编辑框使用WS_EX_RIGHT样式跟使用SS_RIGHT 或者 ES_RIGHT影响是一样的.对按钮使用这个样式跟使用BS_RIGHT 和BS_RIGHTBUTTON的影响是一样的
WS_EX_RIGHTSCROLLBAR = 0x00000000
竖直滚动条显示在客户区的右边.默认.
WS_EX_RTLREADING = 0x00002000
如果外壳语言是西伯来语,阿拉伯语等支持排列方式阅读的语言,窗体文字将按照从右到左的阅读顺序.对其他语言,此样式忽略.
WS_EX_STATICEDGE = 0x00020000
创建一个窗口具有三维边框用来表示一个项目不接受用户输入.
WS_EX_TOOLWINDOW = 0x00000080
创建一个工具窗口:也就是说,这个窗口被用来做浮动工具条.一个工具窗口具有一个比一般的标题栏短的标题栏,并且系统在标题栏使用小字体.作为工具窗口, 它不显示在工具栏上.当用户用ALT+TAB切换时也不出现在对话框中.如果一个工具窗有系统菜单,那么他的图标不会被显示在标题栏上.但是,你可以通过 键入ALT+TAB或者右键点击标题栏来显示系统菜单.
WS_EX_TOPMOST = 0x00000008
指明用此参数创建的窗口将会放在所有顶级视窗上并且停在最上面.即使这个窗口不是活动的.要添加或者移除他,使用SetWindowPos函数.
WS_EX_TRANSPARENT = 0x00000020
用此参数创建的的窗口在他同一线程的窗口被绘制前将不会被绘制.这个窗口透明的显示,因为同一线程的窗口已经绘制出来
要脱离这个限制激活透明,使用SetWindowRgn函数.
WS_EX_WINDOWEDGE = 0x00000100
使一个窗口具有凸起的边框.
获取屏幕宽度,长度(全屏显示)
int nFullWidth = GetSystemMetrics(SM_CXSCREEN);
int nFullHeight = GetSystemMetrics(SM_CYSCREEN);
在PreCreateWindow中
cs.style |= WS_MAXIMIZE;
int nWidth; // window width
int nHeight; // window height
nWidth=GetSystemMetrics(SM_CXSCREEN);//获得系统的分辨率
nHeight=GetSystemMetrics(SM_CYSCREEN);//获得系统的分辨率
cs.cx=nWidth;
cs.cy=nHeight;
窗体透明
::SetWindowLong(this->m_hWnd,GWL_EXSTYLE,GetWindowLong(this->m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
::SetLayeredWindowAttributes(
this->m_hWnd,
RGB(255,255,255),
0,
LWA_COLORKEY // LWA_ALPHA
);
透明
AlphaBlend
透明2
dc.TransparentBlt(0,0,1370,600,&MemDc,0,0,1370,600,RGB(255,255,15));
用于设定当前前景色的混合模式。
SetROP2
输入字符背景颜色为透明
SetBkMode(TRANSPARENT)
防止背景闪烁
设置背景画刷
static CBrush brush(RGB(255,0,0));
SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush);
防止背景闪烁
重载OnEraseBkgnd(CDC* pDC)直接返回TRUE
重要的消息
WM_ACTIVATE //窗口被激活或者取消激活
WM_ACTIVATEAPP
WM_CLOSE //关闭窗口,在消息WM_DESTROY 和 WM_QUIT传递之间被发送
WM_MOVE //移动到新的位置时候触发
WM_MOVEING //正在移动触发
WM_SIZE
WM_SIZEING
键盘消息
WM_CHAR ASCLL码
wparam---包含所按下键的ASCALL 码
lparam---包含一个按位编码的状态矢量,
WM_KEYDOWN / WM_KEYUP 扫描码 Scan code
GetAsyncKeyState()
按键详解见《windows游戏变成大师技巧》第三章,处理重要消息事件
任务。
用win32写个window窗口,
1、画图
2、写字
3、消息
4、按钮子控件
模拟点击按钮---向控件发送信息
获取计算机的信息
GetSystemMetrics();
取高位
LOWORD(lparam);
取低位
HIWORD(lparam);
全屏窗口中去掉边框(默认的凹凸边框)
在OnCreate中添加
ModifyStyleEx(WS_EX_CLIENTEDGE, NULL);
不在标题栏中显示应用
在创建的时候添加
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
添加热键,快捷键
1、//注册热键
RegisterHotKey(GetSafeHwnd(),1001,NULL,VK_F2);
2、监听OnHotKey消息
判断 if(wParam==1001) 是否等于注册ID
修改程序图标
VS2010生成的exe文件图标是用Icon下几个图标中value值最小的,
顺序为IDR_MAINFRAME、IDR_ICONTETYPE、新加 的,
所以想更改生成的exe文件图标,只要保证图标的value值是Icon下几个图标中最小的就可以了
添加系统托盘
1、添加m_nid为类成员变量类型为NOTIFYICONDATA
2、添加成员函数ToTray()
{
m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
m_nid.hWnd = this->m_hWnd;
m_nid.uID = IDR_MAINFRAME;
m_nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP ;
m_nid.uCallbackMessage = WM_SHOWTASK;
m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
wcscpy(m_nid.szTip,_T("魏亚恒是大帅哥"));
Shell_NotifyIcon(NIM_ADD,&m_nid);//在托盘区添加图标
}
3、定义消息#define WM_SHOWTASK WM_USER+1,添加消息WM_SHOWTASK的响应函数afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
在BEGIN_MESSAGE_MAP(CUserDlg, CDialog)和END_MESSAGE_MAP()之间加代码:
ON_MESSAGE(WM_SHOWTASK,onShowTask)
3、编写该函数:
LRESULT CUserDlg::onShowTask(WPARAM wParam,LPARAM lParam){
//wParam接收的是图标的ID,lParam接收的是鼠标的行为
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam){
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
//隐藏),将程序结束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"退出");
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
this->ShowWindow(SW_SHOWNORMAL);//简单的显示主窗口
}
break;
}
return 0;
}
然后在OnInitDialog函数中调用ToTray();
4、为使应用程序退出时图标消失,映射WM_DESTROY消息,在OnDestroy()函数中加入:
::Shell_NotifyIcon(NIM_DELETE,&m_tnid);
5、至此,托盘图标程序的常规功能我们均已实现。我们还可以通过Shell_NotifyIcon()函数的调用实现不同状态下图标的改变,就象金山词霸在主窗口打开与暂停取词时图标有所改变一样。 它常 用来显示一些系统的状态。如:系统时间,音量控制以及其它的一些图标
总体的思想就是这样的
添加自定义右键菜单/ 托盘菜单
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu* pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_LEFTALIGN| TPM_RIGHTBUTTON,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete pPopup;
delete lpoint;
失去焦点菜单消失
SetForegroundWindow();
从磁盘读取位图
LoadImage();
文件操作/文件写入/文本写入文件
FILE *fp1;
fp1 = fopen("E:\\a.txt","w");//只读方式打开文件a.txt
fputs("hello world!",fp1);
fclose(fp1);
CString转成char *
CString str=_T("hello kitty 12345 hello jackson");
int len=str.GetLength();
char *buffer=new char[len+1];
memset(buffer,0,len+1);
WideCharToMultiByte(CP_OEMCP, NULL, (LPCWSTR)str, -1,NULL, 0, NULL, FALSE);
WideCharToMultiByte(CP_OEMCP, NULL, (LPCWSTR)str, -1,(LPSTR)buffer, len, NULL, FALSE);
buffer[len]='\0';
char * 转成 CString
char *str="abcd1234";
//预转换,得到所需空间的大小
int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, inputbuffer, strlen(inputbuffer), NULL, 0);
//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
wchar_t* wszString = new wchar_t[wcsLen + 1];
//转换
::MultiByteToWideChar(CP_ACP, NULL, inputbuffer, strlen(inputbuffer), wszString, wcsLen);
//最后加上'\0'
wszString[wcsLen] = '\0';
//附加到CString对象上
CString content;
content.Append(wszString);
文件操作/创建文件
HANDLE CreateFile(
LPCTSTR lpFileName, // 指向文件名的指针
DWORD dwDesiredAccess, // 访问模式(写 / 读)
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针
DWORD dwCreationDisposition, // 如何创建
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 用于复制文件句柄
);
参数
类型及说明
lpFileName
String ,要打开的文件的名字
dwDesiredAccess
Long ,如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
dwShareMode
Long ,零表示不共享; FILE_SHARE_READ 和 / 或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
lpSecurityAttributes
SECURITY_ATTRIBUTES ,指向一个 SECURITY_ATTRIBUTES 结构的指针,定义了文件的安全特性(如果操作系统支持的话)
dwCreationDisposition
Long ,下述常数之一:
CREATE_NEW
创建文件;如文件存在则会出错
CREATE_ALWAYS
创建文件,会改写前一个文件
OPEN_EXISTING
文件必须已经存在。由设备提出要求
OPEN_ALWAYS
如文件不存在则创建它
TRUNCATE_EXISTING
讲现有文件缩短为零长度
dwFlagsAndAttributes
Long ,一个或多个下述常数
FILE_ATTRIBUTE_ARCHIVE
标记归档属性
FILE_ATTRIBUTE_COMPRESSED
将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
FILE_ATTRIBUTE_NORMAL
默认属性
FILE_ATTRIBUTE_HIDDEN
隐藏文件或目录
FILE_ATTRIBUTE_READONLY
文件为只读
FILE_ATTRIBUTE_SYSTEM
文件为系统文件
FILE_FLAG_WRITE_THROUGH
操作系统不得推迟对文件的写操作
FILE_FLAG_OVERLAPPED
允许对文件进行重叠操作
FILE_FLAG_NO_BUFFERING
禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
FILE_FLAG_RANDOM_ACCESS
针对随机访问对文件缓冲进行优化
FILE_FLAG_SEQUENTIAL_SCAN
针对连续访问对文件缓冲进行优化
FILE_FLAG_DELETE_ON_CLOSE
关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
也可在 Windows NT 下组合使用下述常数标记:
SECURITY_ANONYMOUS , SECURITY_IDENTIFICATION , SECURITY_IMPERSONATION , SECURITY_DELEGATION , SECURITY_CONTEXT_TRACKING , SECURITY_EFFECTIVE_ONLY
hTemplateFile
Long ,如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性
获取窗口位置
GetWindowRect();
动态链接库创建
动态链接库导出函数
_declspec(dllexport) int add(int a,int b){
return a+b;
}
使用动态链接库
1、把lib文件放到工程目录中
2、项目---> 属性--->配置属性-->链接器---->输入---附加依赖项, 加入库名,如: my_API.lib;
2.1、或是在cpp源文件中用代码#pragma comment(lib,"my_API.lib")代替.
3、首先声明函数
extern int add(int a,int b);
或者
_declspec(dllimport) int add(int a,int b); 效率更高
curl笔记
初始化一个curl
curl = curl_easy_init();
为curl设置参数
curl_easy_setopt(curl,)
PHP中的CURL函数库(Client URL Library Function)
curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息
curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。
多字节转宽字符(unicode)
MultiByteToWideChar
例程:
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, (char *)buffer, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwNum];
if(!pwText){
delete []pwText;
}
MultiByteToWideChar (CP_ACP, 0, (char *)buffer, -1, pwText, dwNum);
我们在最开始学习MFC的时候,毫无疑问会遇到这样的问题。
VC6的设置:多字节。
vs的默认设置:Unicode,在属性中可以改成多字节。
多字节编码:char,string,CStringA。
Unicode编码:wchar_t,wstring,CStringW。
注意:如果项目是Unicode,那么CString就被定义为CStringW,否则就是CStringA。
附:
LPSTR = char*;LPCSTR = const char*;
LPWSTR = wchar_t*;LPCWSTR = const wchar_t*;
至于LPCTSTR也是根据项目字符集来定义为LPCWSTR(Unicode)或LPCSTR(多字节)。
OK,上面的定义很明显了,注意用的时候别弄混了,我觉得最好的方式是,使用wchar_t和wstring(api大多使用unicode,即使是多字节版本也是把多字节转成unicode再去调用unicode版api),我不太喜欢CString。
接下来就是转换:www.2cto.com
// C++
char* 到 string:string str("char"); 或者string str = "char";
string 到 char*:const char* ch = str.c_str();
wchar_t* 和 wstring与上相同。
// MFC
char* 到 CStringA:CStringA str("char");
CStringA 到 char*:const char* ch = str.operator LPCSTR(); (注意:反对使用GetBuffer,因为使用这个,必须要ReleaseBuffer,而且很多时候没必要去分配空间)
wchar_t* 和 CStringW与上相同。
// 字符集之间转换
char* 到 wchar_t*:CA2W a2w("char"); const wchar_t* wch = a2w.operator LPCWSTR();
wchar_t* 到 char*:CW2A w2a(L"wchar_t"); const char* ch = w2a.operator LPCSTR(); (注意:反对使用_T("chs")这种方式,程序字符集在一开始就该确定,而且最好选择Unicode)
关于CA2W和CW2A这两个类,可以在atlconv.h中找到源代码,其实就是对WideCharToMultiByte和MultiByteToWideChar的封装。
鼠标拖拽窗口。窗口移动
if(LisDown){
int nX = point.x - prePoint.x;
int nY = point.y - prePoint.y;
CRect rect;
GetWindowRect(&rect);
rect.OffsetRect(nX,nY);
MoveWindow(rect, TRUE);
}
指针。内存分配
realloc
calloc
malloc
memset
不在任务栏显示,隐藏程序
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);//从任务栏中去掉.
设置窗口样式,窗口风格
ModifyStyleEx
0 0
- MFC笔记
- mfc笔记
- MFC 笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- mfc笔记
- mfc笔记
- MFC 笔记
- 南宁肛周脓肿要怎么确诊
- Android控件拖动的实现
- HDU 1087--DP--(水)
- 红孩儿工具箱使用介绍1:拼图处理
- 调用函数后的堆栈平衡
- mfc笔记
- 南宁哪种肛周脓肿手术好
- 南宁治疗肛周脓肿痛不痛
- 00-自测3. 数组元素循环右移问题 (20)
- 南宁肛周脓肿流血怎么办
- Excel Sheet Column Title
- 南宁出现肛周脓肿的原因
- 南宁肛周脓肿的病发原因
- 南宁肛周脓肿的症状图片