www.gusucode.com > 智能ABC窗口的实现C#源码程序 > 智能ABC窗口的实现/topwnd/TopWnd/MainWnd.cpp
// MainWnd.cpp : 实现文件 // #include "stdafx.h" #include "TopWnd.h" #include "MainWnd.h" #include ".\mainwnd.h" // CMainWnd IMPLEMENT_DYNAMIC(CMainWnd, CWnd) #define FRAMEWIDTH 4 CMainWnd::CMainWnd() { for(int i=0;i<5;i++)m_bBTState[i]=true; } CMainWnd::~CMainWnd() { } BEGIN_MESSAGE_MAP(CMainWnd, CWnd) ON_WM_CREATE() ON_WM_PAINT() ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() ON_COMMAND(ID_QUIT, OnQuitTopWnd) END_MESSAGE_MAP() // CMainWnd 消息处理程序 bool CMainWnd::CreateMainWnd(void) { if(!CreateEx(0, ::AfxRegisterWndClass(0,::LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW)),GetSysColorBrush(COLOR_ACTIVEBORDER)), NULL, WS_POPUP, 0,0,300,50, NULL, NULL)) return false; return true; } int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 //加载光标资源 m_hCrossCursor=AfxGetApp()->LoadCursor(IDC_CROSSCUR); ASSERT(m_hCrossCursor); //加载位图资源 m_BT1_1.LoadBitmap(IDB_BITMAP1_1); m_BT2_1.LoadBitmap(IDB_BITMAP2_1); m_BT3_1.LoadBitmap(IDB_BITMAP3_1); m_BT4_1.LoadBitmap(IDB_BITMAP4_1); m_BT5_1.LoadBitmap(IDB_BITMAP5_1); m_BT1_2.LoadBitmap(IDB_BITMAP1_2); m_BT2_2.LoadBitmap(IDB_BITMAP2_2); m_BT3_2.LoadBitmap(IDB_BITMAP3_2); m_BT4_2.LoadBitmap(IDB_BITMAP4_2); m_BT5_2.LoadBitmap(IDB_BITMAP5_2); //设置每个位图矩形:五个位图紧挨着排列在客户区中间,四周为宽度为FRAMEWIDTH的边框 m_rcBT1.left=FRAMEWIDTH+0; m_rcBT1.right=m_rcBT1.left+20; m_rcBT1.top=FRAMEWIDTH+0;m_rcBT1.bottom=m_rcBT1.top+20; m_rcBT2.left=m_rcBT1.right; m_rcBT2.right=m_rcBT2.left+40; m_rcBT2.top=FRAMEWIDTH+0;m_rcBT2.bottom=m_rcBT2.top+20; m_rcBT3.left=m_rcBT2.right; m_rcBT3.right=m_rcBT3.left+20; m_rcBT3.top=FRAMEWIDTH+0;m_rcBT3.bottom=m_rcBT3.top+20; m_rcBT4.left=m_rcBT3.right; m_rcBT4.right=m_rcBT4.left+20; m_rcBT4.top=FRAMEWIDTH+0;m_rcBT4.bottom=m_rcBT4.top+20; m_rcBT5.left=m_rcBT4.right; m_rcBT5.right=m_rcBT5.left+20; m_rcBT5.top=FRAMEWIDTH+0;m_rcBT5.bottom=m_rcBT5.top+20; //根据客户区尺寸计算并设置窗口尺寸 CRect rcClient(0,0,120+2*FRAMEWIDTH-1,20+2*FRAMEWIDTH-1); SetWindowPos(&wndTopMost,0,0,rcClient.Width(),rcClient.Height(),SWP_NOMOVE|SWP_NOACTIVATE); CenterWindow(NULL); //加载加速键资源 m_hAcc=::LoadAccelerators(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR)); return 0; } void CMainWnd::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CWnd::OnPaint() CBitmap* pOldBmp; CDC CompatibleDC; CompatibleDC.CreateCompatibleDC(&dc); //绘制第一个按钮 if(m_bBTState[0]) pOldBmp=CompatibleDC.SelectObject(&m_BT1_1); else pOldBmp=CompatibleDC.SelectObject(&m_BT1_2); dc.BitBlt(m_rcBT1.left,m_rcBT1.top,m_rcBT1.Width(),m_rcBT1.Height(),&CompatibleDC,0,0,SRCCOPY); //绘制第二个按钮 if(m_bBTState[1]) CompatibleDC.SelectObject(&m_BT2_1); else CompatibleDC.SelectObject(&m_BT2_2); dc.BitBlt(m_rcBT2.left,m_rcBT2.top,m_rcBT2.Width(),m_rcBT2.Height(),&CompatibleDC,0,0,SRCCOPY); //绘制第三个按钮 if(m_bBTState[2]) CompatibleDC.SelectObject(&m_BT3_1); else CompatibleDC.SelectObject(&m_BT3_2); dc.BitBlt(m_rcBT3.left,m_rcBT3.top,m_rcBT3.Width(),m_rcBT3.Height(),&CompatibleDC,0,0,SRCCOPY); //绘制第四个按钮 if(m_bBTState[3]) CompatibleDC.SelectObject(&m_BT4_1); else CompatibleDC.SelectObject(&m_BT4_2); dc.BitBlt(m_rcBT4.left,m_rcBT4.top,m_rcBT4.Width(),m_rcBT4.Height(),&CompatibleDC,0,0,SRCCOPY); //绘制第五个按钮 if(m_bBTState[4]) CompatibleDC.SelectObject(&m_BT5_1); else CompatibleDC.SelectObject(&m_BT5_2); dc.BitBlt(m_rcBT5.left,m_rcBT5.top,m_rcBT5.Width(),m_rcBT5.Height(),&CompatibleDC,0,0,SRCCOPY); //绘制边框 CRect rcClient; GetClientRect(&rcClient); dc.Draw3dRect(&rcClient,RGB(192,192,192),RGB(0,0,0)); rcClient.DeflateRect(1,1,1,1); dc.Draw3dRect(&rcClient,RGB(255,255,255),RGB(144,144,144)); CompatibleDC.SelectObject(pOldBmp); } void CMainWnd::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 bool bInRegionNow=IsInRegion(point); TRACE("Mouse move:(%d,%d) InRegion=%d\n",point.x,point.y,bInRegionNow); if(bInRegionNow) { SetCursor(m_hCrossCursor); if(nFlags&MK_LBUTTON) { POINT pt; pt.x=point.x;pt.y=point.y; ClientToScreen(&pt); SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,(LPARAM)(pt.x|(pt.y>>16))); } } CWnd::OnMouseMove(nFlags, point); } bool CMainWnd::IsInRegion(CPoint pt) { //获取窗口坐标和客户区屏幕坐标 CRect rcClient,rcButtons; GetClientRect(&rcClient); rcButtons.SetRect(m_rcBT1.left,m_rcBT1.top,m_rcBT5.right,m_rcBT5.bottom); //当在客户区之外,窗口之内时返回true if((!rcButtons.PtInRect(pt))&&rcClient.PtInRect(pt)) return true; return false; } void CMainWnd::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if(m_rcBT1.PtInRect(point)) {m_bBTState[0]=!m_bBTState[0];InvalidateRect(&m_rcBT1);} else if(m_rcBT2.PtInRect(point)) {m_bBTState[1]=!m_bBTState[1];InvalidateRect(&m_rcBT2);} else if(m_rcBT3.PtInRect(point)) {m_bBTState[2]=!m_bBTState[2];InvalidateRect(&m_rcBT3);} else if(m_rcBT4.PtInRect(point)) {m_bBTState[3]=!m_bBTState[3];InvalidateRect(&m_rcBT4);} else if(m_rcBT5.PtInRect(point)) {m_bBTState[4]=!m_bBTState[4];InvalidateRect(&m_rcBT5);} if(IsInRegion(point))SetCursor(m_hCrossCursor); CWnd::OnLButtonDown(nFlags, point); } BOOL CMainWnd::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 TRACE("PreTranslateMessage: %d\n",TranslateAccelerator(m_hWnd,m_hAcc,pMsg)); return CWnd::PreTranslateMessage(pMsg); } void CMainWnd::OnQuitTopWnd() { // TODO: 在此添加命令处理程序代码 TRACE("Quit\n"); PostQuitMessage(0); }