MFC绘图相关

逻辑坐标系 虚拟坐标
设备坐标系 显示器 打印机等实体设备
逻辑坐标->(转换为)设备坐标

CPaintDC 在OnPaint函数绘图
CClientDC 在客户区绘图 非OnPaint函数中 创建对象的时候将this改为NULL即为全屏
CWindowDC 在窗口绘图

设置背景模式
CDC::SetBkMode(TRANSPARENT);//将绘图对象,背景修改为透明
坐标系映射模式
CDC::SetMapMode(MM_LOMETRIC);//修改映射模式
修改坐标原点
CDC::SetViewportOrg(100,100);//移动视图原点
获取设备信息
CDC::GetDeviceCaps();//宽HORZRES | 高VERTRES
绘图函数
CDC::MoveTo(); 移动原点
CDC::LineTo(); 绘制直线
CDC::Polyline(); 绘制一组(需要指定开始位置)
CDC::PolylineTo(); 绘制一组(从当前位置,移动原点)

CDC::Ellipse(); 绘制圆或椭圆
CDC::RoundRect(); 绘制圆角矩形
CDC::Rectangle(); 绘制直角矩形
设备描述表
SelectObject 设置设备描述表(返回旧设备描述表)
DeleteObject 删除设备描述表

//HDC转CDC
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);

// 声明无效(重绘)

Invalidate()

// 双缓冲绘制
// MFC

// 创建相匹配的DC
HDC hMemDC = ::CreateCompatibleDC(dc.m_hDC);
// 根据DC设置CDC*
CDC* pDC = CDC::FromHandle(hMemDC);
// 使用pDC绘制图形
DrawMenuText(dc);
// 获取客户区大小
CRect ClientRect;
GetClientRect(&ClientRect);
// 绘制缓冲区中的图片
::BitBlt(dc.m_hDC,0,0,ClientRect.right,ClientRect.bottom,hMemDC,0,0,SRCCOPY);
// 删除DC
::DeleteDC(hMemDC);

// API

hdc = BeginPaint(hWnd, &ps);
HDC hMemDC = CreateCompatibleDC(hdc);
HBITMAP  hBmpMem = CreateCompatibleBitmap(hdc, 300, 200);
HBITMAP hPreBmp = (HBITMAP)SelectObject(hMemDC, hBmpMem);
// 使用开始绘图hMemDC
BitBlt(hdc, 50, 50, 300, 200, hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hPreBmp);
DeleteObject(hBmpMem);
DeleteDC(hMemDC);
EndPaint(hWnd, &ps);

WinAPI窗口查询

FindWindow

// 查找对话框
HWND hMainWnd = ::FindWindow(_T("#32770"), _T("标题"));
// 查找记事本
HWND hMainWnd = ::FindWindow(_T("Notepad"), _T("无标题 - 记事本"));
// 查找计算器
HWND hMainWnd = ::FindWindow(_T("CalcFrame"), _T("计算器"));

// 函数原型
HWND WINAPI FindWindow(
  _In_opt_ LPCTSTR lpClassName, // 窗口类 (对话框类 #32770)
  _In_opt_ LPCTSTR lpWindowName // 窗口标题
);

FindWindowEx



// 函数原型
HWND WINAPI FindWindowEx(
  _In_opt_ HWND    hwndParent, // 父窗体句柄
  _In_opt_ HWND    hwndChildAfter, // 从哪个子窗体查起
  _In_opt_ LPCTSTR lpszClass, // 窗口类
  _In_opt_ LPCTSTR lpszWindow // 窗口标题
);

EnumWindows

EnumChildWindows

MFC获取MAC地址

需要引入头文件和静态库

#include 
#pragma comment(lib, "iphlpapi.lib")
// 获取本机MAC
CString GetLocalMAC()
{
    CString strMAC;

    u_char pMac[6];
    PIP_ADAPTER_INFO adp = NULL;
    ULONG uLong = 0;
    //为适配器申请内存
    ::GetAdaptersInfo(adp, &uLong);
    adp = (PIP_ADAPTER_INFO)::GlobalAlloc(GPTR, uLong);

    //取得本地适配器结构信息
    if (::GetAdaptersInfo(adp, &uLong) == ERROR_SUCCESS)
    {
        if (adp != NULL)
        {
            //strMacAdd.Format("%s",adp->Address);
            memcpy(pMac, adp->Address, 6);
            strMAC.Format(L"%02X-%02X-%02X-%02X-%02X-%02X", pMac[0], pMac[1], pMac[2], pMac[3], pMac[4], pMac[5]);
        }
    }
    return strMAC;
}

