所学知识

来源:互联网 发布:儿童阅读软件下载 编辑:程序博客网 时间:2024/06/07 03:03
1.HWND hMainWnd = ::FindWindow(NULL, _T("购阿购数据桥接器"));              //找到句柄,0是隐藏,1是显示
::ShowWindow(hMainWnd,0);
::ShowWindow(hMainWnd,1);

2.
copydatestruct cpd;
赋值
::SendMessage(g_hMainWnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)&cpd);        //句柄,接收消息,值,结构体的值
接收方要有系统消息
copydate

3.
        CPaintDC   dc(this);                           //在OnPoint中添加如下代码给窗口添加不失真背景图片
        CRect   rect;   
        GetClientRect(&rect);   
        CDC   dcMem;   
        dcMem.CreateCompatibleDC(&dc);   
        CBitmap   bmpBackground;   
        bmpBackground.LoadBitmap(IDB_TITLE);    
        BITMAP   bitmap;   
        bmpBackground.GetBitmap(&bitmap);   
        CBitmap   *pbmpOld=dcMem.SelectObject(&bmpBackground);   
        CRect wndRt;
        this->GetClientRect(&wndRt);
        dc.SetStretchBltMode(HALFTONE);        //设置拉伸模式后,解决失真的现象
        dcMem.SelectObject(&bmpBackground);  
        dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);   

4.                                                //使窗口透明的办法,初始化函数中
             SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,  
             GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)|WS_EX_LAYERED);  
 
        HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));  
 
       if (hInst)  
        {  
                typedef BOOL (WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);  
          
              MYFUNC fun = NULL;  
          
                CHAR str[] = "SetLayeredWindowAttributes";  
    
            fun = (MYFUNC) GetProcAddress(hInst,str);  
      
                   if (fun)  
               {  
                            fun(this->GetSafeHwnd(),RGB(255,255,255),20,LWA_ALPHA);  
                        }  
          
                    FreeLibrary(hInst);  
        }  
   
      return TRUE;
5.                                            //在初始化中这么写可以使窗口的优先级在最上面                                                    
::SetWindowPos(GetSafeHwnd(),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);        

6. //在左键鼠标按下的时候,可以拖动窗口,一句话就解决了
SendMessage(WM_SYSCOMMAND,0xF012,0);

7. 右键菜单
在右键按下消息事件中
    CMenu m_Right;//定义下面要用到的cmenu对象
    m_Right.LoadMenu(IDR_R_BTND);//装载自定义的右键菜单
    CMenu *pSub = m_Right.GetSubMenu(0);//获取第一个弹出菜单
    ClientToScreen(&point);//定义一个用于确定光标位置的位置  
    pSub->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this,NULL);
    CDialog::OnRButtonDown(nFlags, point);

添加自己写函数,在消息响应中写下    ON_COMMAND(ID_HIDE, hidewindow)//第一个值是菜单子项的id,第二个值是你要采取的函数

8.CDC是个类,HDC是个资源句柄,CDC类中那个m_hdc成员就是资源句柄HDC
这个关系和HWND和CWnd类似,一个是窗口句柄,一个是窗口类,CWnd中有个m_hWnd就是HWND

9.::SendMessage (m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);                       
一句话就解决无标题窗口的移动了  在左键按下的时候

10.Ctime的使用

昨天:
CTime m_Date = CTime::GetCurrentTime() - CTimeSpan( 1, 0, 0, 0 );
明天
CTime m_Date = CTime::GetCurrentTime() + CTimeSpan( 1, 0, 0, 0 );

CTimeSpan的第一个参数换成其他数值就可以计算若干天之前或之后的日期了。
//显示基于当前系统时间前一个月的时间,a就为上一个月的时间了
CTime a =CTime::GetCurrentTime();
    a =CTime(a.GetYear(),a.GetMonth()-1,a.GetDay(),a.GetHour(),a.GetMinute(),a.GetSecond());

11.BOOL IsWindowVisible(句柄) 可以判断窗口是否显示

12.获取txt文本中的内容

strContents就是文本的内容
CString strNotityFile=L"C://Users//Administrator//Desktop//aaa.txt";
    CStdioFile m_sfFile(strNotityFile, CFile::modeRead);  
    CString strContents;  
    /* Title */
    if (FALSE != m_sfFile.ReadString(strContents))  
    {                 
    }

