www.pudn.com > WinGOS.rar > WinGOS.cpp


// WinGOS.cpp : 定义应用程序的入口点。 
// 
 
 
#include "stdafx.h" 
#include "WinGOS.h" 
#include "WinHal.h" 
#include "SimDisplay.h" 
 
#define MAX_LOADSTRING 100 
// 全局变量: 
HINSTANCE hInst;								// 当前实例 
TCHAR szTitle[MAX_LOADSTRING];					// 标题栏文本 
TCHAR szWindowClass[MAX_LOADSTRING];			// 主窗口类名 
 
// 此代码模块中包含的函数的前向声明: 
ATOM				MyRegisterClass(HINSTANCE hInstance); 
BOOL				InitInstance(HINSTANCE, int); 
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM); 
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM); 
 
HWND m_hWnd; 
PVOID m_pBmpFile=NULL; 
PBITMAPINFO m_pBmpInfo; 
WORD g_aSDBuffer[SD_CYSCREEN*SD_CXSCREEN]; 
extern void TRACE(LPCSTR sz,...); 
 
DWORD lsqrt(DWORD m) 
{ 
	DWORD n,i,r,v; 
 
	n=0; 
	r=0; 
	m<<=2; 
	for(i=15;i>0;i--) 
	{ 
		n<<=1; 
		r<<=2; r|=m>>30; 
		v=n; v<<=1; v|=1; 
		m<<=2; 
		if(r>=v) 
		{ 
			r-=v; 
			n++;  
		} 
	}  
	return n;  
}  
 
void LoadBmpFile(LPCTSTR file) 
{ 
	DWORD nSize; 
	BOOL bResult; 
	HANDLE hFile = CreateFile(file,GENERIC_READ, 
		0,NULL,OPEN_EXISTING,0,NULL); 
	if(hFile==HANDLE(-1))return; 
	nSize=GetFileSize(hFile,NULL); 
	m_pBmpFile=::VirtualAlloc(0,nSize,MEM_COMMIT,PAGE_READWRITE); 
	bResult=ReadFile(hFile,m_pBmpFile,nSize,&nSize,NULL); 
	CloseHandle(hFile); 
} 
 
void SD_Init() 
{ 
	m_pBmpInfo=(PBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3); 
	BITMAPINFOHEADER &bh=*PBITMAPINFOHEADER(m_pBmpInfo); 
	PDWORD aColor=PDWORD(&m_pBmpInfo->bmiColors); 
	bh.biSize=sizeof(BITMAPINFOHEADER); 
	bh.biWidth=SD_CXSCREEN; 
	bh.biHeight=SD_CYSCREEN; 
	bh.biPlanes=1; 
	bh.biBitCount=16; 
	bh.biCompression=BI_BITFIELDS; 
	bh.biSizeImage=0; 
	bh.biXPelsPerMeter=3270; 
	bh.biYPelsPerMeter=3270; 
	bh.biClrUsed=0; 
	bh.biClrImportant=0; 
	aColor[0]=31<<11; 
	aColor[1]=63<<5; 
	aColor[2]=31; 
 
	LoadBmpFile("C:\\temp\\wp.bmp"); 
} 
 
void SD_Invalidate(PVOID pRect) 
{ 
	InvalidateRect(m_hWnd,NULL,FALSE); 
} 
 
void SD_ViewSize(double dScale) 
{ 
	RECT rw,rc; 
	int dx,dy; 
	int sx,sy; 
	GetWindowRect(m_hWnd,&rw); 
	GetClientRect(m_hWnd,&rc); 
	dx=rc.right-rc.left; 
	dx=int(dScale*SD_CXSCREEN+0.5)-dx; 
	dy=rc.bottom-rc.top; 
	dy=int(dScale*SD_CYSCREEN+0.5)-dy; 
	dx+=rw.right-rw.left; 
	dy+=rw.bottom-rw.top; 
	sx=GetSystemMetrics(SM_CXSCREEN); 
	sy=GetSystemMetrics(SM_CYSCREEN); 
	rw.left=(sx-dx)>>1; 
	rw.top=(sy-dy)>>1; 
	MoveWindow(m_hWnd,rw.left,rw.top,dx,dy,TRUE); 
} 
 
void SD_Update(HDC hDC) 
{ 
	RECT rect; 
	GetClientRect(m_hWnd,&rect); 
	StretchDIBits(hDC,rect.left,rect.top, 
		rect.right-rect.left,rect.bottom-rect.top, 
		0,0,SD_CXSCREEN,SD_CYSCREEN, 
		g_aSDBuffer,m_pBmpInfo,DIB_RGB_COLORS,SRCCOPY); 
} 
 
