⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winmain.cpp

📁 还是电子钟的 汇编程序 不过有详细的电路图和文档
💻 CPP
字号:
#include <Windows.h>
#include <cmath>
#include "resource.h"

#define CLOCK_SIZE 150
#define ID_TIMER 1

HINSTANCE hInst;
HMENU hPopupMenu;
HCURSOR hCursor;
HCURSOR hCursorGrab;
HDC hDCBack,hDCClock;
HBITMAP hBmpBack,hBmpClock;
int IDBack,IDCirle,IDMask;

class CLOCKPARAM
{
public:
	LONG lClockX;
	LONG lClockY;
	CLOCKPARAM(){};
	VOID Calculate(HWND hWnd)
	{
		RECT stRect;
		GetClientRect(hWnd,&stRect);
		lClockX=(stRect.left+stRect.right)/2;
		lClockY=(stRect.top+stRect.bottom)/2;
	};
	~CLOCKPARAM(){};
}stClockParam;

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
VOID CreateBackGround(HWND hWnd);
VOID CreateClockPic(HWND hWnd);
VOID DrawLine(HDC hDC,int iDegree,int iLineWith,int iDeLong);


int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
	hPopupMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));
	hPopupMenu=GetSubMenu(hPopupMenu,0);
	hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1));
	hCursorGrab=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR2));
	hInst=hInstance;

	HICON hIcon;
	HWND hWnd;
	MSG msg;

	hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
	WCHAR szClsName[]=TEXT("class1");

	WNDCLASSEX stWndCls;
	stWndCls.cbClsExtra=0;
	stWndCls.cbWndExtra=0;
	stWndCls.lpszMenuName=NULL;
	stWndCls.cbSize=sizeof(stWndCls);
	stWndCls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	stWndCls.hCursor=hCursor;
	stWndCls.hIcon=hIcon;
	stWndCls.hIconSm=hIcon;
	stWndCls.hInstance=hInstance;
	stWndCls.lpfnWndProc=WndProc;
	stWndCls.lpszClassName=szClsName;
	stWndCls.style=CS_HREDRAW|CS_VREDRAW;
	RegisterClassEx(&stWndCls);

	hWnd=CreateWindowEx(0,szClsName,TEXT("主窗口"),WS_POPUP|WS_SYSMENU,240,180
		,CLOCK_SIZE,CLOCK_SIZE,NULL,NULL,hInstance,NULL);
	ShowWindow(hWnd,SW_NORMAL);
	UpdateWindow(hWnd);

	HACCEL hAccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
	while (GetMessage(&msg,NULL,0,0))
	{
		if (!TranslateAccelerator(hWnd,hAccel,&msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	POINT stPoint;
	int wmID;
	HDC hDC;
	PAINTSTRUCT stPs;

	switch (uMsg)
	{
	case WM_TIMER:
		CreateClockPic(hWnd);
		InvalidateRect(hWnd,NULL,false);
		break;
	case WM_PAINT:
		hDC=BeginPaint(hWnd,&stPs);
		BitBlt(hDC,0,0,CLOCK_SIZE,CLOCK_SIZE,hDCClock,0,0,SRCCOPY);
		EndPaint(hWnd,&stPs);
		break;
	case WM_COMMAND:
		wmID=LOWORD(wParam);
		switch (wmID)
		{
		case ID_BACK1:
			CheckMenuRadioItem(hPopupMenu,ID_BACK1,ID_BACK2,ID_BACK1,MF_BYCOMMAND);
			IDBack=IDB_BACK1;
			CreateBackGround(hWnd);
			InvalidateRect(hWnd,NULL,false);
			break;
		case ID_BACK2:
			CheckMenuRadioItem(hPopupMenu,ID_BACK1,ID_BACK2,ID_BACK2,MF_BYCOMMAND);
			IDBack=IDB_BACK2;
			CreateBackGround(hWnd);
			InvalidateRect(hWnd,NULL,false);
			break;
		case ID_CIRCLE1:
			CheckMenuRadioItem(hPopupMenu,ID_CIRCLE1,ID_CIRCLE2,ID_CIRCLE1,MF_BYCOMMAND);
			IDCirle=IDB_CIRCLE1;
			IDMask=IDB_MASK1;
			CreateBackGround(hWnd);
			InvalidateRect(hWnd,NULL,false);
			break;
		case ID_CIRCLE2:
			CheckMenuRadioItem(hPopupMenu,ID_CIRCLE1,ID_CIRCLE2,ID_CIRCLE2,MF_BYCOMMAND);
			IDCirle=IDB_CIRCLE2;
			IDMask=IDB_MASK2;
			CreateBackGround(hWnd);
			InvalidateRect(hWnd,NULL,false);
			break;
		case ID_EXIT:
			SendMessage(hWnd,WM_CLOSE,NULL,NULL);
			break;
		}
		break;
	case WM_RBUTTONDOWN:
		GetCursorPos(&stPoint);
		TrackPopupMenu(hPopupMenu,TPM_LEFTALIGN,stPoint.x,stPoint.y,NULL,hWnd,NULL);
		break;
	case WM_LBUTTONDOWN:
		SetCursor(hCursorGrab);
		SendMessage(hWnd,WM_NCLBUTTONDOWN,HTCAPTION,NULL);
		SetCursor(hCursor);
		break;
	case WM_CREATE:
		RECT stRect;
		GetClientRect(hWnd,&stRect);
		HRGN hRgn;
		hRgn=CreateEllipticRgnIndirect(&stRect);
		SetWindowRgn(hWnd,hRgn,1);
		DeleteObject(hRgn);
		SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
		hDC=GetDC(hWnd);
		hDCBack=CreateCompatibleDC(hDC);
		hDCClock=CreateCompatibleDC(hDC);
		hBmpBack=CreateCompatibleBitmap(hDC,CLOCK_SIZE,CLOCK_SIZE);
		hBmpClock=CreateCompatibleBitmap(hDC,CLOCK_SIZE,CLOCK_SIZE);
		SelectObject(hDCBack,hBmpBack);
		SelectObject(hDCClock,hBmpClock);
		ReleaseDC(hWnd,hDC);
		IDBack=IDB_BACK1;
		IDCirle=IDB_CIRCLE1;
		IDMask=IDB_MASK1;
		CheckMenuRadioItem(hPopupMenu,ID_BACK1,ID_BACK2,ID_BACK1,MF_BYCOMMAND);
		CheckMenuRadioItem(hPopupMenu,ID_CIRCLE1,ID_CIRCLE2,ID_CIRCLE1,MF_BYCOMMAND);
		CreateBackGround(hWnd);
		CreateClockPic(hWnd);
		InvalidateRect(hWnd,NULL,false);
		SetTimer(hWnd,ID_TIMER,1000,NULL);
		break;
	case WM_CLOSE:
		KillTimer(hWnd,ID_TIMER);
		DestroyWindow(hWnd);
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd,uMsg,wParam,lParam);
	}
	return 0;
}

VOID CreateBackGround(HWND hWnd)
{
	HDC hDc,hDcTemp;
	HBITMAP hBmp;
	HGDIOBJ hGdiObj;

	hDc=GetDC(hWnd);
	hDcTemp=CreateCompatibleDC(hDc);
	ReleaseDC(hWnd,hDc);

	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(IDBack));
	hGdiObj=CreatePatternBrush(hBmp);
	hGdiObj=SelectObject(hDCBack,hGdiObj);
	PatBlt(hDCBack,0,0,CLOCK_SIZE,CLOCK_SIZE,PATCOPY);
	DeleteObject(hGdiObj);

	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(IDMask));
	hGdiObj=SelectObject(hDcTemp,hBmp);
	BitBlt(hDCBack,0,0,CLOCK_SIZE,CLOCK_SIZE,hDcTemp,0,0,SRCAND);
	DeleteObject(hGdiObj);

	hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(IDCirle));
	hGdiObj=SelectObject(hDcTemp,hBmp);
	BitBlt(hDCBack,0,0,CLOCK_SIZE,CLOCK_SIZE,hDcTemp,0,0,SRCPAINT);
	DeleteObject(hGdiObj);

	DeleteDC(hDcTemp);
	DeleteObject(hBmp);
}

