11.6.1 信息提示框的设计与实现(2)
HideCaret()函数将屏幕上的插入标记清除。实际上是隐藏插入标记,并不是删除其当前形状或使插入点无效。它的原型如下:
- B00L HideCaret(
- HWND hWnd
- );
函数有一个参数hWnd,标识有插入标记的窗口。如果该参数为NULL,那么HideCaret()函数搜索当前任务,以发现拥有插入标记的窗口。
第13行的OnEraseBkgnd()函数实现了绘制消息框背景图片的功能。实现如下:
- 01 BOOL CMyEdit::OnEraseBkgnd(CDC* pDC)
- 02 {
- 03 this->SetSel(0,0); //取消文字复选
- 04 CBitmap bitmap;
- 05 bitmap.LoadBitmap(IDB_BITMAP1); //设置位图背景
- 06 BITMAP bmp;
- 07 bitmap.GetBitmap(&bmp); //获取位图信息
- 08 CDC dcCompatible;
- 09 dcCompatible.CreateCompatibleDC(pDC); //创建内存设备的兼容性
- 10 dcCompatible.SelectObject(&bitmap); //将背景位图载入内存设备
- 11 CRect rect;
- 12 GetClientRect(&rect); //获取信息框的大小
- 13 //绘制背景位图
- 14 pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible, 0,0,
- SRCCOPY);
- 15 return TRUE;
- 16 }
【代码解析】
这个函数的实现比较简单,首先载入背景位图IDB_BITMAP1,并获取位图信息。然后创建一个与当前设备兼容的内存设备,并将背景位图载入内存设备。最后将内存设备上的信息复制到当前设备上,利用双缓冲实现绘制信息框位图的功能。
第14行的CtlColor()函数实现设置透明背景色的功能。实现如下:
- 01 HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
- 02 {
- 03 pDC->SetBkMode(TRANSPARENT); //设置文字背景透明
- 04 return NULL;
- 05 }
SetBkMode()函数设置背景色模式,MFC中定义的函数原型如下:- int SetBkMode(
- int nBkMode
- );
函数有一个参数nBkMode,它是要设置的模式,其值可以为OPAQUE和TRANSPARENT。如果在输出字符串时发现存在背景色,这样的输出是破坏背景的。那么需要使用什么方法来保持背景不变,而又能输出特定颜色的字符串呢?比如按钮的文字颜色是黑色的而背景是灰色的,这就需要使用SetBkMode()函数来设置DrawText()函数的输出方式,显示设备共有两种输出方式,分别是OPAQUE和TRANSPARENT。OPAQUE方式是用当前背景画刷的颜色输出显示文字的背景,而TRANSPARENT是使用透明的输出,也就是文字的背景就是其绘制对象的背景。
(3)为截屏窗体添加一个编辑框,并利用向导为该编辑框添加一个CMyEdit类型的关联变量m_eTip,如图11.26所示。
(4)在截屏类中添加一个函数SetTip(),它将根据实际信息设置信息框上的显示信息,实现如下:
|
| 图11.26 为编辑框添加自定义类型的关联变量 |
- 01 void CCatchDlg::SetTip()
- 02 {
- 03 CPoint pt;
- 04 GetCursorPos(&pt);
- 05 CClientDC dc(this);
- 06 //得到当前R、G、B各像素值
- 07 COLORREF color;
- 08 color=dc.GetPixel(pt);
- 09 BYTE rValue,gValue,bValue;
- 10 rValue=GetRValue(color);
- 11 gValue=GetGValue(color);
- 12 bValue=GetGValue(color);
- 13 //按格式排放字符串
- 14 CString string;
- 15 CString strTemp;
- 16 string.Format("\r\n\r\n\r\n •当前像素RGB (%d,%d,%d)\r\n",rValue,
- gValue,bValue);
- 17 if(!m_bDraw&&!m_bFirstDraw)
- 18 {
- 19 strTemp="\r\n •按下鼠标左键不放选择截取\r\n 范围\r\n\r\n
- 20 •按下Esc键或鼠标右键双击退出";
- 21 }
- 22 else
- 23 if(m_bDraw&&m_bFirstDraw)
- 24 {
- 25 strTemp="\r\n •松开鼠标左键确定截取范围\r\n\r\n •按下Esc键退出";
- 26 }
- 27 else
- 28 if(m_bFirstDraw)
- 29 {
- 30 strTemp="\r\n •用鼠标左键调整截取范围的\r\n 大小和位置\r\n\r\n
- 31 •截取范围内双击鼠标左键保存\r\n 图像,结束操作\r\n\r\n
- 32 •单击鼠标右键重新选择";
- 33 }
- 34 string+=strTemp;
- 35 m_eTip.SetWindowText(string); //显示到编缉框中,操作提示窗口
- 36 }