📄 subject_20894.htm
字号:
<p>
序号:20894 发表者:李冰 发表日期:2002-11-11 22:55:47
<br>主题:怎么做一个中国地图形状的窗口?
<br>内容:怎么做一个中国地图形状的窗口?或者说怎么得到一个中国地图的区域(RGN、CRgn)
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:雷神 回复日期:2002-11-12 03:13:33
<br>内容:将Dib(设备无关位图)的轮廓转换为区域,那么我们可以设计出任意形状的窗体,所要做的工作就是用绘图或图形处理软件进行艺术创作,最后将“作品”保存为位图。需要一个DIBToRgn完成转换工作,函数的原理很简单,就是对位图逐行逐象素扫描,每一条象素线都是由颜色的线段和前景线段组成,我们可以把这些前景线段看成高度为1的象素的矩形区域,当整个位图扫描完成后,把所有这些小矩形区域合并在一起就构成了我们想要的形状。<BR>启动VC6创建一个基于MFC对话框工程,名称为Demo,删除对话框上所有的按钮和静态文本框。在对话框上单击鼠标右键,在弹出的 菜单上选择Properties项,弹出属性对话框,选择Styles选项卡,单击Border下拉列表框选择None,然后关闭属性对话框。插入一幅准备好的位图,修改其ID为IDB_BMP,为CDemoDlg类增加三个私有成员变量:HRGN m_hWndRgn(窗口区域句柄),HRGN m_hClientRgn(窗口客户区域句柄),HBITMAP hBmp(背景位图句柄)。打开ClassWizard为CDemoDlg添加WM_ERASEBKGND、WM_NCHITTEST、WM_CLOSE、WM_LBUTTONDBLCLK四个消息映射函数。打开Workspace选择ClassView为CDemoDlg类添加公有成员函数DIBToRgn。选择FileView展开文件列表,双击DemoDlg.cpp在编辑窗口中找到CDemoDlg的构造函数,在末尾添加如下语句:<BR> m_hBmp=(HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BMP),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);<BR> m_hClientRgn=CreateEllipticRgn(33,34,200,125);<BR> m_hWndRgn=DIBToRgn(m_hBmp,RGB(0,255,0),FALSE);\背景为绿色<BR> 在对话框的初始化函数OnInitialization里添加如下代码:<BR> // TODO: Add extra initialization here<BR> if(m_hWndRgn)<BR> SetWindowRgn(m_hWndRgn,TRUE);<BR> 找到OnEraseBkgnd函数添加如下代码为对话框增加位图背景:<BR> if(m_hBmp)<BR> {<BR> BITMAP bm;<BR> GetObject(m_hBmp,sizeof(bm),&bm);<BR> HDC hMemdc=CreateCompatibleDC(pDC->m_hDC); <BR> if(hMemdc)<BR> {<BR> HBITMAP hOldBmp=(HBITMAP)SelectObject(hMemdc,m_hBmp);<BR> if(hOldBmp)<BR> { BitBlt(pDC->m_hDC,0,0,bm.bmWidth,bm.bmHeight,hMemdc,0,0,SRCCOPY);<BR> SelectObject(hMemdc,hOldBmp);<BR> DeleteDC(hMemdc);<BR> DeleteObject(hOldBmp);<BR> return TRUE;<BR> }<BR> else<BR> DeleteDC(hMemdc);<BR> }<BR> }<BR> 找到OnClose函数添加如下代码以便于在程序退出时释放占有内存:<BR> if(m_hBmp)<BR> DeleteObject(m_hBmp);<BR> if(m_hClientRgn)<BR> DeleteObject(m_hClientRgn);<BR> if(m_hWndRgn)<BR> DeleteObject(m_hWndRgn);<BR> 找到OnLButtonDblClk函数添加如下代码:<BR> if(m_hClientRgn)<BR> {<BR> if(PtInRegion(m_hClientRgn,point.x,point.y))<BR> OnOK();<BR> }<BR> 选择当鼠标双击m_hClientRgn区域时程序将退出。<BR> 因为对话框没有标题区无法拖动它,所以我重载了OnNcHitTest函数添加代码:<BR> if(m_hClientRgn)<BR> {<BR> ScreenToClient(&point);<BR> if(!PtInRegion(m_hClientRgn,point.x,point.y))<BR> return HTCAPTION;<BR> ClientToScreen(&point);<BR> }<BR> 进过这步处理,我们可以在除了m_hClientRgn区域以外的任何区域拖动窗口。<BR> 本例中,m_hClientRgn作为客户区可以响应鼠标的双击事件,据此,我们可以构造一些按钮来响应鼠标事件。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -