案例8:对话框
修改代码如下:
添加变量:
#define MAX_BUBBLE 250
class CMyDlg : public CDialog
{
// Construction
public:
CRect m_rectBubble[MAX_BUBBLE]; //存放泡泡的几何参数
COLORREF m_colorBubble[MAX_BUBBLE]; //存放泡泡的颜色
int m_nBubbleCount; //存放泡泡的个数
CRect m_rectClient; //存放自定义客户矩形
COLORREF m_colorCurrent; //存放当前泡泡的颜色设置
初始化:
BOOL CDlgColorDlg::OnInitDialog()
{
...
// TODO: Add extra initialization here
CStatic *pST=(CStatic*)GetDlgItem(IDC_CLIENT);
pST->GetWindowRect(&m_rectClient);
ScreenToClient(&m_rectClient);
m_nBubbleCount=0;
...
}
OnColor函数:(按键生成的函数)
void CDlgColorDlg::OnColor()
{
// TODO: Add your control notification handler code here
m_colorCurrent=RGB(200,200,200);//灰颜色
CColorDialog dlg(m_colorCurrent);
if(dlg.DoModal()==IDOK)
m_colorCurrent=dlg.GetColor();
}
OnPaint函数:
void CDlgColorDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CRgn rgn;
rgn.CreateRectRgnIndirect(&m_rectClient);//生成一个区域对象
dc.SelectClipRgn(&rgn); //选择区域
dc.Rectangle(m_rectClient); //将客户区背景设置
CBrush brushNew,*pbrushOld; //白色
for(int i=0;i<m_nBubbleCount;i++)
{ brushNew.CreateSolidBrush(m_colorBubble[i]);
pbrushOld=dc.SelectObject(&brushNew);
dc.Ellipse(m_rectBubble[i]);
dc.SelectObject(pbrushOld);
brushNew.DeleteObject();
}
CDialog::OnPaint();
}
}
知识点:
1.CStatic:CStatic类提供了一个Windows静态控件的性能。一个静态控件用来显示一个文本字符串,框,矩形,图标,光标,位图,或增强的图元文件。它可以被用来作为标签,框,或用来分隔其它的控件。一个静态控件不接收输入,也不提供输出;但是,如果它是用SS_NOTIFY风格创建的,则它可以通知其父有关设备点击的消息;
2.GetDlgItem:返回窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作;
3.GetWindowRect:Windows API函数。该函数返回指定窗口的边框矩形的尺寸;
4.ScreenToClient:顾名思义:ScreenToClient也就是Screen(屏幕坐标) 到 Client(客户区坐标)的转换。也就是说这个函数可以把你在屏幕上鼠标的位置转换为你打开的程序的客户区的坐标(位置);
5.IsIconic():该函数确定给定窗口是否是最小化(图标化)的窗口;
6.CPaintDC dc(this):构造一个当前对象的CPaintDC类对象;
7.CRgn:CRgn类封装了一个Windows图形设备接口(GDI)区域。这一区域是某一窗口中的一个椭圆或多边形区域。要使用这个区域,你可以使用类CRgn的成员函数以及被定义为类CDC的成员函数的剪贴函数;
8.CreateRectRgnIndirect():创建一个矩形对象并存储在CRgn对象中,返回值为Long,执行成功则为区域句柄,失败则为0;
9.SelectClipRgn():该函数选择一个区域作为指定设备环境的当前剪切区域;
10.DeleteObject():函数原型:BOOL DeleteObject(HGDIOBJ hObject);参数:hObject:逻辑笔、画笔、字体、位图、区域或者调色板的句柄。返回值:成功,返回非零值;如果指定的句柄无效或者它已被选入设备上下文环境,则返回值为零。