Тема: Годиник на WinApi
Пробую створити цифровий годиник, щоб він був свого роду прозорий...Алгоритм:
#define _WIN32_WINNT 0x0501 //SetLayeredWindowAttributes
#include <windows.h>
#include <windowsx.h> // HANDLE_MSG, SelectBitmap, SelectFont
#include <time.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL OnCreate(HWND,CREATESTRUCT FAR*);
void OnTimer(HWND,UINT);
void OnPaint(HWND);
void OnDestroy(HWND);
HBITMAP Create_hBitmap(HDC,int,int);
HDC hdcMem, hdc;
HBITMAP hBitmap;
char szTime[10];
char szFace[]="Arial Cyr";
time_t ltm;
HFONT hFont;
LOGFONT lf;
int wndL=300,wndT=20,wndW=200,wndH=40;
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
{
HWND hwnd;
HRGN hReg;
char szClassName[]="MainWindow";
char szTitle[]="desk";
MSG msg;
WNDCLASS wc;
memset(&wc,0,sizeof(wc));
wc.style=CS_DBLCLKS;// !!! использовать двойной щелчёк !!!
wc.lpfnWndProc=WndProc;
wc.hInstance=hInst;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=WHITE_BRUSH;
wc.lpszClassName=szClassName;
RegisterClass(&wc);
// WS_EX_TOOLWINDOW - убрать с панели
// WS_EX_LAYERED - прозрачность
hwnd = CreateWindowEx (WS_EX_LAYERED|WS_EX_TOOLWINDOW,
szClassName,"desk",WS_OVERLAPPEDWINDOW|WS_VISIBLE,
wndL,wndT,wndW,wndH,HWND_DESKTOP,NULL,hInst,NULL);
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE)
& (~(WS_CAPTION|WS_SIZEBOX)));
hReg = CreateRectRgn(0,0,wndW,wndH);
SetWindowRgn(hwnd, hReg, true);
DeleteObject(hReg);
// SetLayered... параметры прозрачности
// WHITE_BRUSH - тоже что и wc.hbrBackground
SetLayeredWindowAttributes(hwnd,WHITE_BRUSH,0,LWA_COLORKEY);
ShowWindow (hwnd,SW_SHOW);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
switch(msg)
{
HANDLE_MSG(hwnd,WM_CREATE,OnCreate);
HANDLE_MSG(hwnd,WM_TIMER,OnTimer);
HANDLE_MSG (hwnd, WM_PAINT, OnPaint);
HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy);
case WM_LBUTTONDBLCLK: // двойной щелчёк по цифре
OnDestroy(hwnd);
break;
default: return(DefWindowProc(hwnd,msg,wParam,lParam));
}
}
BOOL OnCreate(HWND hwnd,LPCREATESTRUCT)
{
hdc=GetDC(hwnd);
hdcMem=CreateCompatibleDC(hdc);
RECT r;
SystemParametersInfo(SPI_GETWORKAREA,0,&r,0); // узнать размеры экрана
hBitmap=Create_hBitmap(hdc,r.right,r.bottom);
SelectBitmap(hdcMem,hBitmap); // для нулевого фона
ReleaseDC(hwnd,hdc);
wndL=r.right-wndW-20; // справа вверху
SetWindowPos(hwnd,NULL,wndL,wndT,wndW,wndH,SWP_NOSIZE);
SetTimer(hwnd,1,1000,NULL);
return TRUE;
}
void OnTimer(HWND hwnd,UINT)
{
InvalidateRect(hwnd,NULL,FALSE);//Перерисовка окна. Если FALSE - не мигает
} //OnTimer
void OnPaint(HWND hwnd)
{
PAINTSTRUCT ps;
hdc=BeginPaint(hwnd,&ps);
BitBlt(hdc,0,0,wndW,wndH,hdcMem,wndL,wndT,SRCCOPY) ; // нулевой фон
SetBkMode(hdc,TRANSPARENT);
ltm = time(NULL); // время системы
strftime(szTime,10,"%X",localtime<m);
ZeroMemory(&lf,sizeof(lf));
strcpy(lf.lfFaceName,szFace);
lf.lfHeight=60;
lf.lfWeight=FW_BOLD;
hFont=CreateFontIndirect(&lf);
SelectFont(hdc,hFont);
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,0 ,-10,szTime, lstrlen(szTime));
EndPaint(hwnd,&ps);
}
void OnDestroy(HWND)
{
DeleteBitmap(hBitmap);
DeleteDC(hdcMem);
PostQuitMessage(0);
}
HBITMAP Create_hBitmap(HDC hDC,int w, int h)
{
HDC hDCmem;
HBITMAP hbm,holdBM;
hDCmem=CreateCompatibleDC(hDC);
hbm=CreateCompatibleBitmap(hDC,w,h);
holdBM=(HBITMAP)SelectObject(hDCmem,hbm);
BitBlt(hDCmem, 0,0, w, h, hDC, 0,0, SRCCOPY);
SelectObject(hDCmem,holdBM);
DeleteDC(hDCmem);
DeleteObject(holdBM);
return hbm;
}
Вибиває ошибку Error 1 error C2065: 'm' : undeclared identifier ну не знаю....підскажіть..