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

📄 emwin.c

📁 本代码包为本人的一篇文章<一个占用内存极少的菜单系统的实现>在在PC上的测试移植代码。 ------------------------------ Menu_Src目录为Menu的源
💻 C
📖 第 1 页 / 共 3 页
字号:
				}while(0);
			}
			else{
			}
			LCDSIM_CheckMouseState();
			//if(ghThread == 0) PostQuitMessage(0);
			break;
		/* 2005-6-8 23:32:58
			#define WM_MOUSEFIRST   0x0200
			#define WM_MOUSEMOVE    0x0200
			#define WM_LBUTTONDOWN  0x0201
			#define WM_LBUTTONUP    0x0202
			cmp     eax, 1FFh		//此处处理所有三种MOUSE消息, 在反编译中容易看漏的, 如下所示...
			jbe     loc_55D4		//小于等于0x1ff跳往DefWindowProc处理...
			cmp     eax, 202h		//msg小于0x202则转往处理MOUSE消息...
			jbe     short loc_557E	*/
		case WM_MOUSEMOVE:
		case WM_LBUTTONDOWN:
		case WM_LBUTTONUP:
			xPos = LOWORD(lParam);
			yPos = HIWORD(lParam);
			//此处判断MOUSE坐标时,一定注意所取的MOUSE坐标范围要翻倍...
			SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
			if(xPos >= 0 &&  yPos >=0 && xPos <= LCD_GetDevCap(LCD_DEVCAP_XSIZE)*LCD_GetXMag() && yPos <= LCD_GetDevCap(LCD_DEVCAP_YSIZE)*LCD_GetYMag()){
				LCDSIM_SetMouseState(xPos, yPos, wParam);
			}else{
				LCDSIM_SetMouseState(-1, -1, 0);
			}
			break;
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			if(ps.fErase != 0){
				rt.left = 0;
				rt.top = 0;
				rt.right = 0xfff;
				rt.bottom = 0xfff;
				FillRect(hdc, &rt, GetStockObject(BLACK_BRUSH));
			}
			//InvalidateRect(hWnd,NULL, 0); //此句不可丢,否则无法显示出要画的位图, 改在定时器中刷新窗口....
		//	LCDSIM_CheckInit(hWnd);
			LCDSIM_Paint(hdc);
			EndPaint(hWnd, &ps);
			break;
		case WM_RBUTTONDOWN:;
			TrackMenuPoint.x = LOWORD(lParam);
			TrackMenuPoint.y = HIWORD(lParam);
			ClientToScreen(hWnd, &TrackMenuPoint);
			TrackPopupMenu(hMenuPopup, TPM_RIGHTBUTTON, TrackMenuPoint.x, TrackMenuPoint.y, 0, hWndMain, 0);
			break;
		case WM_DESTROY:
			for(i = 0; i < MAXLCDNUM; i++){
				if(hWnd == LCD_aWinData[i].lcd_hwnd){
					LCD_aWinData[i].lcd_hwnd = 0;
					LCD_aWinData[i].TimerID = 0;
					break;
				}
			}
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

