自己通过位图实现了数字时钟

由于自己对于创建窗口已经很熟悉了,所以就直接生成非空的win32程序。

思路其实很简单,代码敲完直接运行过,好有成就感啊:

①加载需要的数字和符号位图

②将位图放入内存DC

③得到系统时间,然后计算时分秒的每个数字的值

④找到时分秒数字与图片上数字的对应关系,然后通过计算确定位置。

⑥Bitblt将图片放入屏幕。

⑦选出加载进入内存DC的位图

⑧删除DC

⑨设置定时器,刷新区域

⑩删除图片对象的句柄

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		{
			hdc = BeginPaint(hWnd, &ps);
			// TODO: 在此添加任意绘图代码...
			BITMAP bmp;
			hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP_NUM));
			GetObject(hBitmap,sizeof(BITMAP),&bmp);

			HDC hMemDc = CreateCompatibleDC(hdc);
			HBITMAP hOldbmp = (HBITMAP)SelectObject(hMemDc,hBitmap);

			RECT rect;
			GetClientRect(hWnd,&rect);
			
			int iWidth = rect.right - rect.left;
			int iHeight = rect.bottom - rect.top;
			
			SYSTEMTIME st;
			GetLocalTime(&st);
			int iTime[8] = {st.wHour/10,st.wHour%10,11,st.wMinute/10,st.wMinute%10,11,st.wSecond/10,st.wSecond%10};
			for (int i =0 ;i < 8;i++)
			{
				BitBlt(hdc,(i)*bmp.bmWidth,0,bmp.bmWidth,bmp.bmHeight/12,hMemDc,0,(11-iTime[i])*bmp.bmHeight/12,SRCCOPY);
			}
		
			SelectObject(hMemDc,hOldbmp);
			DeleteDC(hMemDc);

			EndPaint(hWnd, &ps);
		}
		break;
	case WM_DESTROY:
		KillTimer(hWnd,1);
		PostQuitMessage(0);
		break;
	case WM_CREATE:
		{
			SetTimer(hWnd,1,1000,NULL);
		}
		break;
	case WM_TIMER:
		{
			InvalidateRect(hWnd,NULL,TRUE);
		}
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

运行结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值