VOID CreateClockPic(HWND hWnd)
{
	BitBlt(hDCClock,0,0,CLOCK_SIZE,CLOCK_SIZE,hDCBack,0,0,SRCCOPY);
	stClockParam.Calculate(hWnd);
	SYSTEMTIME stSysTime;
	GetLocalTime(&stSysTime);
	HGDIOBJ hGdiObj;
	hGdiObj=CreatePen(PS_SOLID,1,BLACK_PEN);
	hGdiObj=SelectObject(hDCClock,hGdiObj);
	DeleteObject(hGdiObj);
	DrawLine(hDCClock,stSysTime.wSecond*360/60,1,5);
	hGdiObj=CreatePen(PS_SOLID,2,BLACK_PEN);
	hGdiObj=SelectObject(hDCClock,hGdiObj);
	DeleteObject(hGdiObj);
	DrawLine(hDCClock,stSysTime.wMinute*360/60,1,10);
	hGdiObj=CreatePen(PS_SOLID,3,BLACK_PEN);
	hGdiObj=SelectObject(hDCClock,hGdiObj);
	DeleteObject(hGdiObj);
	DrawLine(hDCClock,stSysTime.wHour*360/12+stSysTime.wMinute/2,1,15);
}

VOID DrawLine(HDC hDC,int iDegree,int iLineWith,int iDeLong)
{
	LONG x,y,x0,y0;
	x=(LONG)(stClockParam.lClockX+(CLOCK_SIZE/2-10-iDeLong)*sin(iDegree*3.1415926/180));
	x0=(LONG)(stClockParam.lClockX-10*sin(iDegree*3.1415926/180));
	y=(LONG)(stClockParam.lClockY-(CLOCK_SIZE/2-10-iDeLong)*cos(iDegree*3.1415926/180));
	y0=(LONG)(stClockParam.lClockY+10*cos(iDegree*3.1415926/180));
	MoveToEx(hDC,x0,y0,NULL);
	LineTo(hDC,x,y);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -