用Visual C++设计“精灵”窗体
2009-10-06 20:28:26 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劎绮妵鍕箳鐎n亞浠鹃梺闈涙搐鐎氫即鐛崶顒夋晬婵絾瀵ч幑鍥蓟閻斿摜鐟归柛顭戝枛椤牆顪冮妶搴′簼缂侇喗鎸搁悾鐑藉础閻愬秵妫冮崺鈧い鎺戝瀹撲礁鈹戦悩鎻掝伀缁惧彞绮欓弻娑氫沪閹规劕顥濋梺閫炲苯澧伴柟铏崌閿濈偛鈹戠€n€晠鏌嶆潪鎷屽厡闁汇倕鎳愮槐鎾存媴閸撴彃鍓卞銈嗗灦閻熲晛鐣烽妷褉鍋撻敐搴℃灍闁绘挻娲橀妵鍕箛闂堟稐绨肩紓浣藉煐濮樸劎妲愰幘璇茬闁冲搫鍊婚ˇ鏉库攽椤旂》宸ユい顓炲槻閻g兘骞掗幋鏃€鐎婚梺瑙勬儗閸樺€熲叺婵犵數濮烽弫鍛婃叏椤撱垹纾婚柟鍓х帛閳锋垶銇勯幒鍡椾壕缂備礁顦遍弫濠氱嵁閸℃稒鍊烽柛婵嗗椤旀劕鈹戦悜鍥╃У闁告挻鐟︽穱濠囨嚃閳哄啰锛滈梺褰掑亰閸欏骸鈻撳⿰鍫熺厸閻忕偟纭堕崑鎾诲箛娴e憡鍊梺纭呭亹鐞涖儵鍩€椤掑啫鐨洪柡浣圭墪閳规垿鎮欓弶鎴犱桓闂佸湱枪閹芥粎鍒掗弮鍫熷仺缂佸顕抽敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掍胶绠剧€光偓婵犱線鍋楀┑顔硷龚濞咃絿妲愰幒鎳崇喓鎷犻懠鑸垫毐闂傚倷鑳舵灙婵炲鍏樺顐ゆ嫚瀹割喖娈ㄦ繝鐢靛У绾板秹寮查幓鎺濈唵閻犺櫣灏ㄥ銉р偓瑙勬尭濡繂顫忛搹鍦<婵☆垰鎼~宥囩磽娴i鍔嶉柟绋垮暱閻g兘骞嬮敃鈧粻濠氭偣閸パ冪骇鐎规挸绉撮—鍐Χ閸℃ê闉嶇紓浣割儐閸ㄥ墎绮嬪澶嬪€锋い鎺嶇瀵灝鈹戦埥鍡楃仯闁告鍕洸濡わ絽鍟崐鍨叏濡厧浜鹃悗姘炬嫹

