不规则对话框的实现 C++
2009-03-31 18:28
381 查看
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 在 OnInitDialog() 时初始化相关数据 HDC hdcs; HBITMAP pBitmap; CBitmap m_bmp;
pBitmap = (HBITMAP)LoadImage(NULL,"图片.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hdcs = CreateCompatibleDC(NULL);
m_bmp.Attach( pBitmap );
BITMAP bm;
m_bmp.GetBitmap(&bm);
CRect rtWindow;
GetWindowRect(&rtWindow);
rtWindow.right = rtWindow.left+bm.bmWidth;
rtWindow.bottom =rtWindow.top +bm.bmHeight;
MoveWindow(&rtWindow);
CClientDC dc(this);
SetupRegion(&dc,m_bmp,RGB(191,194,114) );
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 最后在 OnPaint 的else 里面
CClientDC dc(this);
CDC picDC;
picDC.CreateCompatibleDC (&dc);
CBitmap *pOldBmp;
pOldBmp = picDC.SelectObject (&m_bmp);
BITMAP bm;
m_bmp.GetBitmap(&bm);
dc.BitBlt (0,0,bm.bmWidth ,bm.bmHeight,&picDC,0,0,SRCCOPY);
dc.SelectObject(pOldBmp);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 下面是主代码
void CtextDemoDlg::SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)
{
CDC memDC;
//创建与传入DC兼容的临时DC
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldMemBmp=NULL;
//将位图选入临时DC
pOldMemBmp=memDC.SelectObject(&cBitmap);
CRgn wndRgn;
//创建总的窗体区域,初始region为0
wndRgn.CreateRectRgn(0,0,0,0);
BITMAP bit;
cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽
int y;
for(y=0;y<=bit.bmHeight ;y++)
{
CRgn rgnTemp; //保存临时region
int iX = 0;
do
{
//跳过透明色找到下一个非透明色的点.
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
iX++;
//记住这个起始点
int iLeftX = iX;
//寻找下个透明色的点
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
++iX;
//创建一个包含起点与重点间高为1像素的临时“region”
rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);
//合并到主"region".
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
//删除临时"region",否则下次创建时和出错
rgnTemp.DeleteObject();
}while(iX <bit.bmWidth );
iX = 0;
}
if(pOldMemBmp)
memDC.SelectObject(pOldMemBmp);
CWnd * pWnd = pDC->GetWindow();
pWnd->SetWindowRgn(wndRgn,TRUE);
pWnd->SetForegroundWindow();
}
// 在 OnInitDialog() 时初始化相关数据 HDC hdcs; HBITMAP pBitmap; CBitmap m_bmp;
pBitmap = (HBITMAP)LoadImage(NULL,"图片.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hdcs = CreateCompatibleDC(NULL);
m_bmp.Attach( pBitmap );
BITMAP bm;
m_bmp.GetBitmap(&bm);
CRect rtWindow;
GetWindowRect(&rtWindow);
rtWindow.right = rtWindow.left+bm.bmWidth;
rtWindow.bottom =rtWindow.top +bm.bmHeight;
MoveWindow(&rtWindow);
CClientDC dc(this);
SetupRegion(&dc,m_bmp,RGB(191,194,114) );
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 最后在 OnPaint 的else 里面
CClientDC dc(this);
CDC picDC;
picDC.CreateCompatibleDC (&dc);
CBitmap *pOldBmp;
pOldBmp = picDC.SelectObject (&m_bmp);
BITMAP bm;
m_bmp.GetBitmap(&bm);
dc.BitBlt (0,0,bm.bmWidth ,bm.bmHeight,&picDC,0,0,SRCCOPY);
dc.SelectObject(pOldBmp);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 下面是主代码
void CtextDemoDlg::SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)
{
CDC memDC;
//创建与传入DC兼容的临时DC
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldMemBmp=NULL;
//将位图选入临时DC
pOldMemBmp=memDC.SelectObject(&cBitmap);
CRgn wndRgn;
//创建总的窗体区域,初始region为0
wndRgn.CreateRectRgn(0,0,0,0);
BITMAP bit;
cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽
int y;
for(y=0;y<=bit.bmHeight ;y++)
{
CRgn rgnTemp; //保存临时region
int iX = 0;
do
{
//跳过透明色找到下一个非透明色的点.
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
iX++;
//记住这个起始点
int iLeftX = iX;
//寻找下个透明色的点
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
++iX;
//创建一个包含起点与重点间高为1像素的临时“region”
rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);
//合并到主"region".
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
//删除临时"region",否则下次创建时和出错
rgnTemp.DeleteObject();
}while(iX <bit.bmWidth );
iX = 0;
}
if(pOldMemBmp)
memDC.SelectObject(pOldMemBmp);
CWnd * pWnd = pDC->GetWindow();
pWnd->SetWindowRgn(wndRgn,TRUE);
pWnd->SetForegroundWindow();
}
相关文章推荐
- [C++再学习系列] 派生类函数的重实现规则(override-覆盖)
- C++ GUI Qt 编程(第二版)第8章 Diagram_2(实现主对话框)
- 【C++】MFC 创建对话框,实现对课程信息和学生信息的管理
- 晒晒C++:虚函数的真相(VC编译器如何实现“virtual ”规则)
- VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
- C++对话框系统托盘实现
- 不规则对话框的又一实现
- 如何实现虚函数的规则(VC中 C++ virtual 编译规则)
- 不规则对话框的又一实现
- 不规则对话框的又一实现
- C++实现UMG中自定义不规则形状按钮
- [C++再学习系列] 派生类函数的重实现规则(override-覆盖)
- [C++再学习系列] 派生类函数的重实现规则(override-覆盖)
- MFC/基于对话框的MFC上位机串口通信(C++实现)简单例程
- c++类型兼容规则与虚函数实现多态的实现原理和区别
- C++ GUI Qt 编程(第二版)第8章 Diagram_1(实现主对话框)
- C++ VC实现对话框窗口任意分割
- C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)
- VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
- 例程 【C++】MFC 创建对话框,实现对“学生课程成绩”的管理