⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_20894.htm

📁 一些关于vc的问答
💻 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>&nbsp;&nbsp;&nbsp;&nbsp; m_hBmp=(HBITMAP)LoadImage(AfxGetApp()-&gt;m_hInstance,MAKEINTRESOURCE(IDB_BMP),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);<BR>&nbsp;&nbsp;&nbsp;&nbsp; m_hClientRgn=CreateEllipticRgn(33,34,200,125);<BR>&nbsp;&nbsp;&nbsp;&nbsp; m_hWndRgn=DIBToRgn(m_hBmp,RGB(0,255,0),FALSE);\背景为绿色<BR>&nbsp;&nbsp;&nbsp;&nbsp; 在对话框的初始化函数OnInitialization里添加如下代码:<BR>&nbsp;&nbsp;&nbsp;&nbsp; // TODO: Add extra initialization here<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(m_hWndRgn)<BR>&nbsp;&nbsp;&nbsp;&nbsp; SetWindowRgn(m_hWndRgn,TRUE);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 找到OnEraseBkgnd函数添加如下代码为对话框增加位图背景:<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(m_hBmp)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BITMAP bm;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetObject(m_hBmp,sizeof(bm),&bm);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDC hMemdc=CreateCompatibleDC(pDC-&gt;m_hDC); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(hMemdc)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HBITMAP hOldBmp=(HBITMAP)SelectObject(hMemdc,m_hBmp);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(hOldBmp)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(pDC-&gt;m_hDC,0,0,bm.bmWidth,bm.bmHeight,hMemdc,0,0,SRCCOPY);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(hMemdc,hOldBmp);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(hMemdc);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(hOldBmp);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(hMemdc);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; 找到OnClose函数添加如下代码以便于在程序退出时释放占有内存:<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(m_hBmp)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DeleteObject(m_hBmp);<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(m_hClientRgn)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DeleteObject(m_hClientRgn);<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(m_hWndRgn)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DeleteObject(m_hWndRgn);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 找到OnLButtonDblClk函数添加如下代码:<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(m_hClientRgn)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(PtInRegion(m_hClientRgn,point.x,point.y))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnOK();<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; 选择当鼠标双击m_hClientRgn区域时程序将退出。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 因为对话框没有标题区无法拖动它,所以我重载了OnNcHitTest函数添加代码:<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(m_hClientRgn)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; ScreenToClient(&point);<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(!PtInRegion(m_hClientRgn,point.x,point.y))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return HTCAPTION;<BR>&nbsp;&nbsp;&nbsp;&nbsp; ClientToScreen(&point);<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; 进过这步处理,我们可以在除了m_hClientRgn区域以外的任何区域拖动窗口。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 本例中,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 + -