[MFC] 记录工作中常用的琐碎知识点

来源:互联网 发布:大数据概念板块 编辑:程序博客网 时间:2024/05/11 03:43

这篇博客会持续更新 记录常用到的知识点 内容也会很杂


当class或struct中 含有STL对象时(比如vector或map)不要对创建的对象做memset或ZeroMemory操作 否则就等着崩溃吧

如果class中有虚函数 也不要对类对象做memset或ZeroMemory操作(虚表指针会一并被清零)当调用虚函数时就等着崩溃吧


三种前置窗口的方法:

::SetForegroundWindow(hWnd);::BringWindowToTop(hWnd); ::SetWindowPos(hWnd, HWND_TOPMOST, rtClient.left, rtClient.top, rtClient.Width(), rtClient.Height(), SWP_SHOWWINDOW); // 缺点:窗口会始终在顶层


WM_PAINT的响应函数中 必须调用且只调用一次的函数:BeginPaint和EndPaint(常用的CPaintDC已经在构造和析构中自动调用)

如果不调有什么后果?WM_PAINT消息就不会从消息队列中移除 其响应函数OnPaint会一直被调用  注意:CPainDC只能在WM_PAINT的响应函数中中使用


GetMessage会阻塞、PeekMessage不会阻塞

获取鼠标所在的窗口句柄:
CPoint pt;GetCursorPos(&pt); // 屏幕坐标HWND hHitWnd = ::WindowFromPoint(pt);

遍历指定窗口的子窗口:
void TravalChildWnd(HWND hParent){HWND hChild = ::GetWindow(hParent, GW_CHILD);while (hChild && ::IsWindow(hChild)){// 遍历出一个子窗口 : hChild   TravalChildWnd(hChild); // 递归遍历hChild = ::GetNextWindow(hChild);}}
判断指定窗口是否是顶层窗口 & 获取指定窗口的顶层窗口:
bool IsTopWindow(HWND hWnd){long Style = ::GetWindowLong(hWnd, GWL_STYLE);return bool(Style & WS_POPUP);}HWND GetTopHwnd(HWND hWnd){HWND hTop = 0;  HWND hTemp = hWnd;while (::IsWindow(hTemp)){hTop = hTemp;hTemp = ::GetParent(hTemp);if (IsTopWindow(hTemp))break;}return hTop;}

获取CEdit中选中的文本:
CString CMyDialog::GetSelectString(){CString txt;m_EditMsg.GetWindowText(txt);int nStart, nEnd;m_EditMsg.GetSel(nStart, nEnd);   std::wstring str = txt.GetBuffer();CString ret = str.substr(nStart, nEnd - nStart).c_str();return ret;}

判断 shift  ctrl alt 是否按下了:
BOOL IsCtrlPressed() { return ((GetKeyState(VK_CONTROL) & (1<<(sizeof(SHORT)*8-1))) != 0);}BOOL IsAltPressed() { return ((GetKeyState(VK_MENU) & (1<<(sizeof(SHORT)*8-1))) != 0);}BOOL IsShiftPressed() { return ((GetKeyState(VK_SHIFT) & (1<<(sizeof(SHORT)*8-1))) != 0);}

在任务栏点击窗口图标 实现窗口的最小化和恢复:
ModifyStyle(0,  WS_MINIMIZEBOX); 

判断滚动条是否已经滚到了末尾:
    SCROLLINFO si = {};    si.cbSize = sizeof(si);    si.fMask = SIF_ALL;    GetScrollInfo(SB_VERT, &si);    if ((si.nPos + si.nPage) > (si.nMax + 1))    {        return TRUE;    }   

选择保存路径:
BOOL  OnBroser(){    BROWSEINFO bi;    bi.hwndOwner = *this;    bi.pidlRoot = NULL;    bi.pszDisplayName = NULL;    bi.lpszTitle = _T("Set Save Path");    bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;    bi.lpfn = NULL;    bi.lParam = 0;    bi.iImage = 0;    LPITEMIDLIST pidl = SHBrowseForFolder(&bi);    if (pidl == NULL)        return FALSE;    TCHAR pszPath[MAX_PATH + 1] = {};    if (SHGetPathFromIDList(pidl, pszPath))        m_btnShowPath.SetWindowText(pszPath); // pszPath就是选中的到处路径    return TRUE;}

最大化窗口 且不遮挡任务栏:
CRect rt;SystemParametersInfo(SPI_GETWORKAREA, 0, &rt, 0);int cx = GetSystemMetrics(SM_CXFULLSCREEN);int cy = rt.bottom;::MoveWindow(HWND, 0, 0, cx, cy, TRUE);

获取CListCtrl选中行:
int selectindex = m_list.GetNextItem(-1,LVNI_ALL | LVNI_SELECTED);

让列表框的滚动条 移动到底部:
m_list_log.PostMessage(WM_VSCROLL,SB_LINERIGHT,0);

CPoint转LPARAM: MAKELPARAM(point.x, point.y)
LPARAM转CPoint: GET_X_LPARAM 、GET_Y_LPARAM

判断指定的文件是否存在:
  if (-1 != GetFileAttributes("C://erverFile"))   {       printf("指定文件存在 \n");  }

获取UNIX时间戳:
uint64 GetNowUnixTime(){ union {  long long ns100;  FILETIME ft; } now; GetSystemTimeAsFileTime (&now.ft); return (now.ns100 - 116444736000000000) / 10000;}

windows原子操作函数:
#include<windows.h>long InterlockedIncrement(long volatile* Addend); // 返回新值long InterlockedDecrement(long volatile* Addend); // 返回新值long InterlockedExchangeAdd(long  volatile* Addend, long Value);  //  增加指定值 返回原始值long InterlockedExchange(long volatile* Target, long Value); //  替换值 返回原始值

获取exe所在路径的目录:
const WCHAR* GetExeDir(){ static WCHAR s_szFilePath[MAX_PATH] = {};if (wcslen(s_szFilePath) > 0)return s_szFilePath;GetModuleFileNameW(NULL, s_szFilePath, MAX_PATH); int nLen = (int)wcslen(s_szFilePath);for (int i = nLen - 1; i >= 0; --i){if (s_szFilePath[i] == '\\'){s_szFilePath[i + 1] = 0;break;}}return s_szFilePath;}
0 0
原创粉丝点击