13.获取dll中接口函数返回的值

获取dll的模块基地址

HMODULE g_hModPayAssistant = NULL;
void CdemoSendMessageDlg::OnBnClickedOk()
{
    WCHAR  szModulePath[MAX_PATH] = {0};
    wcscat_s(szModulePath, MAX_PATH, L"C://FetchView//GooDataBridge//PayAssistant.dll");
    g_hModPayAssistant = LoadLibrary(szModulePath);

 
    hWNDGetWindow = (PFunPAGetWindow)GetProcAddress(g_hModPayAssistant,  BILL_CAPTURE_DLL_PA_PAGETWINDOW);
    HWND a = hWNDGetWindow();

    COPYDATASTRUCT cpd;
    cpd.lpData = NULL;
    cpd.dwData = NULL;
    WPARAM hwnd = NULL;
    ::SendMessage( a, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)&cpd);    
    
}

14.unicode下将cstring转换成char* 的办法

可以添加文件#include <afxpriv.h>
然后这样:
CString strTest = _T("abcd");
USES_CONVERSION;
char* p = T2A(strTest);

15.access的使用判断文件是否存在

access(c_str, 0);前值为文件地址,后面的值判断文件属性

16.string和cstring的转换
CString Cstr(strING.c_str());

17.该函数可以打开响应的窗口应用程序
ShellExecute(NULL, NULL, _T("C://FetchView//GooDataBridge//FloatWindow.exe"), _T(""), _T(""), SW_SHOWNORMAL);

18.拼字符串方法
TCHAR path[MAX_PATH];
    GetModuleFileName(NULL,path,MAX_PATH);//得到当前项目字符串
    CString    strWorkDataPath = path;
    int nPos = strWorkDataPath.ReverseFind('\\');
    strWorkDataPath = strWorkDataPath.Left(nPos);
    CString    strCurrentPath = strWorkDataPath;
    strCurrentPath += _T("\\FloatWindow.exe");

19.mfc刷新数据
UpdateData();

20定时器用法,挺好的
创建定时器:SetTimer(1,1000,NULL);
1表示定时器的ID,1000表示没1000ms也就是1s调用一次处理函数,最后一个参数是处理的函数,如果填NULL表示,使用系统默认的,默认处理函数是OnTimer()那个函数,在这里面写你要执行的操作就可以了,如果你有多个定时器要在这里写if(id == 1)类似的东西去区分不同的定时器,更换贴图最好是在OnTimer里面更换当前显示的图片编号,然后刷新界面,更换图片的工作让OnPaint去做,让他们各司其职。
关闭定时器:KillTimer(1)

21
ON_COMMAND(ID_HIDE, hidewindow)绑定控件和函数
ON_MESSAGE(WM_FIND_POS_WIN,OnRecvMainProcMessage)绑定自定义消息号和函数

22
vs2008使用64位编译MFC程序抱很多链接错,怎么解决?
1把CWinAppEx全部改为CWinApp,进入stdafx.h
注释掉#include <afxcontrolbars.h>     // 功能区和控件条的 MFC 支持

23
如果输入参数中直接赋值了,调用函数的时候可以不添值有默认值

24 获取当前时间的字符串
    CTime tm;
    tm=CTime::GetCurrentTime();
    CString str=tm.Format("%Y%M%D%H%M%S");

25.
    shellexcutet()函数打开exe死里面解决方案,
很多程序如果不以管理员身份运行的话无法操作到系统盘的一些文件,有些更加严重的是会在运行过程中直接报错,虽说可以通过修改该可执行文件的属性,设置其默认执行权限为“以管理员身份运行”,然这毕竟麻烦,且很多用户根本就不会这么去做,是故让程序执行时就自己去要求管理员权限是最终的解决方法。
在VS下面,这个问题其实很好解决,就是做如下操作:右键工程名称选择属性->配置属性->链接器->清单文件->UAC执行级别 在下拉列表框中选择:requireAdministrator (/level='requireAdministrator'),OK,大功告成!

26.GetLastError 写入日志
DWORD dwErr=GetLastError();
        PALOG("Err=%d",dwErr);

