WIN32自绘窗体简单使用

本文介绍了一个基于Windows平台的自定义绘图控件实现方案,利用双缓冲技术和位图资源绘制界面元素,包括背景、按钮及文本等内容,并通过线程定时刷新确保流畅体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//通过线程不停的绘制界面50ms

unsigned int _stdcall BeginDrawProc(void *param)
{
CDrawWnd *pThis = (CDrawWnd*)param;
while (1)
{
pThis->Draw();
Sleep(50);
}
}


//然后在Draw中实现要绘制的控件如按钮,背景等

void CDrawWnd::Draw()
{
HDC hDC = GetDC(m_hWnd);
if (hDC == NULL)
return;


RECT rect;
GetClientRect(m_hWnd, &rect);
HDC hMemDC = CreateCompatibleDC(hDC);
HBITMAP hBitmap = CreateCompatibleBitmap(hDC, 400, 300);
SelectObject(hMemDC, hBitmap);




HBRUSH hBrushBack = CreateSolidBrush(RGB(255, 255, 255));
SelectObject(hMemDC, hBrushBack);
FillRect(hMemDC, &rect, hBrushBack);


//画背景
HDC dcTmp = CreateCompatibleDC(NULL);
//HBITMAP hBitmapBK = (HBITMAP)LoadImage(m_hInstance, MAKEINTRESOURCE(IDB_BK_BMP), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
//获取位图信息


//SelectObject(dcTmp, hBitmapBK);
if (m_hBitmapBK == NULL)
{
DeleteDC(dcTmp);
DeleteDC(hMemDC);
return;
}
SelectObject(dcTmp, m_hBitmapBK);


BitBlt(hMemDC, 0, 0, 400, 65, dcTmp, 0, 0, SRCCOPY);


//画关闭按钮
DrawCloseBtn(hMemDC);


//画表格
if (m_bClickTraffic)
{
DrawTrafficLine(hMemDC);
}
else
{


DrawChangeBtn(hMemDC);


//画点击按钮
DrawBtn(hMemDC);


//画文本
DrawText(hMemDC);


//华编辑框
DrawEdit(hMemDC);


//输出编辑框的结果
DrawResult(hMemDC);
}




BitBlt(hDC, 0, 0, 400, 300, hMemDC, 0, 0, SRCCOPY);


DeleteObject(hBrushBack);
DeleteObject(hBitmap);
DeleteObject(dcTmp);
DeleteDC(hMemDC);
ReleaseDC(m_hWnd, hDC);


}


//一个Btn的双缓冲的实现

void CDrawWnd::DrawBtn(HDC hDC)
{
RECT rcClient;
POINT pt;
GetWindowRect(m_hWnd, &rcClient);
GetCursorPos(&pt);


HDC hTmpDC = CreateCompatibleDC(NULL);
//HBITMAP hBitmap = (HBITMAP)LoadImage(m_hInstance, MAKEINTRESOURCE(IDB_EXCUTE_BMP), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);


#if _DEBUG
if (m_hExecuteBmp == NULL)
{
MessageBox(NULL, _T("位图文件加载失败"), _T("温馨提示"), MB_ICONERROR);
DeleteDC(hTmpDC);
return;
}


#else
if (m_hExecuteBmp == NULL)
{
//MessageBox(NULL, _T("位图文件加载失败"), _T("温馨提示"), MB_ICONERROR);
DeleteDC(hTmpDC);
return ;
}


#endif


SelectObject(hTmpDC, m_hExecuteBmp);


if ((m_CursorPt.x > 310 && m_CursorPt.x<370) &&
(m_CursorPt.y>218 && m_CursorPt.y < 270) && PtInRect(&rcClient, pt))
{
BitBlt(hDC, 310, 218, 62, 62, hTmpDC, 0, 0, SRCCOPY);
//printf("Selected!\n");
}
else
{
BitBlt(hDC, 310 - 5, 218, 62, 62, hTmpDC, 62, 0, SRCCOPY);
//printf("Not Selected!\n");
}


//DeleteObject(hBitmap);
DeleteDC(hTmpDC);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值