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
0 0
原创粉丝点击