27读取组侧表路径
HKEY hKey;
    DWORD dwType = REG_SZ;
    DWORD dwSize = MAX_PATH;
    wchar_t data[MAX_PATH];

    
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\FetchView\\GooDataBridge",0,KEY_ALL_ACCESS,&hKey)!= ERROR_SUCCESS)
    {
        PALOG("注册表位置打开失败");
        return FALSE;
    }
    if(RegQueryValueEx(hKey,L"AppPath", NULL, &dwType, (LPBYTE)data,&dwSize) != ERROR_SUCCESS)//问题所在就是输入参数没有初始化辅助
    {
        PALOG("注册表键值打开失败");
        DWORD dwErr=GetLastError();
        PALOG("Err=%d",dwErr);
        return FALSE;
    }
28 sprint_f

/*例子*/
 
 
#include<stdio.h>/*某个stdio.h*/
 
int main()/*主函数“整数”类型*/
{
 char buffer[50];/*“字符”类型的数组,下面共有50个元素。*/
 int n,a=5,b=3;/*三个变量都为“整数”类型,int中间要有空格*/
n=sprintf(buffer,"%d plus %d is %d",a,b,a+b);/*赋予数值*/
printf("[%s]is a string %d chars long\n",buffer,n);/*“格式输出函数”*/
return 0;/*“返回零”
也就是程序正常退出*/
}
 
29.wchar*转char*
CString csSql = SqlInsertBillItem(bi);
    USES_CONVERSION;
    char *cPortName = W2A(csSql.GetBuffer());

30.wstring 转string   unicode下cstring.getbuff不能直接转换成string

CString CsTime=tm.Format("%Y%m%d%H%M%S");
            wstring Wstr_time =CsTime.GetBuffer();
            int size=WideCharToMultiByte(CP_ACP,0,Wstr_time.c_str(),-1,NULL,0,NULL,NULL);
            char *ch=new char[size+1];
            WideCharToMultiByte(CP_ACP,0,Wstr_time.c_str(),-1,ch,size,NULL,NULL);
            string Str_time=ch;

31.extern可以让其他文件不识别的全局变量。
extern的原理很简单,就是告诉 编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的 全局变量,你要放行!”

32.向txt写入文件
#include  <fstream>
using namespace std;
ofstream fout;
    fout.open("C:\\123456.txt");
    int num =150;
    char name[] ="carry";
    fout<<"你多大:"<<num<<endl;
    fout<<"你叫啥:"<<name<<"/r/n";
    fout<<flush;
    fout.close();

33.一个string=“20151112153352”的时间字符串变成能看懂的时间
    CString csTime = bi->billTime(string);
        if (csTime.GetLength() == 14)
        {
            csTime.Insert(12, ':');
            csTime.Insert(10, ':');
            csTime.Insert(8, ' ');
            csTime.Insert(6, '-');
            csTime.Insert(4, '-');
        }

34.金额从分转换成元
        CStringA    CsAmount;
        double F_Amount;
        F_Amount =(double)pri.amount/100.0;
        CsAmount.Format("%2f.",F_Amount);

35.string截取
可以用substr这个方法,有两个输入参数分别为起始地址和截取的长度。
s2 = s1.substr(0,3);
s3 = s1.substr(4,3);

如果写的更通用一点,就是先查找“+”的位置,然后在分隔。
size_t iPos = s.find("+");
s2 = s1.substr(0, iPos);
s3 = s1.substr(iPos+1, s1.length()-iPos-1);

36.unicode 多字节转换
以前看《Window核心编程》,感觉多字节和宽字节之间还比较麻烦的,至少MultiByteToWideChar函数和WideCharToMultiByte函数有足够多的参数的意义让我们去理解。近日接触了ATL的一个很好的字符串的转换宏:A2W和W2A。

 用法很简单,A2W的用法:

       #include <atlconv.h>
       DoSomething(LPWSTR str);  //  函数声明

       USES_CONVERSION;
       DoSomething(A2W("SomeString"));
 
       W2A的用法:

    #include <atlconv.h>
    DoSomething(LPCSTR str); //  函数声明

     USES_CONVERSION;
    DoSomething(W2A(L"SomeString"));
    