LRESULT CALLBACK LogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
//	char buf[500];
//	HWND log_edit = NULL;
	RECT rt;

	switch (message)
	{
		case WM_INITDIALOG:
			{
			//	SetWindowPos(hDlg, 0, 0, LOG_y0, 50, wndWidth, 0);
				GetWindowRect(hWndMain, &rt);
				//MoveWindow(hDlg, rt.left, rt.top+LOG_y0, wndWidth, 150, 1);
                MoveWindow(hDlg, rt.left, rt.bottom-10, wndWidth, 150, 1);
				LOG_hWnd = GetDlgItem(hDlg, IDC_EDITLOG);
				GetWindowRect(hDlg, &rt);
				MoveWindow(LOG_hWnd, 0, 0, rt.right - rt.left-5, rt.bottom - rt.top-30, 1);
				if(LOG_hWnd)	SetWindowText(LOG_hWnd, (LPCTSTR)LOG_acBuffer);
				return TRUE;
			}

		case WM_COMMAND:
			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			break;
		case WM_SIZE:
			GetWindowRect(hDlg, &rt);
			MoveWindow(LOG_hWnd, 0, 0, rt.right - rt.left-5, rt.bottom - rt.top-30, 1);
			break;
		case WM_DESTROY:
			LOG_hWnd  = 0;
	}
    return FALSE;
}
#define MotionLogWin_YSIZE 150
//显示Motion 的Debug 内容
LRESULT CALLBACK MotionLogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{

    RECT rt;

    switch (message)
    {
    case WM_INITDIALOG:
        {
            //ShowWindow(hDlg,SW_SHOW);
            //	SetWindowPos(hDlg, 0, 0, LOG_y0, 50, wndWidth, 0);
            GetWindowRect(hWndMain, &rt);
            //MoveWindow(hDlg, rt.left, rt.top+LOG_y0, wndWidth, 150, 1);
            MoveWindow(hDlg, rt.left, rt.bottom, wndWidth, MotionLogWin_YSIZE, 1);//窗口位置
            hWnd_MotionLog = GetDlgItem(hDlg, IDC_MotionLog);
            GetWindowRect(hDlg, &rt);
            MoveWindow(hWnd_MotionLog, 0, 0, rt.right - rt.left-5, rt.bottom - rt.top-30, 1); //内部打印窗口位置
            if(hWnd_MotionLog)	SetWindowText(hWnd_MotionLog, (LPCTSTR)"Motion Debug Log");
            return TRUE;
        }

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        break;
    case WM_SIZE:
        GetWindowRect(hDlg, &rt);
        MoveWindow(hWnd_MotionLog, 0, 0, rt.right - rt.left-5, rt.bottom - rt.top-30, 1);
        break;
    case WM_DESTROY:
        hWnd_MotionLog  = 0;
    }
    return FALSE;
}
//显示MainTask 的Debug 内容
LRESULT CALLBACK MainTaskLogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{

    RECT rt;

    switch (message)
    {
    case WM_INITDIALOG:
        {
            //ShowWindow(hDlg,SW_SHOW);
            //	SetWindowPos(hDlg, 0, 0, LOG_y0, 50, wndWidth, 0);
            GetWindowRect(hWnd_MotionLog, &rt);
            //MoveWindow(hDlg, rt.left, rt.top+LOG_y0, wndWidth, 150, 1);
            MoveWindow(hDlg, rt.left, rt.bottom, wndWidth, MotionLogWin_YSIZE, 1);//窗口位置偏置于MotionLogProc
            hWnd_MainTaskLog = GetDlgItem(hDlg, IDC_MainTaskLog);
            GetWindowRect(hDlg, &rt);
            MoveWindow(hWnd_MainTaskLog, 0, 0, rt.right - rt.left-5, rt.bottom - rt.top-30, 1); //内部打印窗口位置
            if(hWnd_MainTaskLog)
            {
                //SendMessage(hWnd_MainTaskLog,LB_ADDSTRING,0,(LONG)"MainTask  Debug Log");//SetWindowText(DispHWin, (LPCTSTR)LogBuffer);
                SetWindowText(hWnd_MainTaskLog, (LPCTSTR)"MainTask  Debug Log");
            }
            return TRUE;
        }

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        break;
    case WM_SIZE:
        GetWindowRect(hDlg, &rt);
        MoveWindow(hWnd_MainTaskLog, 0, 0, rt.right - rt.left-5, rt.bottom - rt.top-30, 1);
        break;
    case WM_DESTROY:
        hWnd_MainTaskLog  = 0;
    }
    return FALSE;
}
#define HALSHMDispWin_XSize  200

#define HALSHMDispWin_YSize  300

LRESULT CALLBACK HALSHMDispProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{

    RECT rt;

    switch (message)
    {
    case WM_INITDIALOG:
        {
            //ShowWindow(hDlg,SW_SHOW);
            //	SetWindowPos(hDlg, 0, 0, LOG_y0, 50, wndWidth, 0);
            GetWindowRect(hWndMain, &rt);
            //MoveWindow(hDlg, rt.left, rt.top+LOG_y0, wndWidth, 150, 1);
            MoveWindow(hDlg, rt.right, rt.top, HALSHMDispWin_XSize, rt.bottom-rt.top, 1);
            HWnd_MotionDisp = GetDlgItem(hDlg, IDC_MotionDisp);
            GetWindowRect(hDlg, &rt);
            MoveWindow(HWnd_MotionDisp, 0, 0, rt.right - rt.left-5, rt.bottom - rt.top-30, 1);
            if(HWnd_MotionDisp)
            {
                //SendMessage(hWnd_MainTaskLog,LB_ADDSTRING,0,(LONG)"MainTask  Debug Log");
                SetWindowText(HWnd_MotionDisp, (LPCTSTR)"Moton HAL Data Disp");
            }
            //SetTimer(hDlg, 1, 2000, NULL);
            return TRUE;
        }
//    case WM_TIMER:
        //        UpDataHALDisp();
        //        break;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        break;
    case WM_SIZE:
        GetWindowRect(hDlg, &rt);
        //MoveWindow(hWnd_MainTaskLog, 0, 0, rt.right - rt.left-5, rt.bottom - rt.top-30, 1);
        break;
    case WM_DESTROY:
        HWnd_MotionDisp  = 0;
        break;
    }
    return FALSE;
}

// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	char buf[500];
	switch (message)
	{
		case WM_INITDIALOG:
			{
				sprintf(buf, "About %s", BRANDING_GetAppNameLong());
				SetWindowText(hDlg, buf);
				SetDlgItemText(hDlg, ID_ABOUT_APPC, BRANDING_GetAppNameShort());
				//SetDlgItemText(hDlg, ID_ABOUT_VERSION, GUI_GetVersionString());
				SetDlgItemText(hDlg, ID_ABOUT_COPYRIGHT, BRANDING_GetCopyright());
				return TRUE;
			}

		case WM_COMMAND:
			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}


