📄 miniwin.cpp
字号:
// MiniWin.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#include "stdio.h"
#include "MiniWin.h"
#include "memwatch.h"
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include"winsock2.h"
#include "PrDbg.h"
#include"time.h"
#include "PrGfx.h"
//#include"waba.h"
#include<stdlib.h>
#include"wingdi.h"
#include"windows.h"
#define MAX_LOADSTRING 100
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
#if 1//define 0 to test Waba JVM
extern "C" int MWSystemInit(void);
extern "C" int MWSystemTerm(void);
extern "C" int DVBInit(void);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
DIBSECTION dib;
BITMAP bmp;
//LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
int cx=GetSystemMetrics(SM_CXICONSPACING);
int xy=GetSystemMetrics(SM_CYICONSPACING);
xy=GetSystemMetrics(SM_CXDLGFRAME);
xy-= GetSystemMetrics(SM_CXEDGE);
LoadString(hInstance, IDC_MINIWIN, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
lpCmdLine;nCmdShow;hInstance;hPrevInstance;
AllocConsole();
freopen("CONOUT$","w",stdout);
if (!InitInstance (hInstance, nCmdShow))
return FALSE;
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
MWSystemTerm();
FreeConsole();
return msg.wParam;
}
#endif
// FUNCTION: MyRegisterClass()
// PURPOSE: Registers the window class.
// COMMENTS: This function and its usage is only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx' function
// that was added to Windows 95. It is important to call this function so that t
// he application will get 'well formed' small icons associated with it.
#if 1
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_MINIWIN);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_MINIWIN;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
#endif
// FUNCTION: InitInstance(HANDLE, int)
// PURPOSE: Saves instance handle and creates main window
// COMMENTS:In this function, we save the instance handle in a global variable and
// create and display the main program window.
//extern "C" void FatTest(void);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
return FALSE;
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);//网络必须启动,否则FILTER和打印不能工作
maindc=GetDC(hWnd);//这里不要更改否则OSD没办法工作
//FatTest();
int sc=GetSystemMetrics(SM_CXVSCROLL);
SetWindowPos(hWnd,0,50,50,730,630,SWP_SHOWWINDOW);
//SetTimer(hWnd,100,10,NULL);
MWSystemInit();
#ifdef DVB
DVBInit();
#endif
for(int i=0;i<0;i++){
COLORREF cl=GetSysColor(i);
PrDbgPrintf("RGB(0x%02X,0x%02X,0x%02X),//SYSCOLOR %d\r\n",
GetRValue(cl),GetGValue(cl),GetBValue(cl),i);
}
ShowWindow(hWnd, nCmdShow);
return TRUE;
}
//**********************************************************************
#if 1
HBITMAP CopyDCToBitmap(HDC hScrDC,LPRECT lpRect)
{
HDC hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap,hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 位图宽度和高度
// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return NULL;
// 获得选定区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
StretchBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,nWidth,nHeight,SRCCOPY);
//BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//清除
// DeleteDC(hScrDC);
DeleteDC(hMemDC);
DeleteObject(hOldBitmap);
// 返回位图句柄
return hBitmap;
}
int CaptureScreen(HBITMAP hBitmap,const char* FileName)
{
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;
//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1) wBitCount = 1;
else if (iBits <= 4) wBitCount = 4;
else if (iBits <= 8) wBitCount = 8;
else wBitCount = 24;
GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrImportant = 0;
bi.biClrUsed = 0;
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if(hPal){
hDC = ::GetDC(NULL);
//hDC = m_pDc->GetSafeHdc();
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);
//恢复调色板
if(hOldPal){
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
//创建位图文件
fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE) return FALSE;
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return 1;
}
extern "C" void MwHandleMouseStatus(INT newx,INT newy,INT newbuttons);
extern "C" BOOL PostMessageToMW(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam);
void test(HDC hdc)
{
#define XX 50
HDC hmemdc=CreateCompatibleDC(hdc);
HBITMAP hbmp=CreateCompatibleBitmap(hdc,XX,XX);
HBRUSH nb,ob;
HPEN np,op;
RECT rc;
BITMAP bmp;
SelectObject(hmemdc,hbmp);
SetRect(&rc,0,0,XX,XX);
nb=CreateSolidBrush(RGB(255,0,0));
np=CreatePen(PS_SOLID,1,RGB(0,0,255));
ob=(HBRUSH)SelectObject(hmemdc,nb);
op=(HPEN)SelectObject(hmemdc,np);
Rectangle(hmemdc,0,0,XX,XX);
SelectObject(hmemdc,ob);
DeleteObject(nb);
nb=CreateSolidBrush(RGB(0,200,0));
ob=(HBRUSH)SelectObject(hmemdc,nb);
Ellipse(hmemdc,0,0,XX,XX);
MoveToEx(hmemdc,0,0,NULL);
LineTo(hmemdc,XX,XX);
SelectObject(hmemdc,op);
DeleteObject(np);
np=CreatePen(PS_SOLID,1,RGB(255,0,0));
op=(HPEN)SelectObject(hmemdc,np);
MoveToEx(hmemdc,0,XX,NULL);LineTo(hmemdc,XX,0);
nb=CreatePatternBrush(hbmp);
ob=(HBRUSH)SelectObject(hdc,nb);
RoundRect(hdc,10,10,650,500,80,60);
SelectObject(hmemdc,ob);
SelectObject(hmemdc,op);
DeleteDC(hmemdc);
GetObject(hbmp,sizeof(BITMAP),&bmp);
DeleteObject(hbmp);
StretchBlt(hdc,10,10,400,120,hdc,10,540,100,32,0);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
TCHAR szHello[MAX_LOADSTRING];
// PRInputEvent evt;
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
int xx = GetSystemMetrics(SM_CXFRAME) - GetSystemMetrics(SM_CXDLGFRAME);
xx = GetSystemMetrics(SM_CYFRAME) - GetSystemMetrics(SM_CYDLGFRAME);
xx=GetSystemMetrics(SM_CYSMCAPTION);
switch (message)
{
case WM_PAINT:
{
HDC hdc;
hdc=BeginPaint(hWnd,&ps);
if(scrdev.UpdateRect)scrdev.UpdateRect(&scrdev,0,0,720,576);
EndPaint(hWnd,&ps);
}break;
case WM_TIMER:
PostMessageToMW(NULL,WM_KEYDOWN,wParam,lParam);
break;
case WM_COMMAND:
if(LOWORD(wParam)==IDM_ABOUT)
DialogBox(NULL,MAKEINTRESOURCE(IDD_ABOUTBOX),NULL,NULL);
if(LOWORD(wParam)==IDM_CAPTURE){
RECT rc={0,0,720,576};
char fname[256];
static int count=0;
HDC hdc=GetDC(hWnd);
HBITMAP hBmp=CopyDCToBitmap(hdc,&rc);
sprintf(fname,"bmp%03d.bmp",count++);
CaptureScreen(hBmp,fname);
DeleteObject(hBmp);
ReleaseDC(hWnd,hdc);
}
break;
case WM_LBUTTONUP:
case WM_RBUTTONUP:
MwHandleMouseStatus(LOWORD(lParam),HIWORD(lParam),wParam);
break;
case WM_RBUTTONDOWN:
case WM_LBUTTONDOWN:
{
MwHandleMouseStatus(LOWORD(lParam),HIWORD(lParam),wParam);
}break;
case WM_MOUSEMOVE:
MwHandleMouseStatus(LOWORD(lParam),HIWORD(lParam),wParam&0x0F);
break;
case WM_KEYDOWN:
switch(wParam){
case 0x5D:
case VK_F1:
case VK_RMENU:wParam=VK_MENU;PrDbgPrintf("recv VK_MENU\n");
break;
default:break;
}
if(wParam){
PostMessageToMW(NULL,WM_KEYDOWN,wParam,lParam);
}break;
case WM_DESTROY:PostQuitMessage(0); break;
default:return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -