多线程下得invalidaterect和屏幕坐标问题??

CyberLogix CyberLogix 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
多线程下得invalidaterect和屏幕坐标问题??

// MultiThreadDemoDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MultiThreadDemo.h"
#include "MultiThreadDemoDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

typedef struct _tagTHREADINFO
{
HWND hWnd;
long speed;
long xPos;
long yPos;
long ballRadius;
CRect rect;
}_tagTHREADINFO, *PTHREADINFO;

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMultiThreadDemoDlg dialog

CMultiThreadDemoDlg::CMultiThreadDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMultiThreadDemoDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMultiThreadDemoDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_IsBlue = m_IsGreen = m_IsRed = FALSE;
}

void CMultiThreadDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMultiThreadDemoDlg)
DDX_Control(pDX, IDC_MOVEBOX, m_MoveBox);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMultiThreadDemoDlg, CDialog)
//{{AFX_MSG_MAP(CMultiThreadDemoDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)
ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonEnd)
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMultiThreadDemoDlg message handlers

BOOL CMultiThreadDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control
}

DWORD WINAPI BallMove(LPVOID lpParam)
{
PTHREADINFO pThreadInfo = (PTHREADINFO)lpParam;
BOOL xAdd, yAdd;
xAdd = yAdd =TRUE;
while(TRUE)
{
if((pThreadInfo->xPos+pThreadInfo->ballRadius)>=((LPRECT)pThreadInfo->rect)->right)
xAdd = FALSE;
else if((pThreadInfo->xPos-pThreadInfo->ballRadius)<=((LPRECT)pThreadInfo->rect)->left)
xAdd = TRUE;
if((pThreadInfo->yPos + pThreadInfo->ballRadius)>=((LPRECT)pThreadInfo->rect)->bottom)
yAdd = FALSE;
else if((pThreadInfo->yPos - pThreadInfo->ballRadius)<=((LPRECT)pThreadInfo->rect)->top)
yAdd = TRUE;
if(xAdd)
pThreadInfo->xPos++;
else
pThreadInfo->xPos--;
if(yAdd)
pThreadInfo->yPos++;
else
pThreadInfo->yPos--;
//CPoint point(MAKEWORD(pThreadInfo->xPos,pThreadInfo->yPos));
//ClientToScreen(pThreadInfo->hWnd, &point);
CRect rect(pThreadInfo->xPos-pThreadInfo->ballRadius-2,pThreadInfo->yPos-pThreadInfo->ballRadius-2,pThreadInfo->xPos+pThreadInfo->ballRadius+2,pThreadInfo->yPos+pThreadInfo->ballRadius+2);
//CMultiThreadDemoDlg* pMainWnd = (CMultiThreadDemoDlg*)AfxGetMainWnd();
//ScreenToClient(pThreadInfo->hWnd,rect);
//pMainWnd->ScreenToClient(rect);
InvalidateRect(pThreadInfo->hWnd,rect,TRUE);
Sleep(pThreadInfo->speed);
}
return 0;
}

void CMultiThreadDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CMultiThreadDemoDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}

