📄 emwin.c
字号:
{
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;
}
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;
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_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;
MSG msg;
HACCEL hAccelTable;
MessageBoxOnError = 0; //错误消息不弹出对话框,只记入LOG文档...
timeStartup = timeGetTime();
RegisterClasses(hInstance); //注册所有窗口要用到的窗口类...
hLogo = LoadImage(hInstance, (LPCTSTR )IDB_LOGO, 0, 0, 0, 0); //加载所有用的位图与图标...
ahBmpDevice = LoadImage(hInstance, (LPCTSTR )IDB_DEVICE, 0, 0, 0, 0);
if(ahBmpDevice == 0) ahBmpDevice = LoadImage(hInstance, (LPCTSTR )"Device.bmp", 0, 0, 0, 0);
ahBmpDevice2 = LoadImage(hInstance, (LPCTSTR )IDB_DEVICE2, 0, 0, 0, 0);
if(ahBmpDevice2 == 0) ahBmpDevice2 = LoadImage(hInstance, (LPCTSTR )"Device1.bmp", 0, 0, 0, 0);
hMenuPopup = LoadMenu(hInstance, (LPCSTR)IDC_POPEMWIN);
hMenuPopup = GetSubMenu(hMenuPopup, 0);
LOG_y0 = LCD_GetYSize() * LCD_GetYMag() + 0x1E;
wndHeight = LOG_y0 - 0x1e + 0x96;
wndWidth = LCD_GetXSize() * LCD_GetXMag() + 0xFA;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindowEx(0, SimClassName[SimulationMainframe], szTitle, 0x2CF0000,
CW_USEDEFAULT, 0, wndWidth, wndHeight, NULL, NULL, hInstance, NULL);
/* 2005-5-29 1:20:56
hWnd = CreateWindow(SimClassName[SimulationMainframe], szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
*/
if (!hWnd) return ret;
hWndMain = hWnd;
(char*)ret = LCDSIM_Init();
if(ret !=0){
MessageBox(hWnd, (char*)ret, BRANDING_GetAppNameShort(), 0);
return 1;
}
if(LCD_GetNumDisplays() > 1){
// LCDSIM_1_Init();
}
if(!ret) CreateWndLCD();
THREAD_StartApplication();
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_EMWIN);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
//TranslateAccelerator FCONTROL
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
THREAD_KillAll();
return 0;
}
int FindFreeLCDIndex()
{
int i = 0;
for(i = 0; i < MAXLCDNUM; i++)
{
if(LCD_aWinData[i].lcd_hwnd == 0) return i;
}
return -1;
}
///////////////////////////////////////////////////////////////////////
//
// 函数名 : CreateWndLCD
// 功能描述 : 创建一个模拟LCD窗口, 最大创建16个....
// 返回值 : void
//
///////////////////////////////////////////////////////////////////////
void CreateWndLCD()
{
int LCD_xPos = 0, LCD_yPos = 0;
int LCDIndex = 0;
HWND LCDHwnd = 0;
memset(LCDCaption, 0, 200);
memset(LCDCaption2, 0, 200);
LCDIndex = FindFreeLCDIndex();
if(LCDIndex >= 0){
LCDWidth = LCD_GetXSize() * LCD_GetXMag();
LCDHeight = LCD_GetYSize() * LCD_GetYMag();
wsprintf(LCDCaption, "LCD %d*%d %dbpp, FixedPalette %d", LCDWidth, LCDHeight, LCD_GetBitsPerPixel(), LCD_GetFixedPalette());
LCDWidth += GetSystemMetrics(SM_CXFRAME) * 2;
LCDHeight += GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME) * 2;
LCD_xPos = LCDIndex * 10; //每一个新开的窗口X坐标间距为10象素...
LCD_yPos = 0;
LCDHwnd = CreateWindowEx(0, SimClassName[LCD], LCDCaption, 0x44CF0000,
LCD_xPos, LCD_yPos, LCDWidth, LCDHeight, hWndMain, NULL, hInst, NULL);
LCD_aWinData[LCDIndex].lcd_hwnd = LCDHwnd;
LCD_aWinData[LCDIndex].TimerID = 0;
ShowWindow(LCDHwnd, SW_SHOW);
}
else{
//创建Create lcd1...
if(LCD_GetNumDisplays() <= 1) return;
LCDWidth2 = LCD_GetXSize_1();
LCDHeight2 = LCD_GetYSize_1();
wsprintf(LCDCaption, "LCD %d*%d %dbpp, FixedPalette %d", LCDWidth, LCDHeight, LCD_GetBitsPerPixel_1(), LCD_GetFixedPalette_1());
LCDWidth2 += GetSystemMetrics(SM_CXFRAME) * 2;
LCDHeight2 += GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME) * 2;
LCD_xPos = LCDIndex * 10; //每一个新开的窗口X坐标间距为10象素...
if(LCD_xPos < 0) LCD_xPos = 0;
LCD_yPos = 0;
LCDHwnd = CreateWindowEx(0, SimClassName[LCD1], LCDCaption2, 0x54CF0000,
LCD_xPos, LCD_yPos, LCDWidth, LCDHeight, hWndMain, NULL, hInst, NULL);
}
//SM_ARRANGE LCD_GetNumDisplays
}
int SIM_SetMag(int simmag)
{
int Oldsimmag = Mag;
Mag = simmag;
return Oldsimmag;
}
int SIM_GetTime()
{
return timeGetTime()-timeStartup;
}
void SIM_Delay(int delaytime)
{
THREAD_Sleep(delaytime);
}
void SIM_ExecIdle()
{
THREAD_Sleep(1);
}
void SIM_StoreKey(int key)
{
if(KeyBuffer != 0) return;
KeyBuffer = key;
}
int SIM_GetKey()
{
char temp = KeyBuffer;
if(KeyBuffer == 0) return 0;
KeyBuffer = 0;
return temp;
}
//返回已经开启的任务数...
void SIM_Start()
{
int i = 0;
if(NumTask > 0){
while(i < NumTask){
SetThreadPriority(ahThread[i++], 0xfffffffe);
ResumeThread(ahThread[i-1]);
}
}
for(;;) Sleep(DELAYEVERYTIME); //此处为开启多任务支持, 其所在线程即为MainTask函数所在线程,
//为gui图形应用程序主线程...
}
void THREAD_Sleep(int delaytime)
{
if(delaytime <= 0) return;
CmdKill:
if(CmdKill == 0){
Sleep(DELAYEVERYTIME);
if(delaytime--) goto CmdKill;
else return;
}
SetThreadPriority(ghThread, THREAD_PRIORITY_HIGHEST); //THREAD_PRIORITY_HIGHEST
ghThread = 0;
ExitThread(0);
}
void THREAD_KillAll()
{
int delaycount = 0;
do{
if(ghThread == 0) break;
CmdKill = 1;
while(delaycount++ <= 14){
Sleep(DELAYEVERYTIME);
if(ghThread == 0) break;
}
if(ghThread == 0) break;
TerminateThread(ghThread, 0);
}while(0);
ghThread = 0;
CmdKill= 0;
}
void THREAD_StartApplication()
{
OutputDebugString(SimStatusString[started]);
if(ghThread != 0) THREAD_KillAll();
ghThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Thread, 0, 0, 0);
SuspendCount = 0;
}
void Thread()
{
main();
// ghThread = 0;
OutputDebugString(SimStatusString[terminated]);
//LogTime();
//LOG_Add();
}
void THREAD_StopApplication()
{
int i = 0;
OutputDebugString(SimStatusString[suspended]);
if(SuspendCount !=0){
MessageBox(hWndMain, SimStatusString[paused], BRANDING_GetAppNameShort(), 0);
return;
}
if(ghThread == 0){
MessageBox(hWndMain, SimStatusString[notrunning], BRANDING_GetAppNameShort(), 0);
return;
}
SuspendCount = SuspendThread(ghThread)+1;
if(NumTask <= 0) return;
while(i < NumTask) SuspendThread(ahThread[i++]);
// while(NumTask) SuspendThread(ahThread[NumTask--]);
}
void THREAD_ContinueApplication()
{
int i = 0;
OutputDebugString(SimStatusString[continued]);
if(SuspendCount ==0){
MessageBox(hWndMain, SimStatusString[notstopped], BRANDING_GetAppNameShort(), 0);
return;
}
if(ghThread == 0){
MessageBox(hWndMain, SimStatusString[notrunning], BRANDING_GetAppNameShort(), 0);
return;
}
SuspendCount = ResumeThread(ghThread) - 1;
if(NumTask <= 0) return;
while(i < NumTask) ResumeThread(ahThread[i++]);
// while(NumTask) ResumeThread(ahThread[NumTask--]);
}
void SIM_CreateTask(char * pName, void * pFunc, unsigned char Priority)
{
//CREATE_SUSPENDED
if(NumTask <= TOTAL_TASK-1){
ahThread[NumTask-1] = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)CreateTask, (LPVOID)pFunc, CREATE_SUSPENDED, (LPDWORD)&aThreadID[NumTask++]);
}
}
void CreateTask(void * pFunc)
{
__asm jmp pFunc;
}
int SIM_HARDKEY_GetNum(void)
{
return NumHardkeys;
}
int SIM_HARDKEY_GetState(unsigned int i)
{
if(i >= MAXKEY) return 0;
return aHardkey[i].keystate;
}
SIM_HARDKEY_CB* SIM_HARDKEY_SetCallback(unsigned int KeyIndex, SIM_HARDKEY_CB* pfCallback)
{
SIM_HARDKEY_CB* oldpfCallback = 0;
if(KeyIndex >= MAXKEY) return 0;
oldpfCallback = aHardkey[KeyIndex].keyrpoc;
aHardkey[KeyIndex].keyrpoc = pfCallback;
return oldpfCallback;
}
int SIM_HARDKEY_SetMode (unsigned int KeyIndex, int Mode)
{
int oldekeymode = 0;
if(KeyIndex >= MAXKEY) return 0;
oldekeymode = aHardkey[KeyIndex].keymode;
aHardkey[KeyIndex].keymode = Mode;
return oldekeymode;
}
int SIM_HARDKEY_SetState(unsigned int KeyIndex, int State)
{
int oldkeystate = 0;
if(KeyIndex >= MAXKEY) return 0;
oldkeystate = aHardkey[KeyIndex].keystate;
aHardkey[KeyIndex].keystate = State;
return oldkeystate;
}
//日志LOG记录
void SIM_Log(const char *s)
{
OutputDebugString(s);
}
/* 2005-6-4 13:33:32
void SIM_Log1(const char *s, int p0);
void SIM_Log2(const char *s, int p0, int p1);
void SIM_Log3(const char *s, int p0, int p1, int p2);
void SIM_Log4(const char *s, int p0, int p1, int p2,int p3);
*/
void SIM_Warn(const char *s)
{
OutputDebugString(s);
}
/* 2005-6-4 13:33:42
void SIM_Warn1(const char *s, int p0);
void SIM_Warn2(const char *s, int p0, int p1);
void SIM_Warn3(const char *s, int p0, int p1, int p2);
void SIM_Warn4(const char *s, int p0, int p1, int p2, int p3);
*/
void SIM_ErrorOut(const char *s)
{
OutputDebugString(s);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -