继续双缓冲(各位,我又来了)
我写的双缓冲程序,运行一段时间界面就停住了,不知道下面代码由啥问题。
/*
* FILE: DrawClock.cpp
*/
#include "clock.h"
#include "resource.h"
#include <Windows.h>
#include <CommCtrl.h>
#define PI 3.141592
extern int hour, minute, second;
extern HDC hdc;
extern HWND hWnd;
extern HINSTANCE hInst;
extern HBITMAP hBitmap2;
/* Fuction:DrawClock
* 画时针,分针,和秒针的处理函数.
*/
void DrawLine(HDC hMemDC)
{
//获取系统时间的解构体
SYSTEMTIME sys;
HBRUSH hBr, hOldBr,hNewBr;
HPEN hPen,hOldPen;
TCHAR cTime[64];
//指针的终点坐标
int SecondX ,SecondY, MinuteX, MinuteY, HourX, HourY;
GetLocalTime(&sys);
SecondX = 140 + 90 * sin((sys.wSecond * PI) / 30 );
SecondY = 160 - 90 * cos((sys.wSecond * PI) / 30 );
MinuteX = 140 + 60 * sin((sys.wMinute * PI) / 30 );
MinuteY = 160 - 60 * cos((sys.wMinute * PI) / 30 );
HourX = 140 + 35 * sin((sys.wHour * PI) / 6 );
HourY = 160 - 35 * cos((sys.wHour * PI) / 6 );
//内存上画线
hPen = CreatePen(PS_SOLID, 1, RGB(0xff, 0xff, 0x00));
hOldBr = (HBRUSH) SelectObject(hMemDC, hPen);
MoveToEx(hMemDC, 140, 160, NULL);
LineTo(hMemDC, SecondX, SecondY);
SelectObject(hMemDC, hOldBr);
DeleteObject(hPen);
hPen = CreatePen(PS_SOLID, 2, RGB(0xff, 0xff, 0x00));
hOldBr = (HBRUSH) SelectObject(hMemDC, hPen);
MoveToEx(hMemDC, 140, 160, NULL);
LineTo(hMemDC, MinuteX, MinuteY);
SelectObject(hMemDC, hOldBr);
DeleteObject(hPen);
hPen = CreatePen(PS_SOLID, 3, RGB(0xff, 0xff, 0x00));
hOldBr = (HBRUSH) SelectObject(hMemDC, hPen);
MoveToEx(hMemDC, 140, 160, NULL);
LineTo(hMemDC, HourX, HourY);
SelectObject(hMemDC, hOldBr);
DeleteObject(hPen);
wsprintf(cTime, L"Hour:%2d Minute:%2d Second:%2d", sys.wHour, sys.wMinute, sys.wSecond);
SetDlgItemText(hWnd, IDC_EDIT1, cTime);
//如果时间相等 就像主窗口发送一个信号 要求处理闹钟
if ((sys.wHour == hour) && (sys.wMinute == minute) && (sys.wSecond == second))
{
MessageBox(hWnd, TEXT("Time is up!"), TEXT("ALARM"), MB_OKCANCEL);
PlaySound(TEXT("MouseClick"), NULL, SND_SYNC);
}
}
/* Fuction:clockDraw
* 绘制背景的双缓冲处理函数,这样避免了屏幕闪烁的问题。
*/
void clockDraw()
{
HDC hdcMem, hdcMemBuf;
RECT rt;
PAINTSTRUCT ps;
HBITMAP hBitmap;
HBITMAP hBitmap2;
hBitmap2 = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));
//创建第一个内存DC
hdcMem = CreateCompatibleDC( hdc );
//创建缓冲位图,先把图画到这张空白位图上,小心!第一个参数是用目的 DC 才能创建彩色位图,否则只是单色!
hBitmap = CreateCompatibleBitmap( hdc, 638, 429);
//创建第二个内存DC
hdcMemBuf = CreateCompatibleDC( hdc );
//将空白位图选进第一缓冲区
SelectObject( hdcMem, hBitmap );
//用背景色刷一下
GetClientRect(hWnd, &rt);
FillRect( hdcMem, &rt, NULL );
//将要贴上去的图选进第二缓冲区
SelectObject( hdcMemBuf, hBitmap2);
//将第二个内存DC传给第一内存DC
BitBlt( hdcMem, 0, 0, 638, 429, hdcMemBuf, 0, 0, SRCCOPY );
//画线
DrawLine(hdcMem);
//最后画到目的 DC 上
BitBlt( hdc, 0, 0, 638, 429, hdcMem, 0, 0, SRCCOPY );
//结束操作
DeleteDC( hdcMemBuf );
DeleteObject( hBitmap );
DeleteObject( hBitmap2 );
DeleteDC( hdcMem );
}