37.双缓存使得屏幕不闪烁
在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。
因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。于是我们就看到了闪烁现象。
我们会很自然的想到,避免背景色的填充是最直接的办法。但是那样的话,窗体上会变的一团糟。因为每次绘制图象的时候都没有将原来的图象清除,造成了图象的残留,于是窗体重绘时,画面往往会变的乱七八糟。所以单纯的禁止背景重绘是不够的。我们还要进行重新绘图,但要求速度很快,于是我们想到了使用BitBlt函数。它可以支持图形块的复制,速度很快。我们可以先在内存中作图,然后用此函数将做好的图复制到前台,同时禁止背景刷新,这样就消除了闪烁。以上也就是双缓冲绘图的基本的思路。
void CPayAssistantDlg::DisplayBmp(int x, int y, int w, int h, int nID)
{
    //create dc
    CDC* pDC = GetWindowDC();
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);

    //bitmap
    BITMAPINFO bmpInfo;
    CBitmap bmp;
    bmp.LoadBitmap(nID);
    bmp.GetObject(sizeof(BITMAPINFO),&bmpInfo);
    int nBmpCX = bmpInfo.bmiHeader.biWidth;
    int nBmpCY = bmpInfo.bmiHeader.biHeight;
    memDC.SelectObject(bmp);

    //draw bitmap
    pDC->StretchBlt(x, y, w, h, &memDC, 0, 0, nBmpCX, nBmpCY, SRCCOPY);
    bmp.DeleteObject();

    //release dc
    ReleaseDC(pDC);
}   

38.判断是否获取焦点
用控件的id,这就是没在控件焦点的条件  GetDlgItem(IDC_SEARCH)->GetSafeHwnd() != ::GetFocus()

39.鼠标移动事件
SetCursorPos(X, Y);

40.DoDataExchange函数其实是一项数据动态绑定技术。比如你在写动态按扭过程中须对按钮添加变量时,怎么添加?控件类已经写好了,其变量是已经固定的。你要添加新的变量就要用到DoDataExchange函数。

41.使用全局变量要在主类上定义 int a =0;  在子类上用extern int a;就可以用了

42.创建文件夹
//避免被重复创建
    DWORD dwAttr=GetFileAttributesA(strDir.c_str());
    if(dwAttr==0xFFFFFFFF)
    {
        //创建当前日期文件夹
        CreateDirectoryA(strDir.c_str(),NULL);
    }
    
43.互斥体防止exe被重复启用
//初始化中
    HANDLE m_hMutex = NULL;
    /* 是否已经创建互斥量,保证主程序只能运行一个实例 */
    if (FALSE != IsMutexCreated(m_hMutex))
    {
        AfxMessageBox(L"商家服务助手已经启动");
        return FALSE;
    }
//函数    
BOOL CExpressMallApp::IsMutexCreated(OUT HANDLE &hMutex)
{
    /*
       mall助手只能启动一个实例:该互斥体只能控制在同一账户下启动一个实例,
       但是在同一PC的多账户下无法保证
    */
    hMutex = ::CreateMutex(NULL, FALSE, _T("MallAssist"));
    int err = GetLastError();
    if (ERROR_ALREADY_EXISTS == err)
    {
        Sleep(300);
        //单例/*创建一个互斥体*/
        hMutex = ::CreateMutex(NULL, FALSE, _T("MallAssist"));//防止之前exe没退出再次启动exe
        if (ERROR_ALREADY_EXISTS == GetLastError())
        {
            return TRUE;
        }
    }
    return FALSE;
}

44.两个进程通讯时 当一个进程向另一个进程发sendmessage时候,另一个进程在初始化窗口函数中,不会收到copydata消息!!!

45.%.2f  保留小数后两位

46.int 转cstring  uinicode下转 _ttoi(csTurnPage.GetBuffer());

47.接收消息格式
    COPYDATASTRUCT copyData;
    copyData.dwData = 0x8;    //pay time out
    copyData.cbData = (DWORD)strMsg.length();
    copyData.lpData = (LPSTR)strMsg.c_str();
    ::SendMessage(m_hMainWnd, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&copyData);
    
48.    若文件夹不存在,创建文件夹
    DWORD dwAttr=GetFileAttributes(strWorkDataPath);
    if(dwAttr==0xFFFFFFFF)
    {
        CreateDirectory(strWorkDataPath,NULL);
    }
    
49.    //TRACE("Mouse move:(%d,%d) InRegion=%d\n",point.x,point.y,bInRegionNow); 在输入中写信息      
0 0