WinAPI文件夹(目录)操作

获取Windows目录

wchar_t wszWindowsDirectory[MAX_PATH] = { 0 };
GetWindowsDirectory(wszWindowsDirectory, MAX_PATH);

获取System目录

wchar_t wszSystemDirectory[MAX_PATH] = { 0 };
GetSystemDirectory(wszSystemDirectory, MAX_PATH);

获取临时文件的路径

wchar_t wszTempPath[MAX_PATH] = { 0 };
GetTempPath(MAX_PATH, wszTempPath);    

获取工作目录

wchar_t wszCurrentDirectory[MAX_PATH] = { 0 };
GetCurrentDirectory(MAX_PATH, wszCurrentDirectory);

设置工作目录

SetCurrentDirectory(_T("d:\\"));

创建目录

CreateDirectory(_T("d:\\test1"));
// 创建多层目录
SHCreateDirectoryEx(NULL, _T("d:\\path1\path2\path3"), NULL);

删除目录

// 删除普通目录
RemoveDirectory(_T("d:\\test1"));

// 删除一个非空目录
SHFILEOPSTRUCT FileOP= { 0 };
// 不在出现确认对话框
FileOP.fFlags = FOF_NOCONFIRMATION; 
// 设置删除的路径
FileOP.pFrom = _T("d:\\test1");
// 删除操作
FileOP.wFunc = FO_DELETE;
SHFileOperation(&FileOP);

修改目录名称

BOOL MoveFile(_T("d:\\test1"),_T("d:\\NewName"));

打开保存文件对话框的模板和OFNHookProc钩子

先看一下效果

这个会根据选择的类型不同, 改变COMBOBOXEX列表的内容.

和上篇一样定义结构体并给成员变量赋值,
如果没看过”WinAPI打开文件对话框“这篇文章可以看一下, 这个是演示了一下, 一个基本的打开文件对话框的产生,
也可以看一下”WinAPI保存文件对话框“这篇文章保存文件对话框, 代码大体相同, 只有调用的函数不同, 结构体是同一个,
这一次我们要给通用对话框, 增加独有功能, 在原有代码的基础上增加一些信息.
1.在资源文件中添加一个对话框窗口,对话框Border属性为None和Style属性设置为Child (如下图)

2.定义一个callback函数, 原型为

UINT_PTR CALLBACK OpenFileDialogHookProc(
    _In_ HWND   hdlg,
    _In_ UINT   uiMsg,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam);

3.在原有结构体的基础上分别实现 Flags、lpfnHook、lpTemplateName、hInstance成员如下:

// 设置风格
OpenFileName.Flags = OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLETEMPLATE | OFN_ENABLESIZING;
// 设置hook
OpenFileName.lpfnHook = OpenFileDialogHookProc;
// 设置模板(对话框ID)
OpenFileName.lpTemplateName = MAKEINTRESOURCE(IDD_TEMPLATE);
// 设置实列句柄
OpenFileName.hInstance = hInst;

将一些新属性赋值到Flags变量
使用钩子 OFN_ENABLEHOOK
资源管理器样式 OFN_EXPLORER
使用模板 OFN_ENABLETEMPLATE
允许缩放 OFN_ENABLESIZING

将定义好的HOOK函数, 赋值到lpfnHook变量

IDD_TEMPLATE把定义好的对话框ID,通过MAKEINTRESOURCE转换, 赋值到lpTemplateName变量.

把当前应用程序实列句柄赋值到hInstance变量

{% note danger %}

按照现在的窗口可以显示出来, 也带有自己添加的模板, 但是会出现如上图这种情况也(还会根据窗口大小自动缩放),不过也是正常,
系统并不知道我们将对话框放到哪个位置, 在这里需要我们自己指定,对话框出现的位置.
{% endnote %}
博主纠正一下错误,这个原因是因为没有Style属性设置为Child, 默认模板对话框出现在底部