/**************************************** Name:DigitalClock API Study Author:mayadong7349 Date: 2011.01.14 修改:2011.04.30 贴了图 变得漂亮了 Blog:http://hi.baidu.com/mayadong7349/home ****************************************/ #include "stdafx.h" #include "resource.h" #define HEIGHT 59 // 每个数字的高度 #define WIDTH 35 // 每个数字的宽度 #define MAX_LOADSTRING 36 #define IDT_TIMER 1 #define IDM_TOPMOST 0x1000 BOOL bTopMost = TRUE; HDC hdcmem, hdccanvas; HBITMAP hBitmap; HBITMAP hBitmapMask; HBITMAP hBitmapBkground; HBITMAP hBitmapCanvas; BITMAP bm; // Global Variables: HINSTANCE hInst; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text void DisplayTime(HDC hdc); // 自定义函数:显示当前时间 // Foward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. MSG msg; // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_DIGITALCLOCK, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_DIGITALCLOCK); wcex.hCursor = LoadCursor(NULL,IDC_ARROW); wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex); } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_SYSMENU | WS_POPUP, ( GetSystemMetrics(SM_CXSCREEN) - WIDTH*8 ), 0, WIDTH*8, HEIGHT, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId; HMENU hSysMenu; HDC hdc; PAINTSTRUCT ps; switch (message) { case WM_CREATE: { if( SetTimer(hWnd,IDT_TIMER,1000,NULL) == 0 ) { MessageBox(hWnd,TEXT("安装定时器失败"), TEXT("错误"),MB_OK | MB_ICONHAND); exit(-1); } hSysMenu = GetSystemMenu(hWnd, FALSE); DeleteMenu(hSysMenu, 0, MF_BYPOSITION); DeleteMenu(hSysMenu, 1, MF_BYPOSITION); DeleteMenu(hSysMenu, 1, MF_BYPOSITION); DeleteMenu(hSysMenu, 1, MF_BYPOSITION); DeleteMenu(hSysMenu, 1, MF_BYPOSITION); AppendMenu(hSysMenu, MF_SEPARATOR, 0, NULL); AppendMenu(hSysMenu, MF_STRING, IDM_TOPMOST, TEXT("总在最前")); EnableMenuItem(hSysMenu,IDM_TOPMOST, MF_BYCOMMAND | MF_ENABLED); SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSIZE); CheckMenuItem(hSysMenu, IDM_TOPMOST, MF_BYCOMMAND | MF_CHECKED); // hBitmap = LoadBitmap (hInst, MAKEINTRESOURCE(IDB_DIGS)); // 加载位图 hBitmapMask = LoadBitmap (hInst, MAKEINTRESOURCE(IDB_DIGSMASK)); // 加载位图 hBitmapBkground = (HBITMAP)LoadImage(hInst, TEXT("./clcbg.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); GetObject(hBitmapBkground, sizeof(BITMAP), &bm); // hdc = GetDC(hWnd); hdcmem = CreateCompatibleDC(hdc); hdccanvas = CreateCompatibleDC(hdc); hBitmapCanvas = CreateCompatibleBitmap(hdc, WIDTH * 8, HEIGHT); ReleaseDC(hWnd, hdc); } break; / // 此段代码受zotin大哥的指导: http://hi.baidu.com/mayadong7349/blog/item/fc37f05a8baf8793800a18be.html 见评论 case WM_PAINT: { hdc = BeginPaint(hWnd, &ps); DisplayTime(hdc); EndPaint(hWnd, &ps); } break; / case WM_SYSCOMMAND: wmId = wParam; { if(wmId == IDM_TOPMOST) { hSysMenu = GetSystemMenu(hWnd, FALSE); if(bTopMost) { CheckMenuItem(hSysMenu, IDM_TOPMOST, MF_UNCHECKED); SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSIZE); bTopMost = FALSE; } else { CheckMenuItem(hSysMenu, IDM_TOPMOST, MF_CHECKED); SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSIZE); bTopMost = TRUE; } } return DefWindowProc(hWnd, WM_SYSCOMMAND, wmId, 0); } case WM_NCHITTEST: { UINT nHitTest; nHitTest = DefWindowProc(hWnd, WM_NCHITTEST, wParam, lParam); if(nHitTest == HTCLIENT && GetAsyncKeyState(MK_LBUTTON) < 0) nHitTest = HTCAPTION; return nHitTest; } case WM_CONTEXTMENU: POINT pt; pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); hSysMenu = GetSystemMenu(hWnd, FALSE); wmId = TrackPopupMenu(hSysMenu, TPM_LEFTALIGN | TPM_RETURNCMD, pt.x, pt.y, 0, hWnd, NULL); if(wmId > 0) SendMessage(hWnd, WM_SYSCOMMAND, wmId, 0); return 0; case WM_ERASEBKGND: // 防止开始绘制时的闪烁 return TRUE; case WM_KEYDOWN: switch(wParam) { case VK_ESCAPE: SendMessage(hWnd,WM_CLOSE,0,0); break; default:break; } break; case WM_TIMER: hdc = GetDC(hWnd); DisplayTime(hdc); ReleaseDC(hWnd, hdc); break; case WM_CLOSE: KillTimer(hWnd, IDT_TIMER); DeleteDC(hdcmem); DeleteDC(hdccanvas); DeleteObject(hBitmap); DeleteObject(hBitmapMask); DeleteObject(hBitmapBkground); DeleteObject(hBitmapCanvas); DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } void DisplayTime(HDC hdc) { SYSTEMTIME systime; TCHAR szTime[17]; TCHAR *pszTime = NULL; int i, j; memset(szTime, 0, sizeof(szTime)); GetLocalTime(&systime); // 获取系统时间 sprintf(szTime, "%02d:%02d:%02d", systime.wHour, systime.wMinute, systime.wSecond); // 系统时间格式化存入字符串 SelectObject(hdccanvas,hBitmapCanvas); // 初始化 SelectObject(hdcmem, hBitmapBkground); // 参见: http://blog.csdn.net/gengxt2003/archive/2010/11/02/5981216.aspx SetStretchBltMode(hdccanvas, HALFTONE); StretchBlt(hdccanvas, 0, 0, WIDTH*8, HEIGHT, hdcmem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); pszTime = szTime; i = 0; SelectObject(hdcmem, hBitmapMask); while(*pszTime != TEXT('/0') ) { BitBlt(hdccanvas, WIDTH*i, 0, WIDTH, HEIGHT, hdcmem, (*pszTime == TEXT(':') ? (WIDTH*10) : ( (int)(*pszTime) - 48 ) * WIDTH), 0, SRCAND); i++; pszTime++; } pszTime = szTime; i = j = 0; SelectObject(hdcmem, hBitmap); while(*pszTime != TEXT('/0') ) { if(*pszTime == ':') j++; BitBlt(hdccanvas, WIDTH*i, 0, WIDTH, HEIGHT, hdcmem, (*pszTime == TEXT(':') && (i == 2 || i == 5) ? (WIDTH*10) : ( (int)(*pszTime) - 48 ) * WIDTH), j*HEIGHT, SRCPAINT); i++; pszTime++; } BitBlt(hdc, 0, 0, WIDTH*8, HEIGHT, hdccanvas, 0, 0, SRCCOPY); } 工程下载地址: http://mydstudy.googlecode.com/files/DigitalClock_Beautiful.zip