在网上查了很多资料关于封装DLL中添加资源显示窗体的具体操作过程,有些可以借鉴。我在这里做一个简单的例子,供大家分享。
在创建的窗体中进行图像的描画,关于双缓冲描画图像的问题,在此总结一下我在处理过程中遇到的一些问题,供大家参考。
1 添加资源创建窗体的动态库封装
我使用的是VS2013,和普通的DLL动态库封装相同,首先创建MFC DLL工程(工程名:MFCDLL),在生成的工程文件中添加动态库的外部接口。
例: MFCDLL.h 中添加 extern "C" void Show();
MFCDLL.cpp中添加 :
void Show()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CTest test;
test.DoModal();
}
其中 CTest 是添加资源时创建的类。
MFCDLL.def 中添加 Show。
然后在工程名上右键添加资源,选择 Dialog 并新建。出现新建的窗体,在窗体上双击弹出类向导,创建类名(CTest),基类选择CDialog,完成。
2 如果想要在创建的窗体上添加描画区域,可以添加Picture控件(或者static edit)。
为添加的Picture控件修改ID名,这样就可以在类向导中为添加的Picture添加变量(m_todraw)。添加的该变量就是描画区域的窗口句柄。
在窗体中要有描画的话,最好是实现virtual BOOL OnInitDialog(); 在该函数中可以添加一些双缓冲描画的初始化。例:
BOOL CTest::OnInitDialog()
{
CDialog::OnInitDialog();
RECT rt;
m_todraw.GetClientRect(&rt);
hdc = m_todraw.GetDC();
m_memDC.CreateCompatibleDC(hdc); //随后建立与屏幕显示兼容的内存显示设备
m_Bmp.CreateCompatibleBitmap(hdc, rt.right - rt.left, rt.bottom - rt.top);
SelectObject(m_memDC.GetSafeHdc(), m_Bmp);//将位图选入到内存显示设备中
m_memDC.FillSolidRect(&rt, 0x00FFFFFF);//先用背景色将位图清除干净,这里我用的是白色作为背景
m_todraw.ReleaseDC(hdc);
return TRUE;
}
添加WM_Paint的处理事件OnPaint,
void CTest::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
CDialog::OnPaint();
PAINTSTRUCT ps;
CDC * pDC = m_todraw.BeginPaint(&ps);
pDC->BitBlt(ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, &m_memDC, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);
m_todraw.EndPaint(&ps);
}
这样既可实现带有白色背景的描画区域的窗体,如果想要描画其他图像可以根据需要在白色区域中进行描画。区域信息改变后需要通过调用InvalidateRect(&rt); 进行页面更新。
以上是我在做项目过程中做的一些小总结,希望能够帮助到大家,能给大家提供一些借鉴,如果有什么问题或者不对的地方还请大家能够提出宝贵意见和建议。