19,469
社区成员
发帖
与我相关
我的任务
分享
void HorizontalDlg::OnTimer(UINT nIDEvent)
{
switch (nIDEvent)
{
case 1201:
{
Invalidate(FALSE);
}
break;
}
}
using namespace Gdiplus;
CPaintDC DC(this);
RECT Res;
GetClientRect(&Res);
int Width = Res.right - Res.left;
int Height = Res.bottom - Res.top;
CDC *pDC = GetDC();
//定义一个内存设备描述表对象(即后备缓冲区)
CDC MemDC;
//定义一个位图对象
CBitmap MemBitmap;
//建立与屏幕设备描述表(前端缓冲区)兼容的内存设备描述表句柄(后备缓冲区)
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有位图的设备描述表是不能绘图的
//下面建立一个与屏幕设备描述表(或者内存设备描述表)兼容的位图
MemBitmap.CreateCompatibleBitmap(pDC, Width, Height);
//将位图选入到内存设备描述表
//只有选入了位图的设备描述表才有地方绘图,画到指定的位图上
CBitmap *pOldBit = MemDC.SelectObject(&MemBitmap);
/************************************************************/
Graphics graphics(MemDC.m_hDC);
SolidBrush BackroundBrush(Color(stc_SetInfo.Transparent, 255, 255, 255));
graphics.FillRectangle(&BackroundBrush, 0, 0, Width, Height);
/************************************************************/
//将后备缓冲区中的图形拷贝到前端缓冲区
pDC->BitBlt(0, 0, Width, Height, &MemDC, 0, 0, SRCCOPY);
DWORD dwExStyle = GetWindowLong(m_hWnd, GWL_EXSTYLE);
if((dwExStyle &0x80000) != 0x80000)
{
SetWindowLong(m_hWnd, GWL_EXSTYLE, dwExStyle^0x80000);
}
//不能使用客户区坐标
this->GetWindowRect(&Res);
POINT ptWinPos = {Res.left, Res.top};
SIZE sizeWindow = {Res.right - Res.left, Res.bottom - Res.top};
POINT ptSrc={0, 0};
BLENDFUNCTION Blend = {0, 0, 255, 1};
UpdateLayeredWindow(pDC, &ptWinPos, &sizeWindow, &MemDC, &ptSrc, 0, &Blend, 2);
//绘图完成后的清理
if (TRUE != MemBitmap.DeleteObject())
{
Log("DeleteObject error.");
}
if (TRUE != MemDC.DeleteDC())
{
Log("DeleteDC error.");
}
if (0 != ReleaseDC(pDC))
{
Log("ReleaseDC error.");
}
//绘图完成后的清理
MemDC.SelectObject(pOldBit);
DeleteObject(MemBitmap);
MemDC.DeleteDC();
ReleaseDC(pDC);
#pragma once
#include "afxwin.h"
#include "HorizontalCtrl.h"
class HorizontalDlg : public CDialog
{
public:
HorizontalDlg(CWnd* pParent = NULL);
virtual ~HorizontalDlg();
enum {IDD = IDD_HORIZONTAL_DLG};
virtual BOOL DestroyWindow();
virtual int OpenWindow();
virtual int CloseWindow();
protected:
CButton Btn_OK;
CButton Btn_Cancel;
HorizontalCtrl *m_Ctrl;
char m_Log[1024];
virtual BOOL OnInitDialog();
virtual int LoadPNG(HINSTANCE hInstance, UINT nID, LPCTSTR sTR, Gdiplus::Bitmap **pImg);
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg LRESULT OnMessage(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnNcHitTest(CPoint point);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnMove(int x, int y);
afx_msg void OnPaint();
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
DECLARE_DYNAMIC(HorizontalDlg)
DECLARE_MESSAGE_MAP()
};
#pragma once
#include "stdafx.h"
#include "ShowCard.h"
#include "HorizontalDlg.h"
IMPLEMENT_DYNAMIC(HorizontalDlg, CDialog)
HorizontalDlg::HorizontalDlg(CWnd* pParent /*=NULL*/)
: CDialog(HorizontalDlg::IDD, pParent)
{
m_Ctrl = NULL;
}
HorizontalDlg::~HorizontalDlg()
{
}
BOOL HorizontalDlg::DestroyWindow()
{
if (NULL != m_Ctrl)
{
m_Ctrl->DestroyWindow();
delete m_Ctrl;
m_Ctrl = NULL;
}
return CDialog::DestroyWindow();
}
int HorizontalDlg::OpenWindow()
{
this->ShowWindow(SW_SHOW);
m_Ctrl->ShowWindow(SW_SHOW);
return 1;
}
int HorizontalDlg::CloseWindow()
{
this->ShowWindow(SW_HIDE);
m_Ctrl->ShowWindow(SW_HIDE);
return 1;
}
BEGIN_MESSAGE_MAP(HorizontalDlg, CDialog)
ON_MESSAGE(10086, OnMessage)
ON_WM_NCHITTEST()
ON_WM_TIMER()
ON_WM_MOVE()
ON_WM_PAINT()
ON_BN_CLICKED(IDOK, &HorizontalDlg::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &HorizontalDlg::OnBnClickedCancel)
END_MESSAGE_MAP()
BOOL HorizontalDlg::OnInitDialog()
{
CDialog::OnInitDialog();
Btn_OK.ShowWindow(SW_HIDE);
Btn_Cancel.ShowWindow(SW_HIDE);
m_Ctrl = new HorizontalCtrl;
m_Ctrl->Create(IDD_HORIZONTAL_CTRL, this);
HINSTANCE hInstance = AfxGetResourceHandle();
/*LoadPNG(hInstance, IDR_PNG_BACKROUND, _T("png"), &m_ImgBackround);*/
stc_HorizontalHandle = this->m_hWnd;
//结合当前屏幕分辨率,乘以存储的百分比,获得原本保存的坐标
this->MoveWindow(stc_SetInfo.Horizontal.x * GetSystemMetrics(SM_CXSCREEN), stc_SetInfo.Horizontal.y * GetSystemMetrics(SM_CYSCREEN), (float)HOR_DEFWIDTH * (float)stc_SetInfo.Coefficient, (float)HOR_DEFHEIGHT * (float)stc_SetInfo.Coefficient);
if (0 == stc_SetInfo.Using)
{
this->CenterWindow();
}
SetTimer(1201, 5 * 100, 0);
return TRUE;
}
int HorizontalDlg::LoadPNG(HINSTANCE hInstance, UINT nID, LPCTSTR sTR, Gdiplus::Bitmap **pImg)
{
HRSRC hRsrc = ::FindResource(hInstance, MAKEINTRESOURCE(nID), sTR);
if (!hRsrc)
{
return -1;
}
DWORD len = SizeofResource(hInstance, hRsrc);
BYTE *lpRsrc = (BYTE*)LoadResource(hInstance, hRsrc);
if (!lpRsrc)
{
return -1;
}
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE *pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem, lpRsrc, len);
IStream *pstm;
CreateStreamOnHGlobal(m_hMem, FALSE, &pstm);
*pImg = Gdiplus::Bitmap::FromStream(pstm);
GlobalUnlock(m_hMem);
pstm->Release();
FreeResource(lpRsrc);
return 1;
}
void HorizontalDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDOK, Btn_OK);
DDX_Control(pDX, IDCANCEL, Btn_Cancel);
}
LRESULT HorizontalDlg::OnMessage(WPARAM wParam, LPARAM lParam)
{
switch (wParam)
{
case 9778:
{
switch (lParam)
{
case 0:
{
OnBnClickedCancel();
}
break;
case 1:
{
CloseWindow();
}
break;
case 2:
{
OpenWindow();
}
}
}
break;
}
return 1;
}
LRESULT HorizontalDlg::OnNcHitTest(CPoint point)
{
LRESULT nHitTest = CDialog::OnNcHitTest(point);
return (nHitTest == HTCLIENT) ? HTCAPTION : nHitTest;
}
void HorizontalDlg::OnMove(int x, int y)
{
if (NULL != m_Ctrl)
{
//用户有可能在使用后调整分辨率,导致显示框飞到屏幕外面,因此使用坐标和当前屏幕分辨率像素的百分比
//进行存储,这样换算虽然麻烦点,但可以保证不管怎么调整分辨率都保持原样
CRect Ret;
GetWindowRect(&Ret);
m_Ctrl->MoveWindow(&Ret);
stc_SetInfo.Horizontal.x = (float)Ret.left / (float)GetSystemMetrics(SM_CXSCREEN);
stc_SetInfo.Horizontal.y = (float)Ret.top / (float)GetSystemMetrics(SM_CYSCREEN);
::PostMessage(stc_RouteHandle, 10086, 9900, 1);
if (1 == stc_SetInfo.Model)
{
::PostMessage(stc_SetHandle, 10086, 9900, 1);
}
}
}
void HorizontalDlg::OnTimer(UINT nIDEvent)
{
switch (nIDEvent)
{
case 1201:
{
Invalidate(FALSE);
}
break;
}
}
void HorizontalDlg::OnPaint()
{
using namespace Gdiplus;
CPaintDC DC(this);
RECT Res;
GetClientRect(&Res);
int Width = Res.right - Res.left;
int Height = Res.bottom - Res.top;
CDC *pDC = GetDC();
//定义一个内存设备描述表对象(即后备缓冲区)
CDC MemDC;
//定义一个位图对象
CBitmap MemBitmap;
//建立与屏幕设备描述表(前端缓冲区)兼容的内存设备描述表句柄(后备缓冲区)
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有位图的设备描述表是不能绘图的
//下面建立一个与屏幕设备描述表(或者内存设备描述表)兼容的位图
MemBitmap.CreateCompatibleBitmap(pDC, Width, Height);
//将位图选入到内存设备描述表
//只有选入了位图的设备描述表才有地方绘图,画到指定的位图上
CBitmap *pOldBit = MemDC.SelectObject(&MemBitmap);
/************************************************************/
Graphics graphics(MemDC.m_hDC);
SolidBrush BackroundBrush(Color(stc_SetInfo.Transparent, 150, 100, 100));
graphics.FillRectangle(&BackroundBrush, 0, 0, Width, Height);
/************************************************************/
//将后备缓冲区中的图形拷贝到前端缓冲区
pDC->BitBlt(0, 0, Width, Height, &MemDC, 0, 0, SRCCOPY);
DWORD dwExStyle = GetWindowLong(m_hWnd, GWL_EXSTYLE);
if((dwExStyle &0x80000) != 0x80000)
{
SetWindowLong(m_hWnd, GWL_EXSTYLE, dwExStyle^0x80000);
}
//不能使用客户区坐标
this->GetWindowRect(&Res);
POINT ptWinPos = {Res.left, Res.top};
SIZE sizeWindow = {Res.right - Res.left, Res.bottom - Res.top};
POINT ptSrc={0, 0};
BLENDFUNCTION Blend = {0, 0, 255, 1};
UpdateLayeredWindow(pDC, &ptWinPos, &sizeWindow, &MemDC, &ptSrc, 0, &Blend, 2);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
ReleaseDC(pDC);
}
void HorizontalDlg::OnBnClickedOk()
{
}
void HorizontalDlg::OnBnClickedCancel()
{
}
#pragma once
#include "afxwin.h"
#include "resource.h"
class HorizontalCtrl : public CDialog
{
public:
HorizontalCtrl(CWnd* pParent = NULL);
virtual ~HorizontalCtrl();
enum {IDD = IDD_HORIZONTAL_CTRL};
virtual BOOL DestroyWindow();
protected:
CButton Btn_OK;
CButton Btn_Cancel;
CBrush m_Brush;
char m_Log[1024];
bool m_Clicked;
virtual BOOL OnInitDialog();
virtual int LoadPNG(HINSTANCE hInstance, UINT nID, LPCTSTR sTR, Gdiplus::Bitmap **pImg);
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg LRESULT OnMessage(WPARAM wParam, LPARAM lParam);
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnPaint();
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
DECLARE_DYNAMIC(HorizontalCtrl)
DECLARE_MESSAGE_MAP()
};
#pragma once
#include "stdafx.h"
#include "ShowCard.h"
#include "HorizontalCtrl.h"
IMPLEMENT_DYNAMIC(HorizontalCtrl, CDialog)
HorizontalCtrl::HorizontalCtrl(CWnd* pParent /*=NULL*/)
: CDialog(HorizontalCtrl::IDD, pParent)
{
}
HorizontalCtrl::~HorizontalCtrl()
{
}
BOOL HorizontalCtrl::DestroyWindow()
{
return CDialog::DestroyWindow();
}
BEGIN_MESSAGE_MAP(HorizontalCtrl, CDialog)
ON_MESSAGE(10086, OnMessage)
ON_WM_CTLCOLOR()
ON_WM_TIMER()
ON_WM_PAINT()
ON_BN_CLICKED(IDOK, &HorizontalCtrl::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &HorizontalCtrl::OnBnClickedCancel)
END_MESSAGE_MAP()
BOOL HorizontalCtrl::OnInitDialog()
{
CDialog::OnInitDialog();
Btn_OK.ShowWindow(SW_HIDE);
Btn_Cancel.ShowWindow(SW_HIDE);
m_Brush.CreateSolidBrush(RGB(255, 0, 255));
DWORD dwExStyle = GetWindowLong(m_hWnd,GWL_EXSTYLE);
::SetWindowLong(m_hWnd, GWL_EXSTYLE, dwExStyle|0x80000);
::SetLayeredWindowAttributes(this->GetSafeHwnd(), 0xff00ff, 0, 1);
HINSTANCE hInstance = AfxGetResourceHandle();
/*LoadPNG(hInstance, IDR_PNG_BACKROUND, _T("png"), &m_ImgBackround);*/
return TRUE;
}
int HorizontalCtrl::LoadPNG(HINSTANCE hInstance, UINT nID, LPCTSTR sTR, Gdiplus::Bitmap **pImg)
{
HRSRC hRsrc = ::FindResource(hInstance, MAKEINTRESOURCE(nID), sTR);
if (!hRsrc)
{
return -1;
}
DWORD len = SizeofResource(hInstance, hRsrc);
BYTE *lpRsrc = (BYTE*)LoadResource(hInstance, hRsrc);
if (!lpRsrc)
{
return -1;
}
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE *pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem, lpRsrc, len);
IStream *pstm;
CreateStreamOnHGlobal(m_hMem, FALSE, &pstm);
*pImg = Gdiplus::Bitmap::FromStream(pstm);
GlobalUnlock(m_hMem);
pstm->Release();
FreeResource(lpRsrc);
return 1;
}
void HorizontalCtrl::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDOK, Btn_OK);
DDX_Control(pDX, IDCANCEL, Btn_Cancel);
}
LRESULT HorizontalCtrl::OnMessage(WPARAM wParam, LPARAM lParam)
{
return 1;
}
HBRUSH HorizontalCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor=CTLCOLOR_DLG)
{
return m_Brush;
}
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
void HorizontalCtrl::OnTimer(UINT nIDEvent)
{
}
void HorizontalCtrl::OnPaint()
{
CDialog::OnPaint();
}
void HorizontalCtrl::OnBnClickedOk()
{
}
void HorizontalCtrl::OnBnClickedCancel()
{
}
SolidBrush BackroundBrush(Color(stc_SetInfo.Transparent, 255, 255, 255));
graphics.FillRectangle(&BackroundBrush, 0, 0, Width, Height);
/************************************************************/
DrawBackround(&MemDC);
/************************************************************/
int HorizontalDlg::DrawBackround(CDC *memDC)
{
using namespace Gdiplus;
Graphics graphics(memDC->m_hDC);
SolidBrush BackroundBrush(Color(stc_SetInfo.Transparent, 150, 100, 100));
graphics.FillRectangle(&BackroundBrush, 0, 0, (int)((float)HOR_DEFWIDTH * stc_SetInfo.Coefficient), (int)((float)HOR_DEFHEIGHT * stc_SetInfo.Coefficient));
return 1;
}
//绘图完成后的清理
pOldBit = MemDC.SelectObject(&MemBitmap);
DeleteObject(MemBitmap);
MemDC.DeleteDC();
ReleaseDC(pDC);