int VirtKey2Key(int nVirtKey)
{
	int key = 0, i  = 0;
	for(i  = 0; i < VKEYNUM; i++)
	{
		if(aVKey2Key[i].VirCode == nVirtKey){
			return aVKey2Key[i].key;
		}
	}
	return key;
}

int Keydown2ASCII(int nVirtKey)
{
	int key = 0, ret = -1;
	char allKeyState[258];
	GetKeyboardState(allKeyState);
	ret = ToAscii(nVirtKey, MapVirtualKey(nVirtKey, 0), allKeyState, (LPWORD)&key, 0);
	if(ret == 1) return key;
	return key | nVirtKey;
}
int _KEY_;
int _keyCount_ = 0;
//VK_LEFT VK_SHIFT
void HandleKeyEvents(UINT message, WPARAM wParam)
{
	int key = 0, keyCount = 0;
	switch(message){
	case WM_KEYDOWN:
		key = VirtKey2Key(wParam);
		if(key == 0) key = Keydown2ASCII(wParam);
		keyCount = 1;
		break;
	case WM_KEYUP:
		key = VirtKey2Key(wParam);
		keyCount = 0;
		break;
	}
	if(key != 0){
        //GUI_StoreKeyMsg(key, keyCount);
        _KEY_ = key;
        _keyCount_ = keyCount;
    }

}
int GUI_GetKey(void)
{
    if(0 != _keyCount_){
        _keyCount_ = 0;
        return _KEY_;        
    }else{
        return 0;
    }
}

void MainWnd_OnTimer(HWND hWnd)
{
	char MainWndTitle[200] = "(Executing)";
	static char newMainWndTitle[200];
	static int hasgetCaption = 0;
	if(hasgetCaption++ == 0){
		GetWindowText(hWnd, newMainWndTitle, 100);
	}
	sprintf(MainWndTitle, "%s %s", newMainWndTitle, "(Executing)");
	SetWindowText(hWnd, MainWndTitle);
}

//WM_PAINT wParam在菜单消息当中即为菜单标志ID..
void MainWnd_Command(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId = 0, wmEvent = 0;
    HWND hdlg;
    long erro=0;
	switch(message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		case IDM_NEWLCD:
			CreateWndLCD();
			break;
		case IDM_LOG:
			CreateDialogParam(hInst, (LPCTSTR)IDD_LOG, hWnd, (DLGPROC)LogProc, 0);
			break;
        case IDM_MotionLog:
            hdlg = CreateDialog(hInst, (LPCTSTR)IDD_MotionLog, hWnd, (DLGPROC)MotionLogProc);
            erro = GetLastError();
            break;
        case IDM_MainTaskLog:
            hdlg = CreateDialog(hInst, (LPCTSTR)IDD_MainTaskLog, hWnd, (DLGPROC)MainTaskLogProc);
            erro = GetLastError();
            break;
		case IDM_PAUSEAPP:
			THREAD_StopApplication();
			InitMenu(hMenuPopup);
			break;
		case IDM_RESUMEAPP:
			THREAD_ContinueApplication();
			InitMenu(hMenuPopup);
			break;
		case IDM_COPYCLIP:
			break;
		case 32774:
			THREAD_StartApplication();
			break;
		default:
			break;
		}
	}
}


///////////////////////////////////////////////////////////////////////
//
// 函数名       : MainWnd_Paint
// 功能描述     : 在模拟器主窗口当中画MICRIUM的标志[画于窗口中心处]...
// 参数         : HWND hwnd
// 返回值       : void
//
///////////////////////////////////////////////////////////////////////
void MainWnd_Paint(HWND hwnd, HDC hdc)
{
/* 2005-6-7 1:45:24
	HDC			hdc, hMemdc;
	PAINTSTRUCT	ps;*/
	HDC			hMemdc;
	RECT		rt;

	int			logo_x = 0, logo_y = 0;
	BITMAP		logobmpinfo;
	int			blt = 0;
	HBITMAP		logoBmp = 0;

/* 2005-6-7 1:45:29
	InvalidateRect(hwnd,NULL,FALSE);		//此句不可丢,否则无法显示出要画的位图...
	hdc = BeginPaint(hwnd, &ps);*/
	hMemdc = CreateCompatibleDC(hdc);
	GetClientRect(hwnd, &rt);
	logoBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_LOGO));
	GetObject(logoBmp, 0x18, &logobmpinfo);
	logo_x = (rt.right - logobmpinfo.bmWidth - rt.left)/2;
	logo_y = (rt.bottom - logobmpinfo.bmHeight - rt.top)/2;
	SelectObject(hMemdc, hLogo);
	blt = BitBlt(hdc, logo_x, logo_y, logobmpinfo.bmWidth, logobmpinfo.bmHeight, hMemdc, 0, 0, SRCCOPY);
	DeleteObject(logoBmp);
	DeleteDC(hMemdc);
//	EndPaint(hwnd, &ps);
}

#include "mmsystem.h"
void main(void);

int APIENTRY	WinMain_NoClean(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	int ret = 0;
	HWND hWnd;

⌨️ 快捷键说明

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