if(m_IsGreen)
{
CDC* pDC = m_MoveBox.GetDC();
CBrush brush(RGB(0,255,0));
CBrush* pOldBrush = pDC->SelectObject(&brush);
pDC->Ellipse(m_GreenBall.xPos-((LPRECT)m_GreenBall.rect)->left-m_GreenBall.ballRadius,
m_GreenBall.yPos-((LPRECT)m_GreenBall.rect)->top-m_GreenBall.ballRadius,
m_GreenBall.xPos-((LPRECT)m_GreenBall.rect)->left+m_GreenBall.ballRadius,
m_GreenBall.yPos-((LPRECT)m_GreenBall.rect)->top+m_GreenBall.ballRadius);
pDC->SelectObject(pOldBrush);
}
if(m_IsBlue)
{
CDC* pDC = m_MoveBox.GetDC();
CBrush brush(RGB(0,0,255));
CBrush* pOldBrush = pDC->SelectObject(&brush);
pDC->Ellipse(m_BlueBall.xPos-((LPRECT)m_BlueBall.rect)->left-m_BlueBall.ballRadius,
m_BlueBall.yPos-((LPRECT)m_BlueBall.rect)->top-m_BlueBall.ballRadius,
m_BlueBall.xPos-((LPRECT)m_BlueBall.rect)->left+m_BlueBall.ballRadius,
m_BlueBall.yPos-((LPRECT)m_BlueBall.rect)->top+m_BlueBall.ballRadius);
pDC->SelectObject(pOldBrush);
}
if(m_IsRed)
{
CDC* pDC = m_MoveBox.GetDC();
CBrush brush(RGB(255,0,0));
CBrush* pOldBrush = pDC->SelectObject(&brush);
pDC->Ellipse(m_RedBall.xPos-((LPRECT)m_RedBall.rect)->left-m_RedBall.ballRadius,
m_RedBall.yPos-((LPRECT)m_RedBall.rect)->top-m_RedBall.ballRadius,
m_RedBall.xPos-((LPRECT)m_RedBall.rect)->left+m_RedBall.ballRadius,
m_RedBall.yPos-((LPRECT)m_RedBall.rect)->top+m_RedBall.ballRadius);
pDC->SelectObject(pOldBrush);
}
}


BOOL CMultiThreadDemoDlg::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class

return CDialog::Create(IDD, pParentWnd);
}

...全文

相关推荐

屏幕坐标获取工具

在开发过程中,有时候我们需要知道特定元素或控件在屏幕上的位置,以便与其他元素对齐,或者在鼠标点击事件中确定点击的具体位置。这个工具可以提供这些坐标数据,帮助开发者快速定位问题,节省大量手动测量的时间。

slmax1

63、GDI+ 绘图与用户交互全解析

本文详细解析了基于GDI+的绘图机制与用户交互实现,涵盖文件读取、绘制流程优化、坐标转换方法及鼠标键盘事件处理。通过合理使用Invalidate方法提升绘制性能,结合多线程与事件响应机制实现高效的图形界面应用。同时介绍了复杂用户交互场景的实现思路,如文本选择与双击编辑,并提供了性能优化与扩展应用场景的建议。

redis7keeper

深入解析Win32垂直滚动条机制:从SysMets3看滚动核心原理

在图形界面开发中,滚动条是处理内容溢出视口的基础交互组件。Win32平台通过WM_VSCROLL消息、SCROLLINFO结构与标准滚动条协同,实现了内容坐标与视口坐标的动态映射。理解nMin、nMax、nPage三者的数学关系,以及SB_THUMBTRACK与SB_THUMBPOSITION的差异,是构建高效滚动逻辑的关键。这一机制广泛用于文本编辑器、日志面板、表格控件等场景,开发者需掌握滚动位置计算、重绘优化及边缘条件处理。SysMets3示例虽简单,却浓缩了垂直滚屏的完整链路,从消息处理到绘制对齐,再

南瑾i

VC++ MFC图形编程实战:从零绘制动态正弦波曲线

图形编程是计算机科学中数据可视化与人机交互的核心技术,其原理在于将抽象数据通过坐标映射与绘图指令转化为屏幕上的像素图像。在Windows桌面开发领域,设备上下文(DC)与GDI绘图接口构成了图形输出的基础框架,通过它们可以实现从简单的几何图形到复杂动态曲线的绘制。这项技术的工程价值在于能够将数学模型实时、直观地呈现,广泛应用于信号处理、科学计算可视化、工业监控及教育演示等场景。本文以正弦波绘制为例,深入讲解如何在VC++ MFC环境中,综合运用消息循环、坐标变换及双缓冲技术,实现一个参数可调、动态平滑的波形

weixin_30655569

js地理坐标与屏幕坐标互转换

**计算缩放比例**:根据地图的显示范围和屏幕尺寸计算出X轴和Y轴的缩放比例(scaleX 和 scaleY),以便将地理坐标映射到屏幕坐标上。

向着太阳往前冲
评论 2
收藏 已收藏
分享
返回顶部
CyberLogix
进程/线程/DLL 15,466 成员 49,169 内容