二、编程步骤
1、 启动Visual C++6.0,生成一个Win32应用程序,将该程序命名为"transparent";
2、 使用Class Wizard在应用程序中添加CMyWnd类,其基类选择CWnd;
3、 向应用程序的项目中添加背景位图和掩模位图,其ID分别设置为IDB_SHOW、IDB_MASK;
4、 添加代码,编译运行程序。
三、程序代码
//////////////////////////////////////////////////////////////// MyWnd.h : header file
#if !defined(AFX_MYWND_H__A761190E_CDF2_4A56_8848_AEE5AC7AD160__INCLUDED_)
#define AFX_MYWND_H__A761190E_CDF2_4A56_8848_AEE5AC7AD160__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// CMyWnd window
class CMyWnd : public CWnd
{
// Construction
public:
CMyWnd();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyWnd)
//}}AFX_VIRTUAL
// Implementation
public:
void Initialize(LPCTSTR lpszName,CRect &rectWnd,UINT nMaskId,UINT nShowId);
void Display(CDC *pDC,UINT nMaskId);
virtual ~CMyWnd();
// Generated message map functions
protected:
//{{AFX_MSG(CMyWnd)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg UINT OnNcHitTest(CPoint point);
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
UINT m_nBitmapId;
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MYWND_H__A761190E_CDF2_4A56_8848_AEE5AC7AD160__INCLUDED_)
////////////////////////////////////////////////////////// MyWnd.cpp : implementation file
#include "stdafx.h"
#include "transparent.h"
#include "MyWnd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CMyWnd
CMyWnd::CMyWnd()
{}
CMyWnd::~CMyWnd()
{}
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
//{{AFX_MSG_MAP(CMyWnd)
ON_WM_ERASEBKGND()
ON_WM_NCHITTEST()
ON_WM_CHAR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CMyWnd::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rectWnd;
this->GetWindowRect(&rectWnd);
CDC memDC;
CBitmap myBitmap,*pOldBitmap;
myBitmap.LoadBitmap(m_nBitmapId);
memDC.CreateCompatibleDC(pDC);
pOldBitmap = memDC.SelectObject(&myBitmap);
pDC->BitBlt(0,0,rectWnd.Width(),rectWnd.Height(), &memDC,0,0,SRCCOPY);
// 将设备还原
memDC.SelectObject(pOldBitmap );
return TRUE;
}
UINT CMyWnd::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default
UINT nHitTest = CWnd :: OnNcHitTest(point) ;
return (nHitTest == HTCLIENT) ? HTCAPTION : nHitTest ;
}
void CMyWnd::Display(CDC *pDC, UINT nMaskId)
{
// 获得窗体矩形
CRect rectWnd;
this->GetWindowRect(rectWnd);
// 读取位图资源
CBitmap myBitmap,*pOldBitmap;
myBitmap.LoadBitmap(nMaskId);
// 创建"内存一致"设备
CDC memDC;
memDC.CreateCompatibleDC(pDC);
//选择绘图设备
pOldBitmap = memDC.SelectObject(&myBitmap);
// 创建窗体的初始区域
CRgn rgnWnd,rgnTemp;
rgnWnd.CreateRectRgn(0,0,rectWnd.Width(),rectWnd.Height());
int nWidth,nHeight;
COLORREF color;
for (nWidth = 0;nWidth <= rectWnd.Width()-1;nWidth++)
{
for (nHeight = 0;nHeight <= rectWnd.Height();nHeight++)
{
color = memDC.GetPixel(nWidth,nHeight);
// 当象素是白色时,去掉该点
if (color == RGB(255,255,255))
{
rgnTemp.CreateRectRgn(nWidth,nHeight,nWidth+1,nHeight+1);
rgnWnd.CombineRgn(&rgnWnd,&rgnTemp,RGN_XOR);
rgnTemp.DeleteObject();
}
}
}
memDC.SelectObject(pOldBitmap);
SetWindowRgn((HRGN)rgnWnd,TRUE);
}
void CMyWnd::Initialize(LPCTSTR lpszName, CRect &rectWnd, UINT nMaskId, UINT nShowId)
{
this->CreateEx(0,AfxRegisterWndClass(0),lpszName,WS_POPUP
| WS_SYSMENU,rectWnd,NULL,NULL,NULL);
this->Display(GetWindowDC(),nMaskId);
m_nBitmapId = nShowId;
}
void CMyWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(nChar==VK_ESCAPE)
{
PostMessage(WM_QUIT);
}
CWnd::OnChar(nChar, nRepCnt, nFlags);
}
////////////////////////////////////////////////////////////
BOOL CTransparentApp::InitInstance()
{
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
m_pMainWnd = &m_wndMain;// m_wndMain是CmyWnd类成员变量;
CRect rectWnd(500, 300, 580, 380);
m_wndMain.Initialize(_T("loveghost"),rectWnd,IDB_MASK,IDB_SHOW);
m_wndMain.ShowWindow(SW_SHOW); // 窗体创建完毕,显示之;
return TRUE; // 返回非零值表示要继续处理消息
}
四、小结
这种异形窗口的创建方法适应于所有的基于CWnd类的派生窗口,采用这一方法,可以创建出任何形状的"异形"窗体。
- ››Visual Basic 2008 数学函数
- ››Visual Studio2005中Smart Device的问题
- ››Visual Studio 中根据数据库字段动态生成控件
- ››Visual Studio 11全新黑色主题
- ››设计模式:工厂方法模式
- ››Visual Studio 2011 Beta新特性(一):安装VS201...
- ››设计师的思维模式:敏捷体验设计师的思维模式
- ››设计原则为什么是这样?为什么这个是原则?
- ››设计过程中的点滴思考
- ››设计心得:让产品往更好的体验方向生产或改进
- ››设计师考虑如何解决令人头疼的形容词:大气
- ››设计师职业:设计师如何正视自己的工资
更多精彩
赞助商链接