[MFC] 记录工作中常用的琐碎知识点
2017-04-10 16:59
1046 查看
这篇博客会持续更新 记录常用到的知识点 内容也会很杂
当class或struct中 含有STL对象时(比如vector或map)不要对创建的对象做memset或ZeroMemory操作 否则就等着崩溃吧
如果class中有虚函数 也不要对类对象做memset或ZeroMemory操作(虚表指针会一并被清零)当调用虚函数时就等着崩溃吧
三种前置窗口的方法:
WM_PAINT的响应函数中 必须调用且只调用一次的函数:BeginPaint和EndPaint(常用的CPaintDC已经在构造和析构中自动调用)
如果不调有什么后果?WM_PAINT消息就不会从消息队列中移除 其响应函数OnPaint会一直被调用 注意:CPainDC只能在WM_PAINT的响应函数中中使用
GetMessage会阻塞、PeekMessage不会阻塞
获取鼠标所在的窗口句柄:
遍历指定窗口的子窗口:
判断指定窗口是否是顶层窗口 & 获取指定窗口的顶层窗口:
获取CEdit中选中的文本:
判断 shift ctrl alt 是否按下了:
在任务栏点击窗口图标 实现窗口的最小化和恢复:
判断滚动条是否已经滚到了末尾:
选择保存路径:
最大化窗口 且不遮挡任务栏:
获取CListCtrl选中行:
让列表框的滚动条 移动到底部:
CPoint转LPARAM: MAKELPARAM(point.x, point.y)
LPARAM转CPoint: GET_X_LPARAM 、GET_Y_LPARAM
判断指定的文件是否存在:
获取UNIX时间戳:
windows原子操作函数:
获取exe所在路径的目录:
当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; }
相关文章推荐
- 工作常用软件记录
- 记录一些工作中常用的工具
- 自己工作过程中小知识点记录2(仅供参考)
- 个人记录一些常用的知识点
- 工作中常用的git操作记录
- 如何去除SQL中的重复记录(加班工作中的知识点回顾)
- GIT 版本控制软件的常用命令记录每次更新到仓库 现在我们手上已经有了一个真实项目的 Git 仓库,并从这个仓库中取出了所有文件的工作拷贝。接下来,对这些文件作些修改,在完成了一个阶段的目标和使用方法
- 工作中常用Linux命令记录
- 记录工作时常用命令
- 记录一些常用和不常用的iOS知识点,防止遗忘丢失。
- MFC界面与控件编程常用函数记录
- 个人工作中常用adb命令记录
- 自我工作中常用的Linux命令记录
- git 工作笔记(自己常用的 git 命令记录)
- 自己工作过程中小知识点记录(仅供参考)
- 日常工作常用数据库知识点汇总【不断完善。。】
- vi在工作中常用的几个知识点
- 工作中常用日语记录
- 工作常用 随笔记录
- 琐碎知识点记录