void Sim_MouseEvent(UINT nMessage,WPARAM wParam,LPARAM lParam) 
{ 
	RECT r; 
	DWORD x=LOWORD(lParam),y=HIWORD(lParam); 
	GetClientRect(m_hWnd,&r); 
	x=(x*SD_CXSCREEN+(r.right>>1))/r.right; 
	y=(y*SD_CYSCREEN+(r.bottom>>1))/r.bottom; 
	HalMain(halMouseEvent,nMessage,MAKELONG(x,y)); 
} 
 
int APIENTRY _tWinMain(HINSTANCE hInstance, 
                     HINSTANCE hPrevInstance, 
                     LPTSTR    lpCmdLine, 
                     int       nCmdShow) 
{ 
 	// TODO: 在此放置代码。 
	MSG msg; 
	HACCEL hAccelTable; 
 
 
	// 初始化全局字符串 
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 
	LoadString(hInstance, IDC_WINGOS, szWindowClass, MAX_LOADSTRING); 
	MyRegisterClass(hInstance); 
 
	// 执行应用程序初始化: 
	if (!InitInstance (hInstance, nCmdShow))  
	{ 
		return FALSE; 
	} 
 
	//GOS 程序 
	SD_Init(); 
	SD_Invalidate(NULL); 
	HalMain(halCreate,0,0); 
	::Sleep(50); 
	if(m_pBmpFile)HalMain(halSetWallpaper,WPARAM(m_pBmpFile),0); 
 
	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WINGOS); 
 
	// 主消息循环: 
	g_AW.Play("c:\\temp\\gos.pcm"); 
	while (GetMessage(&msg, NULL, 0, 0))  
	{ 
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))  
		{ 
			TranslateMessage(&msg); 
			DispatchMessage(&msg); 
		} 
	} 
	g_AW.StopPlay(); 
 
	return (int) msg.wParam; 
} 
 
 
 
// 
//  函数: MyRegisterClass() 
// 
//  目的: 注册窗口类。 
// 
//  注释:  
// 
//    仅当希望在已添加到 Windows 95 的 
//    “RegisterClassEx”函数之前此代码与 Win32 系统兼容时, 
//    才需要此函数及其用法。调用此函数 
//    十分重要,这样应用程序就可以获得关联的 
//   “格式正确的”小图标。 
// 
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_WINGOS); 
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW); 
	wcex.hbrBackground	= NULL; 
	wcex.lpszMenuName	= (LPCTSTR)IDC_WINGOS; 
	wcex.lpszClassName	= szWindowClass; 
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); 
 
	return RegisterClassEx(&wcex); 
} 
 
// 
//   函数: InitInstance(HANDLE, int) 
// 
//   目的: 保存实例句柄并创建主窗口 
// 
//   注释:  
// 
//        在此函数中,我们在全局变量中保存实例句柄并 
//        创建和显示主程序窗口。 
// 
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 
{ 
   HWND hWnd; 
 
   hInst = hInstance; // 将实例句柄存储在全局变量中 
 
   m_hWnd=hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 
 
   if (!hWnd) 
   { 
      return FALSE; 
   } 
 
   SD_ViewSize(1); 
   ShowWindow(hWnd, nCmdShow); 
   UpdateWindow(hWnd); 
 
   return TRUE; 
} 
 
// 
//  函数: WndProc(HWND, unsigned, WORD, LONG) 
// 
//  目的: 处理主窗口的消息。 
// 
//  WM_COMMAND	- 处理应用程序菜单 
//  WM_PAINT	- 绘制主窗口 
//  WM_DESTROY	- 发送退出消息并返回 
// 
// 
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, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); 
			break; 
		case IDM_EXIT: 
			DestroyWindow(hWnd); 
			break; 
		default: 
			return DefWindowProc(hWnd, message, wParam, lParam); 
		} 
		break; 
	case WM_PAINT: 
		hdc = BeginPaint(hWnd, &ps); 
		// TODO: 在此添加任意绘图代码... 
		SD_Update(hdc); 
		EndPaint(hWnd, &ps); 
		break; 
	case WM_LBUTTONDOWN: 
	case WM_LBUTTONUP: 
	case WM_MOUSEMOVE: 
		Sim_MouseEvent(message,wParam,lParam); 
		break; 
	case WM_DESTROY: 
		PostQuitMessage(0); 
		break; 
	default: 
		return DefWindowProc(hWnd, message, wParam, lParam); 
	} 
	return 0; 
} 
 
// “关于”框的消息处理程序。 
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	switch (message) 
	{ 
	case WM_INITDIALOG: 
		return TRUE; 
 
	case WM_COMMAND: 
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)  
		{ 
			EndDialog(hDlg, LOWORD(wParam)); 
			return TRUE; 
		} 
		break; 
	} 
	return FALSE; 
}