您的位置:首页 > 其它

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

2017-04-10 16:59 1046 查看
这篇博客会持续更新 记录常用到的知识点 内容也会很杂

当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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: