1

Тема: Годиник на 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    ну не знаю....підскажіть..

2

Re: Годиник на WinApi

рядок 102: strftime(szTime,10,"%X",localtime<m);
Копіпастьте з розумом!

3

Re: Годиник на WinApi

Ваше середовище розробки, ймовірно, говорить в якому саме рядку сталася помилка. Знаючи номер рядку, дуже просто локалізувати помилку (особливо такого плану, як "undeclared identifier"). Якщо Ви хочете бути програмістом, потрібно розвивати навички взаємодії з компілятором.
Згодом самі зрозумієте, що так значно швидше і цікавіше програмувати.
П.С. Моє повідомлення - ні в якому разі не камінь в Ваш город. Просто дружня порада.

Подякували: Replace, prostoPhil, Chemist-i3